1.13 0から学ぶUnityゲーム開発 - オブジェクトを動的に作成する

前の章では、シーンを編集し、エディターで直接ゲームオブジェクトを作成する方法を学びました。それが立方体であっても球であっても、コードを通じてシリアル化できるゲームオブジェクト変数を作成することもできます。これに参照を割り当てます。エディタパネルのオブジェクト。

しかし、明らかに、プログラマとして、そのようなメカニズムを使わずにオブジェクトを作成および操作する方法を知りたいと考えています。この操作は芸術的な創作には非常に役立ちますが、ゲーム内の一般的なモンスターのスポーンには動的な操作が必要であるなど、一部のビジネス ロジックにとっては困難です。ゲームロジックに基づいてモンスターを作成するため、シーン内で起こり得るすべての状況を編集することは不可能です。

次にこの章では、コードを通じてオブジェクトを動的に作成する方法と、コンポーネントでオブジェクトとロジックを管理する方法について説明します。

コードはゲームオブジェクトを動的に作成します

実際、GameObject を作成するコードは非常に簡単です。

GameObject myNewGameObject = new GameObject();

単純に新しいだけで十分です。前に作成した CameraController の Start 関数などのコンポーネントを見つけて、このコードを追加し、ゲームを実行して以下を確認します。

New Game Object と呼ばれるものがもう 1 つあることがわかります。もちろん、GameObject の名前を設定することで、それに名前を付けることができます。

GameObject myNewGameObject = new GameObject();
myNewGameObject.name = "Dynamic Game Object";

しかし、現在のオブジェクトはまだ空であり、何もありません。このオブジェクトにコンポーネントを追加したい場合、問題はありません。

GameObject myNewGameObject = new GameObject();
myNewGameObject.name = "Dynamic Game Object";
myNewGameObject.AddComponent<DemoTest>();

このようにして、コードを通じてオブジェクトのコンポーネントをリアルタイムで動的に追加できます。

GameObject を動的に作成するロジックは次のようになります。非常に単純明快ですか?

このゲームオブジェクトが必要ない場合は、忘れずに破棄してください。これは良い習慣です。

GameObject myNewGameObject = new GameObject();
myNewGameObject.name = "Dynamic Game Object";
myNewGameObject.AddComponent<DemoTest>();
Destroy(myNewGameObject);

その後、動的に作成されたゲームオブジェクトは破棄されます。

この Destroy 関数は UnityEngine.Object タイプに由来しており、どのコンポーネント クラスでも呼び出すことができることを意味します。もちろん、私が書いた純粋な C# クラスでも使用できますが、結局のところ、静的関数なので、Object.Destroy() に直接置き換えることができます。なお、C# System にも Object クラスが存在します。どちらを使用するかを指定しないと、System と UnityEngine を同時に使用する場合に競合します。どの Object クラスが必要かわかりません現時点では、すべてを記述する必要があります。

UnityEngine.Object.Destroy(myNewGameObject);

どちらを使用しているかを指定します。

using Object = UnityEngine.Object;

さらに、コンポーネントを GameObject に動的に追加し、コンポーネントを動的に削除する方法も Object.Destroy 関数で説明したので、次のようにします。

DemoTest newlyAddedComponent = myNewGameObject.GetComponent<DemoTest>();
UnityEngine.Object.Destroy(newlyAddedComponent);

これは実際に使用する際に非常に混乱しやすく、当初は GameObject を削除したかったのですが、コンポーネント クラスが渡されたため、コンポーネントが削除されてしまいました。

ここで、実際には、オブジェクトを動的に作成するには、大量のコードを記述し、新しいゲームオブジェクトを作成し、コンポーネントを 1 つずつ追加する必要があると想像できます。これは、UI インターフェイスを手動で作成するのと同じになります。 。明らかに、Unity はコンポーネント化された関数も提供します。テンプレートのようなものを作成しましょう。将来的には、多くのコードの繰り返しを避けるために、テンプレートの新しいインスタンスを直接作成できます。このテンプレートはプレハブと呼ばれます。

プレハブ

Prefab の翻訳はプレハブと呼ばれ、その名前が示すように、これは事前に作成されたオブジェクトであり、コードを記述し、この定義の各インスタンスをインスタンス化するときのクラスの定義に非常によく似ています。

では、プレハブを作成するにはどうすればよいでしょうか?

後で再利用するためにプレハブにする必要があるゲームオブジェクトがあると仮定して、まずシーン内に PrefabTest と呼ばれるそれを作成します。

次に、DemoTest コンポーネントの追加など、いくつかのコンポーネントを追加できます。

次に、上に示すようにそれを選択し、左ボタンを押したままプロジェクト ウィンドウ内の任意のディレクトリにドラッグします。もちろん、Prefab に保存するディレクトリを選択することもできます。

 

すると、Project ウィンドウに PrefabTest リソースがあり、アイコンが青い立方体になっていることがわかります。Hierarchy ウィンドウの PrefabTest も青い立方体のアイコンになっていることに注意してください。

ここでは 2 つのことが起こっています。

  1. シーン オブジェクトをプロジェクト ウィンドウにドラッグすると、Unity はシーン オブジェクトをプレハブに変換すると判断し、変換されたリソースがプロジェクト ウィンドウに表示されます。
  2. シーン内の元のオブジェクトは、このプレハブによって作成されたインスタンスに置き換えられます。

次に、プロジェクト ウィンドウで PrefabTest を選択しましょう。これは作成したコンテンツとまったく同じですが、なぜ Prefab と呼ばれるのでしょうか? DemoTest コンポーネントの値を変更してから、シーン内の PrefabTest の DemoTest コンポーネントの値を見てみましょう。プロジェクト ウィンドウ内の PrefabTest の変更が、シーン。

このようにして、プロジェクト ウィンドウの PrefabTest リソースが実際には私たちが理解しているクラスの定義であり、シーンはこの定義を使用してインスタンス化されたインスタンスであることが理解できます。

そうすれば、コードに精通した私たちは、1 つのインスタンスから他のケースを簡単に推測できるはずです。

  1. プロジェクト ウィンドウ内の PrefabTest リソースをシーンにドラッグ アンド ドロップできます。ドラッグ アンド ドロップごとに新しいインスタンスが作成されます。
  2. プロジェクト ウィンドウで PrefabTest リソースのデータを変更します。このデータは、シーン内で作成された各インスタンスに同期されます。
  3. インスタンス内の変更はインスタンスごとに独立しており、プロジェクト ウィンドウ内の PrefabTest リソース自体にはフィードバックされません。

プログラマはこれらの概念をクラスと同じように説明する必要はないと考えています。

実際、3 では、Unity はライトバック機能を提供します。これは、インスタンスの変更を親自体に書き戻すことができることを意味します。

たとえば、シーン内の PrefabTest インスタンスのデータを変更します。

ここでは、テスト値 1 を変更しました。左側に青いバーが表示され、この値がデフォルト値ではなく変更されたことを示します。テスト値 1 のラベルを右クリックすると、[適用先] が表示されます。プレハブ「PrefabTest」

クリックすると、テスト値 1=3 の値が変更され、それがプロジェクト ウィンドウの PrefabTest に書き込まれ、同時にシーンの PrefabTest の青いバーが消えます。

実際には、クラスの定義を変更する必要があります。

それは何の役に立つでしょうか?コードを書く際にはClass自体の定義を修正する必要があるのはもちろんですが、ゲーム開発をしているとクリエイティブな調整のため、用意されているプレハブのリソースを含め、さまざまな修正が必要になることがよくあります。シーン内で他のオブジェクトと一緒に効果を確認できるため、シーン内で調整して調整した後、このようなApply機能を使用して、元のPrefabリソースをより簡単に変更できます。

多くの場所で変更を行った場合は、インスペクターで「オーバーライド」を直接クリックしてすべての変更を表示し、バッチの取り消しまたはバッチの適用を実行できます。

もちろん、プロジェクト内のプレハブ自体を直接変更することもできます。プレハブ自体にコンテンツがある場合は、プレハブ リソースをダブルクリックして内部変更を開きます。

次の章

この章では、GameObject を動的に作成してコンポーネントを動的に追加する方法を説明し、次に Prefab を使用してリソースとロジックの再利用を実現する方法を説明し、Prefab とその例の関係について詳しく説明しました。

これらを理解した後、マウスの左ボタンをクリックして弾丸を動的に作成し、Update 関数で弾丸の位置を変更して弾丸発射機能を完成させるなど、いくつかの基本ロジックを実際に実装できます。

重力に応じて落下する機能や、弾丸がターゲットに当たることを計算する方法など、弾丸をより現実的にする方法については、次の章で、Unity で一般的に使用される物理エンジンのコンポーネントと使用法について説明します。キャラクターの歩行を実現する方法を説明する ロジックの学習が完了すると、小さなシューティング デモを作成できるようになります。

おすすめ

転載: blog.csdn.net/z175269158/article/details/129956997
おすすめ