Unityちゃんの障害物ゲームを作る

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

タイムの表示とゴールの判定

このゲームではプレイ中に経過時間を表示しつつ、ゴールしたら「Goal!」と表示して、時間表示を止めるようにします。

まず「Hierarchy」内の「unitychan」を選択し、「Inspector」内にある「Layer」の横の「Default」の上下▼部分をクリックし、「Add Layer」をクリックします。表示される「User Layer 8」に「Player」と入力します(図11)。

図11:「Layer」の追加

再度「unitychan」を選択し、「Inspector」内の「Layer」の「Default」から「Player」を選択します。すると、図12のように「Change Layer」の確認ダイアログが表示されるので、「Yes, change children」をクリックします。

図12:「Layer」変更のダイアログ

同様に、「Tag」にも「Player」を指定しておきます(図13)。

図13:「Tag」と「Layer」に「Player」を指定した状態

次に、「Hierarchy」から「GoalArea」を選択し、「Add Component」の「New Script」で「Name」に「GoalArea」、「Language」に「Java Script」を選択して、「Create and Add」をクリックします。すると、「GoalArea」の「Inspector」に「Goal Area(Script)」が追加され、「Script」内の「GoalArea」をダブルクリックするとMonoDevelopが起動しますので、リスト1のコードを入力します。

Playerがゴールしたかどうかの判定コード(GoalArea.js)

static var myGoal:boolean;
myGoal=false;                                   (1)

function OnTriggerEnter(myCol:Collider)
{
 if(myCol.tag=="Player")
 {
  myGoal=true;                                  (2)
 }
}
  1. static型の変数myGoalを宣言し、falseで初期化しておきます。staticは静的変数を表し、そのブロックが終了しても変数値が保持されます。myGoalは他のスクリプトからも利用されるのでstaticと宣言しておきます。
  2. OnTriggerEnterイベントでPlayerがGoalAreaに入ったかどうかを判定し、GoalAreaに入ればmyGoal変数をtrueにします。

次に「Hierarchy」の「Create」で「GUI Text」を追加します。名前は「msg」と指定します。「GUIText」の「Text」は、空にしておきます。その他「Anchor」に「upper left」、「Alignment」に「left」、「Font Size」に「80」、「Font Style」に「Bold(太字)」、「Color(文字色)」に「黄系統色」をそれぞれ指定します(図14)。

図14:「Goal」に表示する文字位置等の指定

次に、もう一個「GUI Text」を配置します。経過時間を表示するものなので、こちらは名前を「TimeText」とします。「GUIText」の中の「Pixel Offset」で、時間を表示する位置を決めます。「X」に「-500」、「Y」に「200」、そして「Font Size」には「40」と指定します(図15)。

図15:時間を表示位置の指定

次に「Add Component」で「New Script」を選び、「Name」に「myTimeScript」、「Language」に「Java Script」を選択して、「Create and Add」をクリックします。「Inspector」の「TimeText」に「myTime Script(Script)」が追加されます。「Script」の中の「myTimeScript」をダブルクリックし、MonoDevelopで、リスト2のコードを記述します。

時間を表示するコード(myTimeScript)

static var time:float;
function Start () {
 time=0;                        (1)
}

function Update () {
 myGoal();                      (2)
}

function myGoal()
{
if (GoalArea.myGoal==false)
 {
  time+=Time.deltaTime; (3)
 }else{
  var msg=GameObject.Find(“msg”);
  msg.guiText.text=”GOAL!”;     (4)
  yield WaitForSeconds (5.0);
  Application.LoadLevel(Application.loadedLevel);
 }
 var now:int=time;              (5)
 guiText.text=”<Color=red>TIME:” + now.ToString()+”</Color>”;
}
  1. 静的変数timeを宣言し、Start関数の中で「0」で初期化しておきます。
  2. Update関数からmyGoal関数を実行します。myGoal関数内では以下の処理を行います。
  3. Playerがまだゴールしていない間は、Time.deltaTimeで、前のフレームと今のフレームの時間的な差分を求めて(単位は秒)、静的変数timeに格納して加算していきます。
  4. ゴールに到達したら、「msg」というGameObjectをFindで見つけて、そのguiTextに「GOAL!」と表示します。5秒待機した後、初期画面に戻ります。
  5. 変数nowに経過する時間を代入し、guiTextに文字色を赤にして経過時間を表示します。

動画1が、実際に動かしたようすです。

動画1:ゴールを目指すUnityちゃん

今回はこれで終わりです。この「Scene」画面をUnityメニューの[File]ー[Save Scene]で保存しておきましょう。
初めてのゲームはいかがだったでしょうか。障害物やゴールの位置は読者の皆さんが自由に決めてください。また、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メルマガ会員のサービス内容を見る

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