5.1さらうどん

@giginetの技術ブログ。ゲーム開発、iOS開発、その他いろいろ

一晩(+α)でフリーソフト使って3Dゲームを作った話。

f:id:gigi-net:20121022084048j:plain


先週末、ゲーム制作者コミュニティKawazの集まりで、メンバーが集まったときに、ワインを買っていって、ほろ酔い気分になった和牛先生ことid:lightwaveさんに「Unityでゲーム作るからモデル作って〜」とおねだりしてみたところ、一晩でモルボルができてきた。すごい。


一晩でフリーソフト使ってゲームモデル作った話。 - うしろぐ


というわけで、便乗して、僕も開発したゲームについてメイキング記事を書いてみます

作ったゲーム

開発したゲームはこちら!遊び方などは下記ページ内を参照してください。

Kawaz - かわずたんは呪われてしまった!


いわゆる全方位シューティングという奴です。

Unityとは

このゲームはUnityという、無料*13Dゲーム制作環境で開発されています。簡単に3Dゲームが作れる上に、Mac/Windows/Android/iOS向けなどに簡単に配布できてしまいます。*2


id:lightwaveさんが紹介されているBlenderも無料なので、ゲーム開発をするには利用しない手はありません。

書籍はいろいろ出ていますが、いろいろ読んだ感じ、以下がオススメです。

ゲームのコンセプトの決定

今回は作り始めた時点で作りたいモノが決まっていて、『まもるクンは呪われてしまった!』という全方位シューティングゲームが好きだったので、ほぼこのシステムを踏襲した作品にしようと考えました。

短い期間で開発するのにシューティングを採用するメリットとしては以下の点が上げられると思います。

ゲームロジックの構築が単純

作らなくてはいけない部分は、敵と自機の挙動とゲーム全体の流れのみ!敵や自機の挙動も、統一的な設計にしてしまえば、あとは継承(Unityの場合はコンポーネント化)していくらでも動きが追加できてしまいます。

Unityの場合は、キャラ操作やコリジョン、物理演算と言った面倒な部分が予め全て提供されているので、自分で作らなくてはならない部分は驚くほど少ないです。

どのようなモデルでも利用でき、モーションの重要性が薄い

シューティングゲームの場合は、アクションゲームと違って、弾さえ打たせてしまえばそれっぽく見えるため、どのモデルであっても工夫次第でゲームの舞台に立たせることが容易です。


また、id:lightwaveさんの記事にも言及されているとおり、とりあえず動いてさえすれば、複雑なモーションがなくてもそれなりの見栄えがします。


このゲームでも、シューティングにおなじみの「バキュラ」はキューブを潰して回転させているだけ、「丸太」や「柱」といったギミックも、シリンダーにデフォルトの木目テクスチャを貼っただけです。少ないリソースで如何に見栄え良くできるかという観点から、シューティングは非常に良い選択だと思います。

ギミックなど、オリジナル要素を手軽に付加しやすい

一度ゲームが動くようになってしまえば、レベルデザインの幅を持たせやすいのもシューティングの特徴です。

例えば、敵の攻撃一つとっても通常弾、方向弾、追尾弾、打ち返し弾、扇形、放射、円形、弾幕、レーザー、オプションハンティングなど枚挙に暇がありません。


システムとしても、ボムを採用するか、パワーアップはどうするか、戻り復活、オプションなど、世に出回っているさまざまなシューティングのシステムの中からいくつか採用するだけで、オリジナリティが高い作品が仕上がります。

コーディング

開発言語は?

ご存じの方もいらっしゃるかと思いますが、UnityではUnityScript(JavaScript)、C#、Booという3つの言語が利用できます。

ドキュメントが充実しているので、プログラマならどの言語を採用しても問題なく開発できると思います。

Unityでこの規模のゲームを開発したのは3作目なのですが、毎回、僕は開発言語にあえてBooを採用しています。

Booを採用している理由としては、僕がPythonになれているのと、リスト内包などが利用できるという点なのですが、言語仕様が大分Pythonと異なっています。

Unityでは、他の言語で書かれたComponentをimportできないという制約があり、Standard AssetがほぼUnityScriptで記述されている点から、Booはほとんど開発実績がないため不利な気がします。

このゲームでも、プレイヤーに付加されたThirdPersonCameraが、Booから参照できなくて困りました。


他にも学習コストの問題もあり、あまりBooを採用するメリットはないかも。広く普及しているUnityScriptの採用をオススメします。

車輪の再発明はしない

ここまで来ればあとはコードを書くだけです。Unityは基本的な挙動が全てAssetと呼ばれる素材集として提供されているので、Standard Assetを把握していれば、ほとんど自前で開発する必要がありません。

車輪の再発明は大抵車輪にならないので、提供されているモノは最大限利用しましょう。


例えば、このゲームでは、キャラの移動周りは全てCharacterControllerを利用しており、一行もコードを記述していません。

カメラ制御はThirdPersonCameraを利用しています。こちらは、このゲームの特徴である進行方向と逆方向には戻れない、という仕様を実現するために、一度来た位置よりも左、もしくは下側にカメラが戻らないようにコードを変更していますが、ほぼそのまま利用しています。

また、爆風などはAssetStoreにある無料のAssetを利用しています。


このように、ゲームに必要な大部分を自分で記述する必要がなく、上手く利用できると開発の時間をグンと短縮できます。

Unityでゲームを作り始める前に、Standard Assetなどでいろいろ遊んでみると良いでしょう。

マップローダー

この手のゲームを開発するとき、基本的な動きができたら僕はマップローダーを実装しています。

Resourceとして、マップを記述したテキストファイルを用意しておき、それをTextAssetとして読み込み、パースしてステージを生成する機構です。


例えば、1面のマップは以下のスクリーンショットのようになっています。

f:id:gigi-net:20121022084242j:plain

ゲームを遊んでみた方は、パッと見同じような形になっていることがおわかりいただけるでしょう。

このデータを元にマップを自動生成させると以下のようになります。

f:id:gigi-net:20121022084433j:plain


このようなスクリプトを初期の段階で拵えておくと、レベルデザインの段階になったときに試行錯誤が容易にできて良いです。

Componentを使いこなす

UnityのComponentの概念は、他のプラットフォームになれているとどうにも取っつきにくいのですが、Mixinのような使い方が容易なため、上手く使いこなすことができると絶大な威力を発揮します。

例えば、このゲームは、各敵キャラがShooterとEnemyクラスのサブクラスをそれぞれコンポーネントとして保持しています。

Enemyでは、敵キャラの挙動を管理します。移動させたり、死亡時に何か処理を加えたり等です。

ボスキャラなどの挙動はEnemyのサブクラスになっており、キャラ毎に拡張されています。


Shooterでは弾の挙動を定義します。リロード速度や発射する弾の弾速、方向などを定義します。

方向弾を打つShooter、弾幕を打つShooterなど、敵の攻撃毎にShooterを用意しておきます。


一度ShooterのComponentを作ってしまえば、他の敵キャラにそのComponentを付加するだけで同じ弾を撃たせることがでいます。


例えば3面のボスのように、時間で弾の挙動をローテーションさせる程度であれば、Enemyのサブクラスにタイマーを持たせて、それに応じてShooterを付け替えてあげるだけで簡単に実装できたりします。


このように、弾の挙動と敵キャラの挙動を分離して拡張できるような設計が行えました。今回は時間がなくて、Shooterのサブクラスを定義せず、弾の種類をenumで持たせて切り替えているだけなのですが、弾幕の種類が増えてきたときなど、大変管理がしやすそうです。


この設計は、Componentを上手く利用できた好例かと思います。


上手くComponent化ができると、弾の速度、発射感覚、無敵時間、HP、爆風の種類まで細かくGUIだけで編集できるようになります。

f:id:gigi-net:20121022085321j:plain

ソースコード

Booで書かれているので参考になるかどうかわかりませんが、ご興味のある方はどうぞ

giginet/KawazShooting

レベルデザイン

ここまで出そろってしまえば、あとはレベルデザインの段階に入ります。


時間としては、コードを書いている時間よりも、ステージを変更して試行錯誤したり、他のゲームのプレイ動画を見たり、遊んでみたりという部分に多くの時間が割かれています。

規模と難易度

このゲームには、ボス戦を実装することが途中でほぼ決まっていたので、たぶん2~3ステージぐらいが限界だなぁと考えつつ開発を開始しました。


そのため、簡単な難易度ではあっという間にクリアされてしまうので、ある程度の難易度を保ちつつ、かつクリア可能にする必要がありました。


今作では、戻り復活を採用して、細かく復帰地点を設定することで、やり直しが容易になり、全体的な難易度を底上げすることができました。


本来、シューティングのおもしろさを保ちつつ、難易度を上げるには厳密な弾幕をデザインして、避ける楽しさを提供するのが理想的なのですが、敵の移動ルートを細かく指定したりがシステム的にできなかったり、美しい弾幕を作るノウハウや調整時間を持ち合わせていなかったので、弾の数を闇雲に増やす方向で難易度を調整しています。

その代わり、自機に体力をつけることで、ある程度弾が多くても突破できるようにしました。

そのため、本家『まもるクン』のような弾幕シューティングよりTPSよりのバランスになってます。自機に体力をつける方が圧倒的に調整が楽だなぁと。

開発側が楽をするためにこのようなシステムになりましたが、場所によってはごり押しできてしまったりするので、あまり美しくないなぁとは思っています。

無意識のチュートリアル

3ステージしか作れなかったので、詰め込まざるを得なかったのですが、本来、新たな要素は徐々に配置していくべきです。


例えば、1面ではあえてもっこりしか敵キャラを配置していません。また、道中の見えやすい避けられない位置にオプションや柱を置いて、無意識のうちにギミックを把握できるように心がけています。


2面になるとようやくモルボル、3面では丸太やバキュラが登場します。


せっかく作ったのだから最初からいろいろ載せたくなるのが人の子というモノですが、プレイヤーにとってはあまりに要素が増えると良くないので、マニュアルを読まなくても遊べるレベルデザインが理想的だと思ってます。

完成、公開へ

タイトルに偽りがあって、実際には土日の1日だけでは完成しなかったので、平日の夜にもちょくちょく開発しています。


Unityはあまり大規模な開発には向かない気がして、これぐらいの規模のゲームだと、すぐにリリースしてしまった方が良いと思っています。


経験上、時間をかけるとだんだんと飽きてくるので、ある程度の完成度になったらすぐに出しましょう。あふれ出るアイディアや載らなかったギミックは2や3に回せば良いのです。


この記事も長すぎて飽きてきたのでそろそろ筆を置きます。

まとめ

ゲームを作り慣れている人からすると、クロスプラットフォームのゲームをこんなにも簡単に開発できるプラットフォームは魅力的。


しかし、初心者にとっては世間では「Unityで簡単にゲームが作れる!」と喧伝されていますが、モデルがないとまともなゲームは作れないし、ゲームシステム自体もゲームプログラミングに慣れていないと何から手をつけていいかわからないと思います。やっぱり敷居は高いようです。


ここ1~2年で、初心者向けの書籍や解説が充実してきたので、時間さえかければ初心者でもゲーム1本作ることは可能だと思います。


みんなゲーム作ろうぜ!!!


そしてゲーム開発へご興味を持った方はKawazへぜひ

札幌ゲーム制作者コミュニティKawaz

*1:機能が追加されたPro版は有料ですが、基本無料

*2:Android/iOS向けに書き出すには別途有料ライセンスが必要です