のりまき日記

Unityなどの活用リファレンスブログ。「こうしたい時どうする」をまとめたい

unity)PlayerとかEnemyのクラス設計をきれいにしたい

はじめに

  • Playerクラスを作らずにプレーヤーを表現したい!という設計の話です
  • すべてがそれで上手くいくわけではないですが、使える場面は多いと思います
  • だいたい毎回うまくできないので、いつかうまく設計できるように考え方をメモしておきます

unityはコンポーネント思考

  • UnityはGameObjectに色々なコンポーネントをアタッチして動きを作ります
    • 部品を組み合わせて、ロボットを作る様なイメージです
  • 細かい粒度では、位置を決定するtransformがあって、描画するためにrendererがあって、物理を制御するrigidbodyがあって、という感じ

characterクラスに集約

  • transformやらrendererやらrigidbodyを制御するクラスはどうしても必要なので、それをCharacterと命名します
  • CharacterにはMoverとかAttackerとかいい感じの粒度でコンポーネントを実装します
  • PlayerもEnemyもCharacterです

Playerとは

  • Playerっぽい動きをするCharacterがPlayerです
    • なのでGameObjectのnameがPlayerであるべきだと思います
  • Playerっぽい動きかどうかを決めるのはController
    • ユーザーが操作するならUserControllerのアタッチされたCharacterがPlayerという名前のGameObject

Enemyとは

  • AiControllerのアタッチされたCharacterが、ターゲットとしてPlayerを指定されたら、そいつはEnemyという名前のGameObject

良い点

  • ごっこのゲームを作っていたら「鬼も操作できるようにして!」と言われた
    • EnemyとPlayerで実装してると大変だった
  • Controllerをすげ替えるだけでPlayerにもEnemyにもなれるがよい

マリオ

  • マリオを作るときにmarioクラスが登場するのは具体的過ぎると感じます
    • プログラムはいつだって抽象的で汎用的あったほうがいいと思う
      • 1〜10を出力するのにたぶんforを使うと思います。print 1; print2;...とはしないのと同じ感じ

結局Playerクラスを作ってしまう

  • なんだかんだ「これはPlayer!」「これはEnemy!」と書いちゃった方がラクなことが多い
  • 継承したいこともやっぱりある

銀の弾丸はない

  • 作りたいものによって最適な設計は変わると思う
  • でも意識して作れると疎結合できれいなクラス分けくらいの設計になるのでおすすめ