UnityやC#の知識が足りず、教本よりも複雑なことをしようとするとコードが煩雑になってしまう
Unityを用いたゲーム開発はデザインパターンや作成手順が重要
Unityで2Dゲームを開発しようと企んでいます。脳みその中には壮大なゲームのプランがありますが、それを実現するためにはまずは規模の小さいミニゲームから開発すべきでしょう。
しかし、いくつかの教本(中古で200円ほど)に掲載されていたサンプルゲームを作れるようになったところで、自分で考えたミニゲームをすぐに作れるようになるわけではないと気づきました。
本稿、あるいは本シリーズはUnity初学者がUnityやC#を理解し、プロジェクトを制作するものです(ノークレームでお願いね)。
□理由
・教本に掲載されているサンプルゲームのコードを参考に自作ゲームを作っていても、そのうちコードが複雑化し、どのオブジェクトがどの機能を持っているのか分かりづらくなってしまう
・結果、どこかに依存度が偏ったプロジェクトになる
・オブジェクトの参照とクラスの分け方などのベストプラクティスが分からないため、迷子になる
□本稿におけるUnityへの取り組み
・そもそも、何が不明瞭でどこでつまずいているのか言語化する
・視聴した動画やウェブサイトの情報を自分なりの言葉にする
Unityで躓いたところ
私はUnityの2Dプロジェクトで小規模なタワーディフェンス + アクションRPGを開発していました。具体的には以下のような機能を持ちます。また、実装できた点については(実装済み)と記述します。
・WASDでキャラクター移動(実装済み)
・モンスターを指定範囲内にランダムリスポーン(実装済み)
・モンスターがプレイヤーに向かって移動してくる(実装済み)
・一定のエリアに入ると追尾してくるモンスター(微妙)
・タワーディフェンスにおける防衛ポイントがある(未実装)
・スコア。モンスターを倒すともらえる(未実装)
・制限時間(未実装)
上記の他にも基本的なダメージ概念やゲームオーバー機能などの実装を目指していましたが、途中でコードが複雑になってしまい、自分がやっていることが分からなくなることがしばしば。
どこで躓いたのか現在の拙い知識で述べていきます。
まず、プレイヤーとモンスターの基本的な動き自体は実装できましたが、「その全てのオブジェクトで毎回、お互い(PlayerとEnemy)に同じようなオブジェクトやコンポーネントを取得すること」に非効率的なものを感じてしまいました。例えば、「予め、使用するオブジェクトやそのコンポーネントを取得した変数を一箇所にまとめておく」ことはできないだろうか、と考えました。
例えば、消費者(客)が食材を卸す業者に直接、値段や鮮度を聞いて回るのではなく、スーパーマーケットのような存在が間を取り持ってくれるようなシステムができないかということです。UnityにおけるC#(あるいはオブジェクト指向のプログラミング言語)ではそういったものをデザインパターンと呼ぶのだそうで。
ではそれだ!と思い、デザインパターンを調べてみたところ30種類以上のデザインパターンがあり、当然泡を吹きました(多すぎる!)。おまけに初学者がそれを選ぶべきかも分からず、迷子に。
ちなみに自分でもプロジェクト内部に「ObjectsManager」なる、オブジェクトとコンポーネントをAwake()やStart()で取得する謎の存在を爆誕させてみました。
しかし、ところどころでRefferenceのエラーが起きるなど、「なんでコンポーネントが取得できてないんだ」といった事態が発生し、一度地球を滅ぼしかけました。
理想のやり方
私は上述のコードや依存関係が複雑に絡んできてしまうやり方が気持ち悪く、明らかに間違った方法で開発している感があります。
そこで、どうあれば理想とする綺麗な開発方法になるのか考えてみました。
・何度も何度も同じPlayer、Enemyオブジェクトやそのコンポーネントを取得したくない
⇨そもそも、GetComponentの動作が重いとかいう情報もあり、AwakeやStartで取得するにもある程度で済ませたい
⇨それらオブジェクトやコンポーネントが必要になることが分かっているなら、なんで毎回新しいコードをいくつも書いて取得しなきゃならねーんだ!という暴論。[Serializedfield]で全部済ませたい!いいんか!?
・敵味方関係なく、MoveクラスやAttackクラスと言ったクラスを参照して、行動させたい(けど、継承周りで脳が一度、火を吹いた)
・実装したい機能と、その基本となるコアな機能を最初から分離して置いて、PlayerとEnemyで側で適切なものに書き換えてから動かしたい(しかも、スマートに。もうオブジェクトの取得連発地獄はいやよ)
ということで、今後のシリーズではデザインパターンを学びつつ、規模を小さくして記事にしていきたいと考えています。
Discussion