ゲームステージの拡張
ゲームのステージに動くオブジェクトを追加して拡張していきます。
動く道
動く道を追加します。ヒエラルキーウィンドウのRoadを複製し、インスペクターウィンドウでMoveRoadという名称に変更します。
MoveRoadにRigidbodyコンポーネントをアタッチします。RigidbodyのUse Gravityのチェックマークを外し、Is Kinematicにチェックマークをつけます。
ConstraintsのFreeze RotationのX,Y,Zにチェックマークを付けます。
ScriptsフォルダにMoveRoadという名前のスクリプトを作成します。MoveRoadスクリプトをゲームオブジェクトMoveRoadにドラッグ・アンド・ドロップします。MoveRoadスクリプトがゲームオブジェクトMoveRoadにアタッチできているかをインスペクターウィンドウで確認します。
MoveRoadスクリプトに以下のコードを記述します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MoveRoad : MonoBehaviour { private Rigidbody roadRigid; private Vector3 defPos; void Start() { roadRigid = GetComponent<Rigidbody>(); defPos = transform.position; } void Update() { } void FixedUpdate() { roadRigid.MovePosition( new Vector3(defPos.x , defPos.y, defPos.z + Mathf.PingPong(Time.time, 4))); } }
スクリプトの動作確認をします。
MovePositionメソッドを使用して、ゲームオブジェクトの座標を移動させています。
Rigidbody型の変数.MovePosition(移動先の座標)
Mathf.PingPomgメソッドを使用して往復する動きを作ります。
Mathf.PingPong(時間,数値)
Mathf.PingPong(Time.time, 4)の記述を、それぞれ別の座標に足すことで、移動方向を変更できます。
また数値を変更することで、移動距離を変更できます。
例)上下方向に倍の距離を移動する道を作成する。
roadRigid.MovePosition( new Vector3(defPos.x , defPos.y + Mathf.PingPong(Time.time, 8), defPos.z ));
障害物の作成
キャラクターを突き落とす障害物を作成します。ヒエラルキーウィンドウに新たなキューブ(立方体)を追加し、インスペクターウィンドウで、Obstacleと名前を付けます。マテリアルを作成してアタッチしておきます。Rigidbodyコンポーネントをアタッチし、Massの値を10000にし、Use Gravityのチェックマークを外し、ConstraintsのFreeze RotationのX,Y,Zにチェックマークを付けます。
ScriptsフォルダにObstacleという名前のスクリプトを作成します。ObstacleスクリプトをゲームオブジェクトObstacleにドラッグ・アンド・ドロップします。ObstacleスクリプトがゲームオブジェクトObstacleにアタッチできているかをインスペクターウィンドウで確認します。
Obstacleスクリプトに以下のコードを記述します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Obstacle : MonoBehaviour { private Rigidbody obstacleRigid; private float lastTime = 0.0f; private float timeInterval = 4.0f; private float speed = 100f; private float direction = -1.0f; void Start() { obstacleRigid = GetComponent<Rigidbody>(); lastTime = Time.time; direction = -1.0f; } void FixedUpdate() { if (Time.time >= lastTime + timeInterval) { lastTime = Time.time; direction *= -1.0f; obstacleRigid.velocity = Vector3.zero; } Vector3 bearForward = obstacleRigid.transform.right; Vector3 moveVector = speed * (bearForward * direction); moveVector.y = 0; moveVector.z = 0; obstacleRigid.AddForce(moveVector, ForceMode.Impulse); } }
スクリプトの動作確認をします。
transformメソッドは、transform.rightで水平方向、transform.forwardで奥行き方向、transform.upで上下方向に座標を移動させることができます。
例)奥行き方向の移動
Vector3 bearForward = obstacleRigid.transform.forward; Vector3 moveVector = speed * (bearForward * direction); moveVector.x = 0; moveVector.y = 0; obstacleRigid.AddForce(moveVector, ForceMode.Impulse);
例)上下方向の移動
Vector3 bearForward = obstacleRigid.transform.up; Vector3 moveVector = speed * (bearForward * direction); moveVector.x = 0; moveVector.z = 0; obstacleRigid.AddForce(moveVector, ForceMode.Impulse);