Categories: Unity

Unity本の作例改造-Chapter5-1:スタート&ゴールを作成してタイマーを制御する

こんにちは!Unityの入門書で通称”ヒヨコ本”として親しまれている”Unity5入門 最新開発環境による簡単3D&2Dゲーム制作 “の作例に色々とゲーム要素を追加してオリジナルゲームに仕上げる内容を連載中。

Chapter1:Unityの概要と基礎知識
Chapter2:インターフェイスと使い方
Chapter3:Unityを使ってみよう!
Chapter4:キャラクターを動かしてみよう!
Chapter5:ゲームのUIを作ってみよう!
Chapter6:ゲームを作ろう!(1)
Chapter7:ゲームを作ろう!(2)
Chapter8:2D機能を使ってみよう!

Chapter5:スタート&ゴールオブジェクトを作成してタイマーと連動させる

前回は“プレイヤーのキャラクターコントローラーを変更する”を行いました。今回はスタート地点とゴール地点を作成してタイマーと連動させてみます。

Cylinder オブジェクトの編集

スタート地点となるオブジェクトを作ります。
[Hierarchy]ウィンドウ > [Create]ボタン > 3D Object > Cylinder を選択。
名前を”Start Point”に変更します。
[Inspector]ウィンドウ > Transform コンポーネントで位置とサイズを調整します。
Position X 5 / Y 0 / Z 5 / Scale X 2 / Y 0.1 / Z 2

Collider コンポーネントの編集

Cylinder オブジェクトに最初からある Capsule Collider はタイマーをスタートさせるためのスイッチとして使用するので Capsule Collider コンポーネント > is Trigger にチェックを入れます。

キャラクターが”Start Point”にめり込まないように形状の衝突判定用にMesh Collider を追加します。
[Add Compornent]ボタンをクリック > Physics > Mesh Collider を選択。
Convex にチェックを入れておきます。

[Scene]ビューで”Start Point”を見るとこんな感じになりました。

ゴール地点のオブジェクトを作成する

スタート地点のオブジェクト”Start Point”をプレハブとして登録。
[Hierarchy]ウィンドウ > Start Point を右クリック > Duplicate を選択して複製。
名前を”Goal Point”に変更します。
[Inspector]ウィンドウ > Transform コンポーネントで位置を調整します。
Position X 5 / Y 0 / Z 10

[Scene]ビューで”Start Point”と”Goal Point”を見るとこんな感じに。後で動作テストを行うので近い場所に配置しました。

ゲーム管理用のオブジェクトとスクリプトを作成

ゲーム管理用のオブジェクトとスクリプトを作成します。
[Hierarchy]ウィンドウ > Manager を選択。[Inspector]ウィンドウ > [Add Compornent]ボタンをクリック > New Script を選択。
Name Manager / Language C Sharp に設定。スクリプトコンポーネントが追加されます。

追加したスクリプト”Manager”を編集します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Manager : MonoBehaviour
{
    // タイマーカウント中の判定フラグ
    public static bool timeElapse;
    
    // ゲームの初期化処理
    void Start()
    {
        // タイマーカウント中の判定フラグを"false"に設定
        timeElapse = false;
    }
}

Java Scriptを削除してC#スクリプト”TimerCount”を作成

Unity5のヒヨコ本ではスクリプトに Java Script のコードを掲載していますが、こちらの記事でも紹介した通りUnity2017.2からJava Scriptを作成できなくなった仕様に合わせてスクリプトをC#に置き換えましょう。

[Hierarchy]ウィンドウ > Canvas > Timerを選択。[Inspector]ウィンドウ > TimerCount (Script)コンポーネントの右上にある歯車アイコン > Remove Compornent をクリックして削除。
[Hierarchy]ウィンドウ > Canvas > StartButtonを削除します。
[Project]ウィンドウ > Assets > Click.jsとTimerCount.jsを削除します。 [Hierarchy]ウィンドウ > Canvas を選択。[Inspector]ウィンドウ > [Add Compornent]ボタンをクリック > New Script を選択。
Name TimerCount / Language C Sharp に設定。スクリプトコンポーネントが追加されます。

タイマー処理のスクリプトを編集

追加したスクリプト”TimerCount”を編集します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// UIコンポーネントを使用できるようにする
using UnityEngine.UI;

public class TimerCount : MonoBehaviour
{
    // テキストオブジェクト"Timer"のTextコンポーネントを格納する変数
    public Text textTimer;
    // タイマーの現在値を格納する変数
    float currentTime;

    // ゲーム実行中の繰り返し処理
    void Update()
    {
        // タイマーカウント中の判定フラグが"true"であれば
        //(スクリプト"Manager"の変数"timeElapse"を参照)
        if (Manager.timeElapse)
        {
            //タイマーの現在値に加算
            currentTime += Time.deltaTime;
            // Textコンポーネントのテキストにタイマーの現在値を文字列として代入
            //(文字列は小数点一桁まで表示)
            textTimer.text = "Timer: " + currentTime.ToString("000.0");
        }
    }
}

スタート地点のオブジェクトにスクリプトを設定

スタート地点のオブジェクト”Start Point”にスクリプトを設定します。
[Hierarchy]ウィンドウ > Start Point を選択。[Inspector]ウィンドウ > [Add Compornent]ボタンをクリック > New Script を選択。
Name StartPoint / Language C Sharp に設定。スクリプトコンポーネントが追加されたら、コンポーネント”StartPoint (Script)”の右上にある歯車アイコン をクリック > Edit Script を選択してエディタを起動。下記の通りコードを入力します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StartPoint : MonoBehaviour
{
    // タイマースタートの処理
    void OnTriggerExit(Collider col)
    {
        // タイマーカウントをスタート
        //(スクリプト"Manager"の変数"timeElapse"を変更)
        Manager.timeElapse = true;
    }
}

ゴール地点のオブジェクトにスクリプトを設定

ゴール地点のオブジェクト”Goal Point”にスクリプトを設定します。
[Hierarchy]ウィンドウ > Goal Point を選択。[Inspector]ウィンドウ > [Add Compornent]ボタンをクリック > New Script を選択。
Name GoalPoint / Language C Sharp に設定。スクリプトコンポーネントが追加されたら、コンポーネント”StartPoint (Script)”の右上にある歯車アイコン をクリック > Edit Script を選択してエディタを起動。下記の通りコードを入力します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GoalPoint : MonoBehaviour {

    // タイマーストップのの処理
    void OnTriggerEnter(Collider col)
    {
        // タイマーカウントをストップ
        //(スクリプト"Manager"の変数"timeElapse"を変更)
        Manager.timeElapse = false;
    }
}

キャラクターとカメラ位置を調整

スタート、ゴールオブジェクトの位置にあわせてキャラクターとカメラの位置を調整します。
キャラクター”PQchan”の位置はこのようにスタート位置と同じに…

カメラ”FreeLookCameraRig”の位置はこんな風に…

動作確認

ゲームを再生してみます。
スタートオブジェクトを離れるとタイマーがスタート。ゴールオブジェクトに乗るとタイマーがストップします。

スタート&ゴールオブジェクトの調整

スタート&ゴールオブジェクトに接触するだけでタイマーが反応してしまうので、キャラクターがオブジェクトの中央に乗らないとタイマーが反応しないように、Capsule Collider のプロパティを調整しました。
Center X 0 / Y 6.5 / Z 0 / Radius 0.3

テキスト”Timer”のサイズ調整

動作確認の際、タイマー数値がはみ出て数字が表示されなくなったので幅を調整しました。
とりあえずこれで大丈夫でしょう。

Terrainの編集とスタート&ゴールオブジェクトの調整

タイマーの動作確認もできたので、スタート&ゴールオブジェクトのレイアウトを考えながらTerrainの編集と調整。

Terrainの設定は[Inspector]ウィンドウ > Terrain > [Settings]ボタンをクリック > Resolution で数値を変更しました。

地形のテクスチャはメニュー:Assets > Import Package > Environment を選択してインポート。
[Project]ウィンドウ > Assets > Standard Assets > Environment > TerrainAssetsを割り当てて調整しました。

[Scene]ビューで見るとこんな感じになります。

スタート地点とゴール地点は下記の通り、対角線上に設置してみました。
Start Point: Position X 50 / Y 1 / Z 50
Goal Point: Position X 150 / Y 1 / Z 150

動作確認

ここまでの内容をWebGLでビルド。スタート時のカメラとキャラクターの向きはゴールに向けてあるので、だいだい真っすぐ走るとゴールにたどり着きます。タイムはおよそ30秒程度になりました。

corevale