Unity でのゲーム製作

を掛け合わせ、それを現在の座標に加えることに
Unity でのゲーム製作
海本 健太
よって移動後の座標になる。
中野 中央
3.研究内容
一からシューティングゲームを作るのは困難
だと思ったので Unity の公式サイトを見て、C#
1.まえがき
僕たちは、昨年の課題研究で、eclipse を用いて
の文法や、Unity から提供されている関数の使い
Android 上で動作するアプリケーションの制作を
方を参考にした。
した。そして今回はよりゲーム性のあるものを作
(1) 敵の挙動について
るために、Unity というゲームエンジンを用いて、
敵は数種類用意し(図2)
、それぞれ挙動が違
PC 上でも Android 上でも動作するシューティン
うようにした。
グゲームを制作した。
敵のドット絵は、http://takabosoft.com/edge
の EDGE というフリーソフトを使用して作成し
2.原
理
た。
(1) Unity について
Unity とはゲーム製作に特化した統合開発環境
で、様々なプラットフォームに対応したゲームを
開発するために用いられ、多くの開発者が利用し
ている。身近なものでは、Windows、iOS、Android、
Linux などに対応している。
(2) スクリプトについて
プレイヤーや敵のキャラクター、背景などにス
クリプトを実装し、制御している。今回使用した
プログラミング言語は、C#である。ここで、プレ
イヤーに実装したスクリプトの一部を示す(図
図2 敵キャラクター
1)。
移動の方法はプレイヤーのスクリプトを参考
にした。弾を撃つスクリプトを共用し、それぞれ
の移動方向や速度、弾の撃つ間隔・速度を変える
ことによって、敵の挙動に変化をつけた。例えば
(図2)の左端の敵は、弾を撃つスクリプトに方
向を変える処理を加え、多方向に弾を撃つように
した。また上からやって来るだけでなく画面の下、
あるいは左右から移動してくるような処理も記
述し、敵に個性を持たせた。そして、右端の敵は
図1 プレイヤーのスクリプトの一部
腕や尾などの部位に個別にスクリプトを実装す
ることによって、部位によって様々な動きをする、
これは、プレイヤーの移動について記述したも
ボスらしい挙動にすることができた。
のである。Input.GetAxisRaw 関数で水平垂直方
こうして作成した敵の配置をグループ化し、一
向の入力を取得し、それらに基づいて、プレイヤ
つのオブジェクトにまとめた。そしてそれらを管
ーの移動方向を求める。そのベクトルに移動速度
理するスクリプト(図3)を作成し、オブジェク
1
トを順次発生させるようにした。
時間経過とすることで、高速でアニメーションを
切り替え、点滅させている。そして、下画面では
Sprite Renderer.Color を用いて敵が点滅する際
の色、つまり状態が Damage の時の色を設定して
いる。Color.r、Color.g、Color.b をそれぞれ 0~1.0
の値で割り振ることで設定できる。
(3) 当たり判定について
Unity で当たり判定を追加するには三つの工程
を踏まなければならない。
①当たり判定を行う範囲の設定
Unity では当たり判定のために Polygon Co-
図3 敵管理スクリプトの一部
llider 2D が提供されている。これを使用すると、
waves という配列の中に敵のグループを格納
開発者が自由にポリゴン状に範囲を設定でき
し、前のグループが消滅したら次のグループが呼
る。他にも Circle Collider 2D や Box Collider
び出されるようになっている。これを繰り返すこ
2D などがある。これらを組み合わせることで
とによって、次々に敵が現れるようになる。
複雑な形状のオブジェクトでも当たり判定を
(2) アニメーションについて
設定できる(図5)
。
敵にダメージを与えたときにそのままでは弾
が当たったか分かりづらいので、弾が当たったと
きに敵を点滅させるアニメーション(図4)を加
えた。
図5 複雑な当たり判定の例
図4 アニメーション製作画面
②レイヤーによる当たり判定の制御
当たり判定とは、必ずしもすべてのオブジェ
まず、上画面では、敵の通常の状態(Dummy)
クト同士で行われるものではない。例えば、今
と、被弾したときの状態(Damage)が表示されて
回のようなシューティングゲームでは以下の
いる。この二つの状態を遷移させる条件を定める
ような制限が考えられる。
ことによってそれらに対応したアニメーション
・ プレイヤーとプレイヤーの弾は当たらない
を再生させている。この場合だと Damage への遷
・ 敵と敵の弾は当たらない
移条件を被弾、Dummy への遷移条件を極僅かな
・ プレイヤーの弾と敵の弾は当たらない
2
・ プレイヤーの弾同士は当たらない
Animation といったコンポーネントがある。また、
・ 敵の弾同士は当たらない
開発者が作ったスクリプトもコンポーネントと
・ 敵同士は当たらない
して扱うことができ、複数のスクリプトをオブジ
これらの制限を行う上で最も簡単なのがレ
ェクトに追加することで複雑な処理を制御する
ことができる。また、public+変数宣言をスクリプ
イヤーで当たり判定を制御することである。
レイヤー(Player や Enemy など)を作成し、
トに記述することによって視覚的に数値の変更
それをオブジェクトごとに割り当て、プロジェ
が可能になる。
クト設定でどのレイヤーとレイヤーに当たり
(5) 背景について
判定を適用するかを設定する(図6)
。
縦スクロールのシューティングゲームなので、
上から下へスクロールする背景を製作した。その
際に、背景に使用する画像を 2 枚作成し、それぞ
れのスクロールする速さを変えることで奥行き
を表現した。画像のスクロールとループは
Mathf.Repeat 関数を使って行う。この関数は一
定範囲で繰り返す数値を取得する。今回は時間に
よって画像の Y 座標を変化させ、画像の端が来た
ら再び画像を表示し、ループさせるために次のよ
うに記述した。
float y = Mathf.Repeat (Time.time * speed,1);
ここで、y の値が変化していき、
Vector2 offset = new Vector2 (0, y);
図6 レイヤーの設定
で画像の Y 座標がずれていくオフセットを作成
③スクリプトへの衝突処理の入力
し、
renderer.sharedMaterial.SetTextureOffset-
衝突処理を行いたいオブジェクトのスクリ
プト内に、void OnTriggerEnter2D (Collider-
("_MainTex", offset);
2D c)を入力する。この関数は、オブジェクトが
によって画像に設定し適用する。
他のオブジェクトの当たり判定の範囲に入っ
た時に呼び出される関数である。この関数内に
オブジェクトが衝突した時に行いたい処理を
追加する。例えば敵キャラクターにプレイヤー
の弾が当たった場合、プレイヤーの弾を削除し
て、自身の体力を減らし、そして体力が0以下
の時にはスコアにポイントを追加し爆発のア
ニメーションを再生させ、自身を削除する。
(4) コンポーネントについて
図7 背景
コンポーネントとは、オブジェクトの機能的部
品である。開発者はオブジェクトにコンポーネン
(図7)に示したものが作成した背景である。
トを追加して機能を増やしていくことができる。
滑走路と雲で画像を分けてある。
コンポーネントの種類は様々であり、例えば前述
(5) ビルドについて
し た Polygon Collider 2D や Animator 、
Unity は複数のプラットフォームに対応してビ
3
ルドする事が出来るが、今回は PC と Android 端
末用にビルドした。
図9 完成図
6.参考文献
(1) Unity - Unity Manual
http://docs-jp.unity3d.com/Documentation/Scri
ptReference/
(3) UNITY - Tutorial – 2D Shooting Game
http://japan.unity3d.com/developer/document/t
utorial/2d-shooting-game/
図8 ビルド設定画面
(4) Unity メモ – Android でゲームオブジェク
PC 向けのビルドは Unity 単体で可能だが、
トをタッチする処理
Android 向けにビルドする場合は JDK(Java SE
http://ookumaneko.wordpress.com/2012/05/29/
Development Kit)と Android SDK が必要であり、
unity/
システム環境変数 path と JAVA_HOME に JDK、
(5) [Unity] 他オブジェクトと連携-Find とか
Unity には SDK のパスを通しておかなければな
GetComponent とか SendMessage とか
らない。
http://myoujing.wpblog.jp/2014/06/760/
4.まとめ
限られた時間の中で上手く形に出来るか少し
不安だったが、試行錯誤を繰り返し、アイデアを
出し合い、自分たちの目標とするものに近づけて
いった。Unity では、反映させた結果をすぐに確
認できるので手直しがしやすかった。
5.あとがき
Unity、C#という自分たちが扱ったことのない
開発環境の中での作業だったため、はじめは上手
く動作しなくてもどこをどのように直せばよい
か分からなかった。だが、各サイトを参考にして
少しずつ前進していった。なんとか形にすること
は出来たが、改善点は多数見られたのでそれを今
後の課題としたい。
4