こんにちは!Unityの入門書で通称”ヒヨコ本”として親しまれている”Unity5入門 最新開発環境による簡単3D&2Dゲーム制作
前回は“プレイヤーのキャラクターコントローラーを変更する”を行いました。今回はスタート地点とゴール地点を作成してタイマーと連動させてみます。
スタート地点となるオブジェクトを作ります。
[Hierarchy]ウィンドウ > [Create]ボタン > 3D Object > Cylinder を選択。
名前を”Start Point”に変更します。
[Inspector]ウィンドウ > Transform コンポーネントで位置とサイズを調整します。
Position X 5 / Y 0 / Z 5 / Scale X 2 / Y 0.1 / Z 2
Cylinder オブジェクトに最初からある Capsule Collider はタイマーをスタートさせるためのスイッチとして使用するので Capsule Collider コンポーネント > is Trigger にチェックを入れます。
キャラクターが”Start Point”にめり込まないように形状の衝突判定用にMesh Collider を追加します。
[Add Compornent]ボタンをクリック > Physics > Mesh Collider を選択。
Convex にチェックを入れておきます。
スタート地点のオブジェクト”Start Point”をプレハブとして登録。
[Hierarchy]ウィンドウ > Start Point を右クリック > Duplicate を選択して複製。
名前を”Goal Point”に変更します。
[Inspector]ウィンドウ > Transform コンポーネントで位置を調整します。
Position X 5 / Y 0 / Z 10
ゲーム管理用のオブジェクトとスクリプトを作成します。
[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; } }
Unity5のヒヨコ本ではスクリプトに Java Script のコードを掲載していますが、こちらの記事でも紹介した通りUnity2017.2からJava Scriptを作成できなくなった仕様に合わせてスクリプトをC#に置き換えましょう。
[Hierarchy]ウィンドウ > Canvas > Timerを選択。[Inspector]ウィンドウ > TimerCount (Script)コンポーネントの右上にある歯車アイコン > Remove Compornent をクリックして削除。追加したスクリプト”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
動作確認の際、タイマー数値がはみ出て数字が表示されなくなったので幅を調整しました。
とりあえずこれで大丈夫でしょう。
タイマーの動作確認もできたので、スタート&ゴールオブジェクトのレイアウトを考えながらTerrainの編集と調整。
Terrainの設定は[Inspector]ウィンドウ > Terrain > [Settings]ボタンをクリック > Resolution で数値を変更しました。
地形のテクスチャはメニュー:Assets > Import Package > Environment を選択してインポート。
[Project]ウィンドウ > Assets > Standard Assets > Environment > TerrainAssetsを割り当てて調整しました。
スタート地点とゴール地点は下記の通り、対角線上に設置してみました。
Start Point: Position X 50 / Y 1 / Z 50
Goal Point: Position X 150 / Y 1 / Z 150
ここまでの内容をWebGLでビルド。スタート時のカメラとキャラクターの向きはゴールに向けてあるので、だいだい真っすぐ走るとゴールにたどり着きます。タイムはおよそ30秒程度になりました。