当たり判定(Entity Component System)

当たり判定(Entity Component System)

PlayerとEnemyの衝突を検知し、Effectを再生します。

Script

Component

Player

Playerの移動速度を決めるComponentです。

Playerがキー入力を受け取るためのComponentです。

以上のComponentを追加したEntityを作成します。

Enemy

Enemyの名前と自身が破壊された際に再生するエフェクトをまとめたComponentです。

以上のComponentを追加したEntityを作成します。

Effect

Effectへ追加するデータを持たないComponentです。再生が終了した際に削除したいEffectとそうでないEffectを判別するために使用します。

System

キー入力

キー入力を受け取るためのSystemです。詳しくはInputSystemで入力を取得(Entity Component System)を参照してください。

当たり判定

ITriggerEventsJobでは衝突したEntityを取得することができます。これらのEntityが特定の組み合わせであるかを確認し、その後、衝突した際の処理を行います。

  • ComponentLookup
     指定したEntityからComponentを取得することができます。ComponentLookupはGetComponentLookup<T>(bool)で取得できます。boolは読み取り専用かを指定できます。読み取り専用にした場合、ITriggerEventsJob内のComponentLookupを受け取るフィールドはReadOnlyとする必要があります。また、書き込みを可能にした場合は他スレッドで書き込みが行われたかを確認する処理が入るため実行速度に影響があるそうです。
     ITriggerEventsJobでは衝突したEntity(evt.EntityA、evt.EntityB)が取得できるので、ComponentLookupから目的のComponentを取得できます。
  • PlayerHitJob
     ITriggerEventsJobを継承したstructで当たり判定を受け取ることができます。PlayerHitJobはOnUpdate内でスケジュールを行い、実行します。
  • EntityCommandBuffer
     Entityの作成等、Enitityの変更は非同期で実行するのは望ましくありません。EntityCommandBufferを使用することでジョブを完了した後にメインスレッドで実行することができます。よって、PlayerHitJob内ではEntityCommandBufferを用いてEntityの作成、Componentの追加及び破棄を行っています。

Effectの削除

Effectが終了した際に残ったEntityを削除するためのSystemです。SystemAPI.QueryでVisualEffectを取得しています。VisualEffectはマネージドなComponentなので、このSystemではBurstCompileが使用できません。

設定と実行結果

PlayerとEnemyが衝突した際にすり抜けるように設定します。(Tirigger)

Player

Cubeを作成し、SubSceneへ移動させます。Box ColliderのIs Triggerにオンにします。また、Rigidbodyを追加し、Use Gravityをオフにします。そして、PlayerAuthoringを追加し、Speedを20へ変更します。

Enemy

Cubeを作成し、SubSceneへ移動させます。Box ColliderのIs Triggerにオンにします。DestroyEffectへEnemyがPlayerと接触した際に再生するVFXを選択します。

実行結果

実行すると以下の画像のようにPlayer(白いCube)がEnemy(灰色のCube)に衝突するとEffectが再生されます。

おまけ

ShaderGraph

Effectに使用したShaderは以下のように設定しています。Support VFX Graphにチェックを入れる必要があります。

VFX Graph

衝突した際に再生されるEffectのVFX Graphです。

参考ページ

[Unity DOTS]EntityComponentSystemSamplesを補足する

【Unity】ECSの並列処理(IJobParallelForやIJobForEach系)でEntityCommandBufferを使う

Unity ECS End Game – Implementing High-Performance Systems with Unity DOTS Job System, YouTube

[Unity] 衝突判定における、IsTriggerとRigidbodyとIsKinematicのパターンを実験