8. ECS実装の疑問点
ECSの疑問点
ECSで実装しているときに疑問に思った点です。
Q. map(tilemap)はどこで管理すべき?
mapはECSの対象ではない。
ECSでは頻繁に変化するEntityを扱うが、mapはゲーム開始時に読み込まれ、基本的には変化しないため、Gameシーンのcreate()で作成する。
Q. プレイヤーが止まったら最後の方向を表示したい
ECS以前では、プレイヤーが移動する際に最後の向きlastDirectionを保存していたが、ECSの場合はどうしたらいいか?
→ DirectionComponentを作成して、そこでlastDirectionを保存する。
RenderSystemで速度が0のときはlastDirectionを参照して stop-left などに切り替え
Q. ComponentManager.reset()が必要な理由
static Mapは静的変数なので、Scene切り替えでも消えないので注意。
わかりにくいバグの温床となるため、GameScene.create()先頭で、必ず初期化すること。
Q. ライブラリはないの?
bitecs が有名らしいです。 今回は学習のためにライブラリは使わずに自作していくことにします。
その他の疑問
Q. 毎フレームダメージが入る
単純に敵とプレイヤーが衝突したらダメージを与える処理にすると、毎フレームダメージが入ってしまう。 それを避けるためには、プレイヤーに無敵時間を設定して、時間切れまでダメージ処理をスキップする。
ECSなら、InvincibleComponentとInvincibleSysytemを作成して、CollisionSystemで無敵時間はダメージ処理しない。
Q. tweenを連続処理したい?
this.add.timeline()を使う。- targets / tweens[] / offset で順次アニメを検討
Q. scene.start vs scene.launch の違い
start: 現在のSceneをSTOPして切り替えるlaunch: 引き続き動かせる(UIシーンなど)
Q. 敵が同じ位置に密集するのでバラけさせたい
簡易手法としては、TargetComponentにランダムなoffsetX/Yを持たせて、個別にずらした目標地点を追いかける。 また、敵同士に反発ベクトルを加えるという方法もあるが、少し複雑になるので、今回は前者を採用。