標的をマシンガンで撃ち落とす本格的なUnityゲーム作りに挑戦してみよう

2014年11月27日(木)
薬師寺 国安

オブジェクトがFloorから落ちた時の領域の設定

床の外側も「Cube」で作成します。「Hierarchy」から「Cube」を配置し、名前を「OutArea」と指定します。「Transform」の各値は、表3のように設定します。

表3 「OutArea(Cube)」の「Transform」の値

PositionX=7Y=-33Z=7
RotationX=0Y=0Z=0
ScaleX=1000Y=5Z=1000

表3を設定すると、図15のように表示されます。周囲の白く表示されている部分が「OutArea」になります。

「OutArea」を設定した

図15:「OutArea」を設定した

プレイ中、この白い「OutArea」は見える必要はありませんので、「OutArea」の「Inspector」内にある「Mesh Renderer」の右端にある「歯車アイコン」をクリックして「Remove Component」を選択して、非表示にします(図16)。

「OutArea」を非表示にした

図16:「OutArea」を非表示にした

「OutArea」の「Insperctor」の「Box Collider」にある「Is Trigger」には、必ずチェックを入れておいてください。後ほど、これに追加するスクリプトで当たり判定をしますので、チェックがないと当たり判定ができません。

では経過時間の表示と、床から落ちてオブジェクトの個数が減っていくScriptを記述します。

スクリプトを記述する

「Hierarchy」から「OutArea」を選択し、「Inspector」の「Add Component」で「OutArea」という名前のScriptを追加します。

「Inspector」内に追加された「Script」の「OutArea」をタブルクリックして、リスト2のコードを記述します。

標的(Cube)が「OutArea」内に入ったかどうかの判定処理(OutArea.js)

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;
 }
}
  1. boolean型の静的変数myOutAreaを宣言します。
  2. int型の静的変数noを宣言します。
  3. boolean型の静的変数、flag1~flag3を宣言します。
  4. 静的変数noを3で、flag1~flag3をfalseでそれぞれ初期化します。
  5. OnTriggerEnterイベントで、オブジェクトがOutAreaに入ったかどうか判定します。
    TagがCube1のオブジェクトがOutAreaに入ったら、myOutAreaとflag1をtrueに変更します。Cube2とCube3についても同様です。
    最後に必ずビルドを行ってください。

次に、「Hierarchy」から「TimeText」を選択し、「Add Component」から「TimeText」スクリプトを追加します。「Inspector」に追加された「Script」の「TimeText」をダブルクリックして、リスト3のコードを記述します。

オブジェクトの残数と経過時間を表示する処理(TimeText.js)

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)
}
  1. 静的変数timeを宣言し、Start関数内で0に初期化しておきます。
  2. OutAreaスクリプトの中で宣言していた静的変数myOutArea、flag1~flag3のいずれかがfalseの場合は、経過時間を表示します。
  3. 変数nowに経過時間を代入し、guiText.textに経過時間を「赤」で表示します。
    終了後には、ビルドが必要です。

最後に、「Hierarchy」から「Cube1」を選択し、「Inspector」内の「Add Component」で「CubeDisappear」というスクリプトを追加し、標的がOutAreaに落ちた際の処理を記述します。コードはリスト4のとおりです。

標的(Cube)の残数を表示し、全て床から落ちると最初から始める処理(CubeDisappear.js)

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);
    }
}
  1. もし、OutAreaスクリプトで宣言していた静的変数myOutAreaがtrueなら、OutAreaスクリプト内で宣言していた静的変数noの値を1ずつ減算します。
  2. GUI Textである「msg」という領域に、残数を表示します。
  3. GoCheckを実行します。
  4. noの値が0になれば、5秒後にまた最初からゲームを開始します。
    いつものように、終了後はビルドが必要です。

「Cube2」と「Cube3」でも各「Cube」を選択し、「Add Component」から「Scripts」を選択して表示される「CubeDisappear」を選択します。これで、「Cube2」と「Cube3」にスクリプトが追加されます。

では、この「Scene」画面を、Unityメニューの[File]ー[Save Scene as]と選択して、「マシンガンでオブジェクトを落とす」という名前で保存しておきましょう。

完成品は動画3のようになります。

動画3:完成版には経過時間と残りの標的数が表示される

これで6回にわたったUnityの解説は終わりです。まだまだ解説していない部分もありますが、その部分については、また別の機会があれば紹介したいと思います。

ほんの数十行のコードを書くだけで、これほどのことができるとは、Unityの底力はすごいと思います。この記事がきっかけになって、読者の皆様がUnityに関心を持っていただければ、大変に嬉しいです。では、長い間のお付き合いありがとうございました。

【参考文献】
浅野祐一、荒川巧也、森信虎 『Unity4入門 最新開発環境による簡単3Dゲーム制作』 SBクリエイティブ(発行年:2013)

薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています