DOTSで作る方法を解説したものです。Physicsでただ単純に球を動かしてみるに書かせて頂きました。参考になれば幸いです。packageを多く使用しています。今後、この記事のコードが使えなくなる可能性が高いのでご注意下さい。関する詳しい説明は行わないのでご注意下さい。Componentします。Componentします。コンポーネントBallを識別するためのTagとして利用するために作成します。コンポーネントBallに与える力に関するデータを管理するために作成します。Componentします。}}MoveBallSystem次のようなBallを動かす処理を担当するスクリプトを作成します。}}ChangeForceSystem次のような、キーボードの入力に応じてBallが動く向きを変える処理を担当するスクリプトを作成します。}}ここまでの内容はこの記事にもう少し詳しく書いたので是非参考にしてみて下さい。程度に設定しておきます。Componentします。コンポーネントCubeを識別するためのTagとして利用するために作成します。IComponentData{}CubeAuthoring次のようなスクリプトを作成し、Cubeオブジェクトにアタッチします。}}Cubeを回転させるここでCubeをy軸のまわりに自転させようと思います。オブジェクトの回転は、ECSより前はtransform.Rotate()などのように実装していましたが、ECSではEntityに追加されているRotationというComponentDataを毎フレーム更新することによりCubeの回転を実現します。RotationはQuaternion型なので、ここではRotationの計算はQuaternionを使って行います。q(t)が成り立ちます。この式を使ってCubeのRotationを毎フレーム更新することによりCubeを回転させる、という方針を取ります。コンポーネントCubeの角速度を管理する、CubeRotationSpeedを作成します。value;}それに伴い、以前作成したCubeAuthoringを次のように変更します。EntityにCubeRotationSpeedを追加する処理を追記しました。RotateCubeSystemCubeをy軸の周りに自転させる処理を担当します。}}確かにy軸の周りに回転していますね。math.normalize(rotation.Value));です。ように書かなければいけません。Quaternionは非可換です。q_1なので、math.mul()の引数の順序には注意が必要です。DeltaTime)に相当していますが、quaternion.AxisAngle()関数は、第一引数に回転の軸となる単位ベクトル、第二引数に回転する角度(rad)を要求します。BallとCubeの接触を判定し、接触していたらCubeを削除するTriggerSystemBallとCubeが接触しているかどうかを判定し、接触していたらCubeを消去するという処理を担当するTriggerSystemを次のように実装します。}}CubeのPhysicsShapeAuthoringのIsTriggerにチェックを入れます。BallとCubeが接触した時にCubeが消されるようになりました。解説Triggerに関する処理はITriggerEventsJobを実装した構造体(ここではTriggerJob)に書きます。Execute()の引数のtriggerEventに、どの2つのEntityが接触に関与しているのか、という情報が格納されます。triggerEvent.Entities.EntityB;のように取得します。ここではentityAとentityBが具体的にどのEntityなのかを識別するために次のような処理を行います。return;で無視します。CommandBuffer.DestroyEntity(cubeEntity);では、Cubeを削除する処理をメインスレッドで行うように命令をしています。Entityを削除する処理はメインスレッド上でしか行えないため、「Cubeを削除する」というタスクの発行のみを非同期で行い、後で実際にメインスレッドで削除する、ということをEntityCommandBufferSystemを使って行っています。テラシュールブログ)また、EntityCommandBufferSystemを使う場合は、OnUpdate()内に_bufferSystem.AddJobHandleForProducer(jobHandle);のように書く必要があります。ここではJobが完了する前にCommandBuffer中の命令が実行されてしまうのを防ぐために依存関係を設定する役割を担っています。website)複数のCubeを生成して円形に配置する実行時に複数のCubeを生成して円形に配置する、という処理をここで実装します。Componentします。CubeSpawnData生成するCubeの個数、配置する円の半径、CubeのPrefabのEntityなどのデータを管理するCubeSpawnDataを作成します。cubePrefabEntity;}CubeSpawnerAuthoring次のようなスクリプトを作成し、CubeSpawnerにアタッチします。}}ここでは生成するCubeの個数は24個、円の半径を7.5としています。Prefabの欄に代入します。解説Prefabは、ECSでは単にPrefabというComponentDataが付いているだけのEntityです。ComponentDataを付加してくれます。conversionSystem.GetPrimaryEntity(cubePrefab)では、まずconversionSystem.GetPrimaryEntity(cubePrefab)で、cubePrefabに対応するEntityを取得していて、それをCubeSpawnerDataのメンバ変数であるcubePrefabEntityに代入しています。これによって、CubeSpawner(Entity)はCubePrefab(Entity)に対する参照を持つことができるようになります。SpawnCubeSystemCubeSpawnerを基にCubeの生成を行う、SpawnCubeSystemを作成します。}}解説Entityの生成はメインスレッドでしか行えないので、ここでもEntityCommandBufferSystemを使います。Threadで並列処理を行う場合はこのように宣言する必要があります。cubeSpawnerData.cubePrefabEntity);のように第一引数にJobのIDを入れる必要があります。これは特に難しいことではなく、Execute()の第二引数のindexをそのまま入れてやればokです。エフアンダーバー)カウンターの実装Ballが接触したCubeの個数を表示する、処理をここで実装します。Textを作成して、見やすいようにInspectorをいじります。Componentして...といきたいところですが、現在(2019年12月)はまだUnityEngine.UIはDOTSに対応していません。コンポーネントCountの値を管理するComponentDataです。value;}CounterMonoBehavior次のようなCounterMonoBehaviorを作成し、Counterオブジェクトにアタッチします。World.Active.EntityManager;entityManager.CreateEntity(typeof(Count));でCounterのEntityをEntityManagerを通して作成します。コンポーネント次のようなCountUpという空のComponentDataを作成します。このようなものを作る理由は後述します。IComponentData{}CountUpSystemCountUpSystemではカウンターの数値を+1する処理を行います。GameObject.FindObjectOfType<CounterMonoBehavior>();でCounterMonoBehaviorの参照を取得します。次にOnUpdate()関数内では、CountとCountUpが付いているEntityのみを処理の対象としています。1;_counter.SetCount(count.value);でカウンターの数字を+1した後に、_entityManager.RemoveComponent<CountUp>(entity);でCountUpをEntityから削除しています。カウンターの数字を+1したい時は、Counter(Entity)にCountUpを付加すればよい、ということになります。Systemを使っていません。Systemを使う場合Jobの中で参照型の変数を使うことができないため処理を書くことができないからです。TriggerSystemの変更カウンターの数字を+1したい時はCounter(Entity)にCountUpを付加すればよいので、ここではBallがCubeに接触した時にCounter(Entity)にCountUpを付加する処理を実装するために以前作成したTriggerSystemにコードを追加します。CountUp());でCounter(Entity)にCountUpを付加しています。EntityQueryを使ったEntityの絞り込みは、これまで扱ってきた方法よりも少し複雑です。GetEntityQuery(ComponentType.ReadOnly<Count>());で絞り込む条件を設定します。_entityQuery.ToEntityArray(Allocator.TempJob)のように絞りこみの結果を受け取るNativeArrayを用意します。このCountArrayは宣言時に[DeallocateOnJobCompletion]をつけて宣言されていて、Allocator.TempJobで初期化されているのでJobの完了時に自動的にDisposeされます。テラシュールブログ)完成!おわりにここまで読んでくださりありがとうございました。参考になれば幸いです。upLoginユーザーは見つかりませんでした。