標的をマシンガンで撃ち落とす本格的なUnityゲーム作りに挑戦してみよう
オブジェクトがFloorから落ちた時の領域の設定
床の外側も「Cube」で作成します。「Hierarchy」から「Cube」を配置し、名前を「OutArea」と指定します。「Transform」の各値は、表3のように設定します。
Position | X=7 | Y=-33 | Z=7 |
---|---|---|---|
Rotation | X=0 | Y=0 | Z=0 |
Scale | X=1000 | Y=5 | Z=1000 |
表3を設定すると、図15のように表示されます。周囲の白く表示されている部分が「OutArea」になります。
プレイ中、この白い「OutArea」は見える必要はありませんので、「OutArea」の「Inspector」内にある「Mesh Renderer」の右端にある「歯車アイコン」をクリックして「Remove Component」を選択して、非表示にします(図16)。
「OutArea」の「Insperctor」の「Box Collider」にある「Is Trigger」には、必ずチェックを入れておいてください。後ほど、これに追加するスクリプトで当たり判定をしますので、チェックがないと当たり判定ができません。
では経過時間の表示と、床から落ちてオブジェクトの個数が減っていくScriptを記述します。
スクリプトを記述する
「Hierarchy」から「OutArea」を選択し、「Inspector」の「Add Component」で「OutArea」という名前のScriptを追加します。
「Inspector」内に追加された「Script」の「OutArea」をタブルクリックして、リスト2のコードを記述します。
static var myOutArea:boolean; (1) static var no:int; (2) static var flag1:boolean; static var flag2:boolean; (3) static var flag3:boolean; function Start () { (4) no=3; flag1=false; flag2=false; flag3=false; } function OnTriggerEnter(myCol:Collider) (5) { if (myCol.tag=="Cube1") { myOutArea=true; flag1=true; } if (myCol.tag=="Cube2") { myOutArea=true; flag2=true; } if (myCol.tag=="Cube3") { myOutArea=true; flag3=true; } }
- boolean型の静的変数myOutAreaを宣言します。
- int型の静的変数noを宣言します。
- boolean型の静的変数、flag1~flag3を宣言します。
- 静的変数noを3で、flag1~flag3をfalseでそれぞれ初期化します。
- OnTriggerEnterイベントで、オブジェクトがOutAreaに入ったかどうか判定します。
TagがCube1のオブジェクトがOutAreaに入ったら、myOutAreaとflag1をtrueに変更します。Cube2とCube3についても同様です。
最後に必ずビルドを行ってください。
次に、「Hierarchy」から「TimeText」を選択し、「Add Component」から「TimeText」スクリプトを追加します。「Inspector」に追加された「Script」の「TimeText」をダブルクリックして、リスト3のコードを記述します。
static var time:float; (1) function Start () { time=0; } function Update () { if( OutArea.myOutArea==false || OutArea.flag1==false || OutArea.flag2==false || OutArea.flag3==false){ time+=Time.deltaTime; (2) } var now:int=time; guiText.text="<Color=red>TIME:"+ now.ToString()+"</Color>"; (3) }
- 静的変数timeを宣言し、Start関数内で0に初期化しておきます。
- OutAreaスクリプトの中で宣言していた静的変数myOutArea、flag1~flag3のいずれかがfalseの場合は、経過時間を表示します。
- 変数nowに経過時間を代入し、guiText.textに経過時間を「赤」で表示します。
終了後には、ビルドが必要です。
最後に、「Hierarchy」から「Cube1」を選択し、「Inspector」内の「Add Component」で「CubeDisappear」というスクリプトを追加し、標的がOutAreaに落ちた際の処理を記述します。コードはリスト4のとおりです。
function OnTriggerEnter(col:Collider) { if (OutArea.myOutArea==true) { OutArea.no--; (1) var msg=GameObject.Find("msg"); msg.guiText.text="残り:"+OutArea.no.ToString(); (2) GoCheck(); (3) } } function GoCheck() { if(OutArea.no==0) (4) { yield WaitForSeconds (5.0); Application.LoadLevel(Application.loadedLevel); } }
- もし、OutAreaスクリプトで宣言していた静的変数myOutAreaがtrueなら、OutAreaスクリプト内で宣言していた静的変数noの値を1ずつ減算します。
- GUI Textである「msg」という領域に、残数を表示します。
- GoCheckを実行します。
- noの値が0になれば、5秒後にまた最初からゲームを開始します。
いつものように、終了後はビルドが必要です。
「Cube2」と「Cube3」でも各「Cube」を選択し、「Add Component」から「Scripts」を選択して表示される「CubeDisappear」を選択します。これで、「Cube2」と「Cube3」にスクリプトが追加されます。
では、この「Scene」画面を、Unityメニューの[File]ー[Save Scene as]と選択して、「マシンガンでオブジェクトを落とす」という名前で保存しておきましょう。
完成品は動画3のようになります。
これで6回にわたったUnityの解説は終わりです。まだまだ解説していない部分もありますが、その部分については、また別の機会があれば紹介したいと思います。
ほんの数十行のコードを書くだけで、これほどのことができるとは、Unityの底力はすごいと思います。この記事がきっかけになって、読者の皆様がUnityに関心を持っていただければ、大変に嬉しいです。では、長い間のお付き合いありがとうございました。
【参考文献】
浅野祐一、荒川巧也、森信虎 『Unity4入門 最新開発環境による簡単3Dゲーム制作』 SBクリエイティブ(発行年:2013)