ECS 設計編
前回に引き続き、ECSについて書いていきます。
実践的なことをやりたいので、できるだけゲームに使えそうなことをやっていきます。
おさらい
更にざっくりおさらい
用語について説明するぜ!
- ECS (Entity Component System) ... 新しい設計の考えかた
- コンポーネント (ComponentData) ... データのこと
- システム (ComponentSystem) ... コンポーネントをもとに処理する処理自体
- エンティティ (Entity) ... コンポーネントをまとめたもの、データの塊
設計
前回でも紹介したとおり、ECSはどんなコンポーネント、システムを作ったかが共有できていないと
思わぬ動作をされてしまうので簡単な設計をします。
要件定義
今回は作るものは、
「キー入力で逃げるプレイヤーを追いかける敵」です。
「は? 簡単すぎやろ、アホくさ」と、思ったあなた!
申し訳ない、この要件がECSの各ポイントを抑える事ができるんや。
システム設計
まず、実装したいシステムを考えてみましょう。
- 描画
- 前方向移動
- キーボード入力移動
- 指定の方向を向く(Lookat)
今回は、これだけにしておきます。
実は、UnityECSには最初から基本的なシステムが追加されています。
「描画」と「前方向移動」は最初から備わっていいるので、
自分で実装しなくてはいけないのは、
「キーボード入力移動」と「指定の方向を向く」
です。一気に楽になりましたね!
コンポーネント設計
次に、
実装したいシステムに使うであろうコンポーネントについて考えましょう。
基本的なコンポーネントは、これまた、Unity側が追加してくれているので、ありがたく使わせてもらいましょう。
- 描画
- トランスフォーム [位置、回転、拡縮] (TransformMatrix)
- 描画するメッシュ情報 (MeshInstanceRenderer)
- 前方向移動
- 位置 (Position)
- 前方向ベクトル (Heading)
- 移動スピード (MoveSpeed)
- 移動方法のラベル (MoveForward)
- キーボード入力移動
- 位置 (Position)
- 回転 (Rotation)
- 移動スピード (MoveSpeed)
- 入力ラベル (Input)
- 指定の方向を向く
- 向かれる相手の情報
- 向かれる相手ラベル (Target)
- 位置 (Position)
- 向く自分の情報
- 向く自分ラベル (Lookat)
- 位置 (Position)
- 前方向ベクトル (Heading)
- 向かれる相手の情報
ずらっと、書いてみましたがこんな感じですけね。
ちなみに、自分で作らないといけないコンポーネントは、
「Input」「Target」「Lookat」
だけです! 楽勝やな!!!
エンティティ設計
最後に、上のシステムとコンポーネントを使って実装するオブジェクトについて考えていきましょう!!!
プレイヤー
プレイヤーが使うシステムは、
- 描画
- キーボード移動
です。
が、
敵がこちらを向いてくるので、
「向かれる情報」がいります。
以上を踏まえて、プレイヤーが持つコンポーネントは
- トランスフォーム [位置、回転、拡縮] (TransformMatrix)
- 描画するメッシュ情報 (MeshInstanceRenderer)
- 位置 (Position)
- 回転 (Rotation)
- 移動スピード (MoveSpeed)
- 入力ラベル (Input)
- 指定の方向を向く
- 向かれる相手ラベル (Target)
ざっくりこんな感じ。
敵
敵が使うシステムは
- 描画
- 前方向移動
- 指定方向を向く
です。まとめると
- トランスフォーム [位置、回転、拡縮] (TransformMatrix)
- 描画するメッシュ情報 (MeshInstanceRenderer)
- 位置 (Position)
- 前方向ベクトル (Heading)
- 移動スピード (MoveSpeed)
- 移動方法のラベル (MoveForward)
- 向く自分ラベル (Lookat)
こんな感じ~
わかりやすく絵にすると
おわり
ちょっち長くなったのでコーディングは次回かな~~~
今日が七夕なんで、織姫と彦星の小話なんだけど、
年に1回しか会えない悲しいとか皆思ってるかもしれないけど
織姫と彦星のもとになった星たちの寿命は、約80億年、
つまり80億年を人間の80年に置き換えると、
「1秒間に3回会ってる」計算になるらしい...
会い過ぎじゃね?