UnityのECSでチャンク単位で処理を実行してみる

前回はECSとはどういうものなのか?やシンプルな使い方で使ってみました。

UnityのECSを使ってデータ指向型のゲーム作りをしてみる
UnityのECS(Entity Component System)を使ってデータ指向型でスクリプトを作成しシンプルなCubeの動きを作成してみます。

前回の場合はCubeをインスタンス化し下に移動させるという機能を作成し、全てのエンティティに対して(Cubeタグを使って実行する対象を絞っていますが)処理を実行していたので、今回はチャンク毎に処理を実行して同じようなことをしてみようと思います。

スポンサーリンク

Cubeが落下する機能の作成

やる事は異なっていますが、機能自体は前回作成した機能と同じです。

コンポーネントの作成

前回と同じようにCubeの移動スピードと回転スピードのコンポーネントを作成します。

まずはMoveSpeedです。

個人的な理由で名前空間MyChunkJobに作成しています。

MoveSpeedはIComponentDataを実装し、構造体(struct)で作成します。

前回は[GenerateAuthoringComponent]を構造体の前に付けてゲームオブジェクトのインスペクタで値を設定出来るようにしましたが、今回は別のスクリプトで設定出来るようにするので[Serializable]アトリビュートだけを取り付けます。

RotationSpeedも同様です。

インスペクタで設定出来るスクリプトの作成

ゲームオブジェクトに取り付けてCubeの移動スピードや回転スピードのデータを取り付けたり、Convertメソッドでエンティティに変換するChunkDataAuthoringスクリプトを作成します。

ChunkDataAuthoringスクリプトはMonoBehaviourとIConvertGameObjectToEntityインタフェースを継承して作成します。

MonoBehaviourクラスを継承して作成したクラスなのでゲームオブジェクトに取り付けることが出来ます。

IConvertGameObjectToEntityインタフェースを継承するとConvertメソッドを実装する必要があります。

Convertメソッドはゲームオブジェクトに取り付けているコンポーネントをエンティティに変換する処理を記述します。

MoveSpeedとRotationSpeedをインスタンス化し、EntityManagerであるdstManagerのAddComponentDataメソッドを使ってエンティティに作成したインスタンス(データ)を取り付けています。

Cubeを動かすシステムの作成

次に生成したCubeエンティティの移動と回転をさせるシステムを作成します。

CubeとCapsuleを作成して動かす

動かすシステムが出来たのでCubeとCapsuleを作成して動くか確認してみます。

ヒエラルキー上にCubeを作成し、名前をECSCubeとします。

TransformのScaleのYを2にします。

ECSCubeには前回作成したCubeTagを取り付けます。

また、先ほど作成したChunkDataAuthoringスクリプトもECSCubeに取り付けます。

さらに実行時にゲームオブジェクトからエンティティに変換する為、インスペクタのAdd ComponentからDOTS→Convert To Entityコンポーネントも取り付けます。

ECSCubeは以下のようになります。

ECSのチャンクテスト用のCube

ヒエラルキー上で右クリックから3D Object→Capsuleを作成し、ChunkDataAuthoringとConvert To Entityコンポーネントを取り付けます。

Capsuleは先ほどのシステムでは動かさないのでCubeTagは取り付けません。

Capsuleは以下のようになります。

ECSのチャンクのテスト用のCapsule

Unityを実行してみるとECSCubeだけが回転しながら落下をします。

スクリプトでCubeのYの位置を50としているので実行開始とともにCapsuleより上から出現します。

Cubeプレハブの作成

Cubeは量産する必要があるのでCubeプレハブを作成します。

ヒエラルキー上のECSCubeのConvert To Entityコンポーネントを削除します。

Assetsフォルダ内にドラッグ&ドロップしてプレハブにします。

これでECSCubeのプレハブが出来ました。

ヒエラルキー上のECSCubeは削除します。

ECSCubeプレハブは以下のようになっています。

ECSで移動や回転をさせるCubeのプレハブの設定

ECSCubeプレハブをインスタンス化するスクリプトの作成

次はECSCubeプレハブをインスタンス化するスクリプトInstantiateCubeScriptを作成します。

このスクリプトは前回の記事とほとんど同じなので説明は割愛させて頂きます。

InstantiateEntityメソッドで行っていることはプレハブからエンティティを生成し、Translationの設定をしています。

InstantiateCubeScriptを何らかのゲームオブジェクトに設定します。

インスペクタでprefabにECSCubeプレハブを設定し、totalTextにはインスタンス化した数を表示するUIのTextを設定してください。

ここまででスペースキーを押すとECSCubeプレハブをエンティティに変換したものがnumberToInstantiateの数分生成されるようになります。

終わりに

この記事を途中まで書いていたのですが、公開するのを忘れていた為、本日公開しました(記事自体は昨年末に作ったやつ)。(^_^;)

内容はすっかり忘れているので、もしかしたら内容に抜けている所があるかもしれません・・・・。

タイトルとURLをコピーしました