Unity をすぐに使い始める [Unity エディター、コンポーネントの一部のプロパティを制御するための C# スクリプトなどに精通している]


Unity 学習リファレンス ドキュメントと開発ツール

☺ Unity の公式 Web サイトのドキュメント: https://docs.unity3d.com/cn/current/Manual/ScriptingSection.html

■学習方法:

まず Unity の概要を理解し、Unity エディターについてすぐに理解してから、ゲーム オブジェクト、コンポーネント | C# スクリプト、プレハブ、UI の学習に集中します。

学習プロセス中に、実際には Unity は主に C# で開発されていることがわかります。

因为在这个过程中,无非就是,对游戏对象通过挂载的C#脚本,修改一下组件的一些属性,控制一下激活之类的操作。到了UGUI,同样,也是通过挂载的C#脚本,监听到事件发生后,调用一下C#脚本定义的方法处理一下事件。

  • Unity クイック スタート ドキュメント: https://learn.unity.com/tutorial/she-zhi-3d-beginner?uv=2020.3&projectId=5dfa9a5dedbc2a26d1077ca8
  • ビデオ [すぐに始めるには、ビデオに従って開始することをお勧めします]: https://www.bilibili.com/video/BV1gQ4y1e7SS/
  • ★主な学習内容: ゲームオブジェクト、コンポーネント | C# スクリプト、プレハブ、UI [GUI]

■ 開発ツール:

ユニティ、ビジュアルスタジオ



1.Unityの概要

(1) Unityとは

Unity は、完全なシステムとエディターを備えたクロスプラットフォーム ゲーム開発ツールのセットです。ゲーム エンジンとも呼ばれます。ゲーム エンジンとは、ゲームの開発に使用されるいくつかの書かれた再利用可能なコードとさまざまな機能エディターを指します。Unity には現在、以上のものがあります。ゲームエンジンの市場シェアは50%。

ゲームエンジン = 再利用可能なコード + さまざまな開発ツール


(2) Unityエンジンのメリット

易上手、高安全性1. C#プログラミングに基づいており、特徴があります

2. ユニークな面向组件ゲーム開発アイデアにより、ゲーム開発が簡単かつ再利用しやすくなります

3. 非常に成熟した所见即所得开发编辑器

4. 所有されている良好生态圈モールには、成熟した機能的なスクリプトとリソースが多数含まれています

5.強力なクロスプラットフォーム機能により、PC、ホスト、携帯電話、AR、VR、その他のマルチプラットフォームゲームを作成できます


2、ユニティハブ

Unity プロジェクトの管理: コンピューター上に Unity のバージョンが異なる複数のプロジェクトがある場合、管理はさらに面倒ですが、Unity ハブを介してさまざまな Unity ハブ プロジェクトを管理できます。



3. Unity エディターについて知る


(1) Unity はデフォルトのウィンドウを復元します: Windows -> レイアウト -> デフォルト


(2) プロジェクトの設定

  • 含まれるもの: 物理、サウンド、品質、エディタ設定など


(3) グローバル設定

  • エディターの共通設定


  • 拡張ツール、Visual Studio で開くようにスクリプトを設定する


(4) Unityメニューバーの紹介

■ ファイル File: ファイル全般の操作 [プロジェクト/シーンの作成、保存など、およびプロジェクトのパッケージ化]

■ 編集 編集:コピー、切り取り、貼り付けなどの操作

■ アセット: [スクリプト、シーン、アニメーションなど] の作成、インポートおよびエクスポートなど。

■ ゲームオブジェクト GameObject: 実際にゲームシーンに表示されます。

■ コンポーネント: Unity はコンポーネント指向であるため、非常に重要です。

  • コンポーネントとゲーム オブジェクトは分離できず、複数のコンポーネントをゲーム オブジェクトにアタッチできます


■ 2D シーンと 3D シーンの切り替え:

  • 2D をクリックすると 3D シーンになります


(5) Unity プロジェクトの操作は、単一のゲーム オブジェクトではなく、シーン全体を実行することです。

  • 操作単位はシーンです!



4. ゲームオブジェクトに対する共通操作

(0) トランスフォーム属性に関する操作用ツールバー


(1)ストレッチ

  • 000にリセット


(2) レイヤー内のゲームオブジェクトの表示/非表示を切り替える


(3) ゲームオブジェクトのメッシュ形状を見る

  • 観察を容易にするために、通常は Shaded Wireframe が選択されます。


(4) ゲームオブジェクトを選択します: マウスでクリックするだけです


(5) 右クリック - アイサラウンド


(6) ハンド モードでは、マウス ホイールと組み合わせて、ドラッグして距離を調整したり、観察のために近づけたりできます。

  • ハンドモードに入り、ショートカットし、マウスホイールを直接押し続けます

  • 右クリックによる目のサラウンドと同様に、両方ともゲーム オブジェクトの全体的な観察を向上させるためのものです。


(7) 親子ゲームオブジェクト、親ゲームオブジェクトの座標は子ゲームオブジェクトの座標も一緒に変化します

  • ゲーム オブジェクト、作成後のデフォルトの座標位置。デフォルトの位置はワールド座標位置を基準としており、ワールド座標位置と呼ばれます。
  • ゲーム オブジェクトが別のゲーム オブジェクトの子ゲーム オブジェクトになる場合、その座標は相対位置 - [親ゲーム オブジェクトに対する相対位置] となり、相対位置と呼ばれます。

  • 最も外側のゲームオブジェクト


  • 親子ゲーム オブジェクトの座標軸の位置については、親の座標軸の位置はデフォルトで親子ゲーム オブジェクトの中央になります。

  • それを軸として設定し、親の座標位置を親ゲームオブジェクトに戻すことができます


  • 座標軸、グローバルは世界座標用です


(8) Unityのパッケージ化作業

  • 画像、モデル ファイル [拡張子は .fbx]、その他のマテリアルを Unity にパックします

  • パッケージ化されたファイルの種類は Unity パッケージ ファイルです


(9) ラベルとレイヤー

  • タグ: 通常、ゲーム オブジェクトが必要なゲーム オブジェクトであるかどうかを判断するためにコード内で使用されます。
  • レイヤー:Unityが作った分類の一種で、分類後、カメラはこのレイヤーを表示しない、コリジョンの場合はこのレイヤーは衝突できないなど、カメラをフィルタリングして表示することができます。



5. コンポーネント

(1) コンポーネントとは

コンポーネントは関数です。ゲーム オブジェクトに関数を追加する必要がある場合は、コンポーネントを追加するだけで済みます。

Unity では、ゲーム オブジェクトには機能がありません。これに機能を追加するには、その機能を持つコンポーネントを追加する必要があり、各コンポーネントは実際には1 つ引擎内部的组件脚本以上自己编写的组件脚本の です。つまり、ゲーム オブジェクト (GameObject) には複数のコンポーネント (Component) が含まれており、各コンポーネントはコンポーネント スクリプトです。

  • たとえば、ゲーム オブジェクトに重力コンポーネントを追加すると、ゲーム オブジェクトは落下します。
  • 別の例: 変換もコンポーネントです。
  • 別の例: ライトがライトである理由は、他のライト コンポーネントよりも 1 つ多くのライト コンポーネントがあるためです。実際、ゲーム オブジェクトにはデフォルトでいくつかのコンポーネントが付属しており、たとえば、立方体には立方体コンポーネントが付属し、ボールにはボール コンポーネントが付属します。
  • ゲームオブジェクト(レイヤーの外層)がスクリプトに相当しますが、必要な機能[コンポーネント]が存在しない場合は、スクリプトを自分で書く必要があります。

(2) C# スクリプトを手動で作成する

  • C# スクリプトをプロジェクトに手動で追加する

  • 添加上脚本

各ゲーム オブジェクトの動作が異なる理由は、それらにバインドされているコンポーネント スクリプトが異なるためです。


(3) コンポーネントのライフサイクル

  • Awake から OnDestroy まで:
  • Awake後はOnEnaleを起動し、Startを開始します。
  • 変更:Update-LateUpdateをフレーム単位で変更、FixedUpdateを固定時間頻度で変更
  • OnDisable の非アクティブ化: と OnEnable のアクティブ化はペアです
  • 最後に、コンポーネントが削除されると、OnDestroy が実行されます。

▪ OnEnale をアクティブ化し、OnDisable を非アクティブ化します。


■ スクリプトライフサイクルの実行シーケンス

  • 複数のスクリプトがある場合、test1.cs、test2.cs、test3.cs

  • スクリプトの実行順序は次のとおりです。test1.cs、test2.cs、test3.cs のすべての Awake メソッドを実行したい [Awake メソッドを手動で記述する必要がある場合!] ]、次に test1.cs から test2.cs、そして最後に test3.cs に進み、次のライフ サイクルを実行します - OnEanale をアクティブ化します [OnEanale メソッドが手動で記述されている場合! ]、次に test1.cs から test2.cs、最後に test3.cs に進み、次のライフサイクルを実行します。

    ▷ 現在のライフサイクルは Awake から始まり、プロジェクト内の最初のスクリプトから最後のスクリプトまで毎回実行されます。

    ▷ 次に、次のライフ サイクルに入ると、プロジェクト内の最初のスクリプトから最後のスクリプトまで、すべてのスクリプトが現在のライフ サイクルを実行します。

  • プロジェクト内のスクリプト間のライフサイクルの実行順序を変更したい場合は、[編集]->[プロジェクト設定]->[スクリプト実行順序]で設定できます。

    • 追加された順序が間違っています。変更するにはドラッグ アンド ドロップするだけです



6. プレハブとバリアント

(1) プレハブとは何ですか?

実際、これはシーンで行われたこと [独立したゲーム オブジェクト] をプレハブ [ファイルの生成] にカプセル化することを意味します。

  • プレハブの接尾辞は .prefab です。

(2) プレハブボディの利点:


(3) プレハブとシーン ゲーム オブジェクトの違い:

① プレハブを直接変更すると、シーン内のゲームオブジェクトも同時に変更されます。ただし、シーン内のゲーム オブジェクトのみが直接変更された場合、プレハブは変更されません。

  • プレハブ本体に直接ぶら下がっているコンポーネントを含め、シーン内のゲーム オブジェクトは同期してマウントされます。

②シーン内のゲームオブジェクトを変更したい場合、プレハブも同時に変更されます。

  • 「開く」モードを選択します

③ シーン内のゲーム オブジェクトにはコンポーネントがマウントされており、同時にプレハブ ボディにマウントしたいと考えています。

  • シングルマウント:

  • バッチ マウント: バッチでプレハブにオーバーライドを適用します


(4) シーン内のゲームオブジェクトからプレハブを素早く選択


(5) バリエーション

プレハブ バリアント: 古いプレハブに依存する、現在のゲーム オブジェクトのバリアントを生成します。
古いプレハブが変更されると、バリアントもそれに合わせて変更されます。しかし、バリアントは変わりますが、プレハブは変わりません。



7. ゲームオブジェクトのプロパティを動的に変更する

(1) ゲームオブジェクトとマウントされた C# スクリプトの関係:


(2) C# スクリプトのクラスにプロパティ オブジェクトを追加し、そのプロパティ オブジェクトを Unity ゲーム オブジェクトに関連付けます


(3) プレハブを通じて、シーン内でゲームオブジェクトをインスタンス化します。

  • 結果 1:


  • 結果 2:


■ EmptyTest.cs の内容は次のとおりです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/**
 * EmptyTest 类是绑定在场景SamepleScene下的游戏对象Empty身上
 * 补充,课外小知识,C#的 Debug.Log 方法,其实就是相当于 前端项目的 console.log 方法,也就是开发过程中用于打印日志的
 */
public class EmptyTest : MonoBehaviour
{
    public GameObject Cube;
    //预制体
    public GameObject Prefab;


    // Start is called before the first frame update
    void Start()
    {
        //当前类的属性gameObejct就对应了unity当前脚本所绑定的游戏对象
        GameObject gameObject = this.gameObject;
        Debug.Log("gameObject: " + gameObject);
        Debug.Log("gameObject的名称:" + gameObject.name);
        Debug.Log("gameObject的标签:" + gameObject.tag);
        Debug.Log("gameObject的图层:" + gameObject.layer);
        Debug.Log("Empty下的Cude的name:" + Cube.name);//子物体的名称
        Debug.Log("Empty下的Cude的继承的父类的激活状态:" + Cube.activeInHierarchy);//子物体继承关系的激活状态【看所继承的父物体的激活状态】
        Debug.Log("Empty下的Cude的自身的激活状态:" + Cube.activeSelf);//子物体自身的激活状态
        Debug.Log("Empty的transform:" + transform.position);//位置
        Debug.Log("Empty下的Cude的transform:" + transform.Find(Cube.name).position);//位置
        //给游戏对象添加上组件,通过拿到游戏对象.AddComponent方法
        gameObject.AddComponent<MeshFilter>();
        Cube.AddComponent<AudioSource>();
        //获取其他组件【这个其他组件,其实就是排除掉Transform这个必须的组件后的其他组件】
        Debug.Log("Empty获取其他组件:" + GetComponent<BoxCollider>());
        Debug.Log("Cube获取其他组件:" + Cube.GetComponent<BoxCollider>());
        //从子物体身上获取组件
        // GetComponentInChildren<BoxCollider>();
        //从父物体身上获取组件
        //GetComponentInParent<BoxCollider>();

        //全局查找--细节,就是首字母大写了,小写的是属性
        //所谓的全局查找,其实就是对当前的C#脚本所处的场景SamepleScene下进行全局查找 
        GameObject testGameObject = GameObject.Find("TestGameObject");
        //还可以通过标签名获取到游戏对象
        GameObject testGameObejct2 = GameObject.FindWithTag("enemy");
        Debug.Log("testGameObject:" + testGameObject);
        Debug.Log("testGameObject2:" + testGameObejct2);
        //还可以设置游戏对象是否激活
        testGameObject.SetActive(false);//取消激活

        //需求:通过预制体,在场景中实例化出游戏对象
        //预制体的类型也是GameObject
        // Instantiate(Prefab);
        // 实例化出游戏对象,并且是当前挂载了C#脚本的游戏对象的子物体
        GameObject capsule = Instantiate(Prefab, transform);
        // 销毁游戏对象
        Destroy(capsule);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

8. アプリケーションがファイルを読み書きするために必要なクラス

(1) アプリケーションがファイルを読み書きする


(2) アプリケーションには、バックグラウンドでのゲームの実行の制御、リンクのオープン、ゲームの終了などの権限を制御する機能もあります


9. ゲームシーン

■コアクラス - シーン管理クラス SceneManager: シーン作成、シーン切り替え | ロード、シーン取得、シーン番号、シーンアンロード関連


■ シーンに関する共通プロパティ: シーン名、シーンがロードされているかどうか、シーン パス、シーン インデックス、シーン内の独立したゲーム オブジェクト


■ シーンを非同期にロードして進行状況を取得する

  • コルーチン [実際にはマルチスレッドを支援するコルーチン] を使用して StartCoroutine (タスク);
  • Updateはフレームごとの変化を出力するため、進捗状況はUpdateで取得されます。


▷ タイマーによるシーンジャンプの制御:



10、変形

(1) 位置、回転、スケーリング、ベクトル


(2) 他の関係を変換する


(2)親子関係を変える

ゲームオブジェクトの親子関係は、実際には変換を通じて維持されます。




11. Unity GUI (略して UGUI)

GUI: グラフィカル ユーザー インターフェイス グラフィカル ユーザー インターフェイスまたはグラフィカル ユーザー インターフェイス。

  • GUI,是平面的,在2d下操作

  • UI でよく使用されるコントロール

  • 最も基本的な点では画布Canvas、UI は画面に相当します。

    • 最も基本的な UI はキャンバスであり、テキスト、画像、ボタンなどの他の UI コントロールは、キャンバスのサブコントロールとしてキャンバス上に配置されます。
  • UI の最も基本的な点は、UI事件系统EventSystemがクリック イベントなどの多くの一般的なイベントを実際にカプセル化していることです。


(1) キャンバス(画面に相当)

■ Canvas コンポーネントのレンダリング モードは通常、デフォルトで画面スペース カバレッジに設定されます。

  • カメラは実際のゲーム映像、3D 映像をキャプチャします。カメラでキャプチャされた画像が最初にレンダリングされます。
  • UIオーバーレイ:カメラで捉えた画像に重ねて表示されます。したがって、UIを常に最上位に表示することができます。
  • これは、UI がゲーム画面の上部に表示されるほとんどの実際のゲーム状況とも一致します。たとえば、バックパック インターフェイスやキャラクター属性インターフェイスを開いたときに、ゲーム シーン内の木などのオブジェクトで覆われてしまうことはできません。


■ Canvas コンポーネントのズーム モードは、通常、画面の解像度に応じて拡大縮小するように選択されます。

  • Canvas が調整されました。実際に有効にするには、Canvas の下の最初の層のサブコントロールも調整する必要があります。

  • 最初のレイヤーのサブコントロールが適応されます。

    • アンカーポイントは親オブジェクトに設定されます。

    • コントロール アンカー ポイントの役割: コントロールは常にアンカー ポイントから一定の距離を維持します。


(2) イベントバインディング: Button の UI を例に挙げます。

① Canvas 配下に UI-Button を追加し、プロジェクト配下に C# スクリプトを作成し、ボタンに C# スクリプトをマウントします。

②次にC#メソッドでクリックイベント発生時の処理メソッドBtnClick()を記述する

③最後に、Buttonコンポーネント配下のOn Click()にC#スクリプトと、クリックイベント発生時の処理メソッドBtnClick()を追加します。


(3) 管理UIコンポーネント - パネル パネル[レイアウト、配置、調整された軸点の位置など]


(4) 一般的な GUI UI [テキスト、ボタン、スライダーなど] の操作の詳細については、次の記事を参照してください。

  • 非常に詳細に書かれています - 「Unity の UGUI システムの基礎」: https://blog.csdn.net/qq_42898629/article/details/83504863




この記事が役に立った場合は、忘れずに Yile に「いいね!」を押してください。ありがとうございます。

おすすめ

転載: blog.csdn.net/weixin_45630258/article/details/130140670
おすすめ