時代に翻弄されるエンジニアのブログ

ゲームプログラマをやっています。仕事やゲームや趣味に関してつらつら書きたいと思います。

Unity ゲーム設計のはじめかた

f:id:tkymx83:20190128002631j:plain:w1000


こんにちは、皆さんUnity 使っていますか?

Unity を使っていると便利にゲームが作れる反面、大規模なゲームを作っていると工夫しないといけないことが多々あると思います。例えば、いつまでも、Scene上に配置しているだけでは量産は難しいですよね?

今日はUnity で大規模なゲームを作ろうと思ったときの考え方を書いていけたらと思います。

小規模なゲームと大規模なゲーム

大規模と言っていますが、何が大規模で何が小規模なのでしょうか?

少なくとも一ヶ月はプレイできるような規模のゲームを大規模と呼んでいます。そうなると、カジュアルゲームは小規模なゲームになりますね。巷にあふれているキャラクタを強化しながらクエストを攻略するゲームは大規模なゲームとなります。

これらの違いは、

ゲームのバリエーションが有るかどうかです。

例えば、カジュアルゲームは言ってしまえば1つのキャラクタの動きさえ決めていれば大丈夫です。しかし、大規模になってくると、さまざまなキャラクタがいて、さまざまな成長要素があります。つまりは、ゲームの要素の多様性に対応したコーディングを行っていかなければいけないのです。

では、具体的にどういった点に注意してコーディングしないといけないのでしょうか?

コードはどこに書く?

まず、コードの位置が変わります。

小規模のゲームでは、Hierarchy 上に直接 GameObject を設置して、CharacterController のような Component を設置して、キャラクタを動かすと思います。しかし、キャラクタが一人だとこれでもいいのですが、いろいろな動き方や見た目のキャラクタが存在した場合、それを1つ1つ Hierarchy に追加するような作り方ではそのうち限界が来てしまいます。

このように動的にゲーム要素が変化する場合は Hierarchy に直接配置するのではなく、 Instanciate などを利用してゲームのロジックから動的にキャラクタを配置する必要があるのです。そして、動的になることで、コーディング側でキャラ設定や動き方などを定義するようになり、そのキャラクタの管理などもロジックで行うようになります。

そのため、大規模なゲームの設計は一旦Unity のグラフィカルなエディターからは離れて、ロジックのコーディングによるゲームの設計を行う必要が出てくるのです。

また、ゲームのキャラクタやマップなどを量産していくにあたって、すべてをコーディングで設定していては、コード量は膨大になり、一つ一つを管理できないようになります。それに対応するために

データ駆動によるゲーム設計

を行っていかなければいけません。

データ駆動って?

データ駆動とは、ゲームというジャンルでわかりやすく言うと、

キャラクタの振る舞いを設定として外出しして、ゲーム要素の量産に特化させた開発手法です。

例えば、キャラクタの攻撃が三段階(弱攻撃、中攻撃、強攻撃)あり、それぞれの攻撃をしてくる敵を作るとします。

コーディングで敵を作成する場合それぞれ動作を規定した3つのクラスを作ることになり、敵に応じてクラスの選択を行います。ここで問題になるのは、弱と中の攻撃をしてくる敵がいる場合もう1つクラスを作ることになり、クラス選択のコードにも修正が必要になります。

データ駆動では、まずコーディングで攻撃を複数回行うことができるキャラクタをつくります。このキャラクタがどの攻撃をするのかは外部のテキストに記載しておき、初期化時に設定します。こうしておくことで、1つのクラスを作るだけで、後は外部のテキストを変えるだけで攻撃の種類が違う敵を作ることができます。

また、もっと良い面として、弱と中の攻撃をしてくる敵もテキスト記載することで再現できるので、

コーディングなしで無限に敵を作ることができるのです。

まとめ

大規模なゲームを作る上で大切になるのは、いかにゲーム内要素を量産できるかだと思います。そのために汎用的なコードやデータ駆動なコーディングが必要不可欠になると思います。

そして、このような話はあまり起業から出ていかないので、もっと色んな人が語り合えればいいなと思います。

以上です。