【Unity実践】#20 敵キャラクターの作成②【ランゲーム】
今回の内容
前回に続いて、敵キャラクターの作成を行います。
今回は、敵キャラクターが往復運動する処理を作成します。
※初めての方はこちらから
⇒ 【第1回記事】導入とサンプルの紹介
実装の方針と準備
以下の2点間を往復移動する仕様として、実装を進めたいと思います。
・敵キャラクターの開始位置
・任意で指定した終端位置(基本は道の対面を想定)
そこで、終端位置を設定できるように、見えないオブジェクトを用意します。
Bomb を選択して、右クリック > Create Empty で空オブジェクトを追加し、名前を「EndPoint」とします。
EndPointの位置は任意ですが、とりあえず「0, 0, 4.15」としておきます。
往復処理の実装
では往復処理を実装してきますが、動きの流れを書き出すと以下の通りです。
1.終端位置(EndPoint)を目指して移動
2.終端位置に近づくと移動は停止して、180度回転する
3.開始位置を目指して移動
4.開始位置に近づくと移動は停止して、180度回転する
5.以降、1~4を繰り返す
まずは必要なプロパティの追加と、Startでの初期化を実装します。
BombScript に以下を追記してください。
~ 省略 ~ public class BombScript : MonoBehaviour { Animator anim; [SerializeField] Transform endPoint; Vector3 startPos; // 開始位置 Vector3 endPos; // 終端位置 Vector3 destPos; // 次の目的地 float speed = 1f; // 移動速度 float rotateSpeed = 180f; // 回転速度 float rotateNum; // 方向転換時の回転量 void Start() { anim = GetComponent<Animator>(); startPos = transform.position; endPos = endPoint.position; destPos = endPos; } ~ 省略 ~
各プロパティの用途はコメントを参考にしてください。
destPos はタイミングに応じて、startPos か endPos のどちらかを設定します。
(最初は endPos で、戻りは startPos となります。)
endPoint には先ほど追加した EndPoint を設定します。
次に Updateメソッドで、往復処理を実装します。
BombScript の Update に以下を記述して下さい。
~ 省略 ~ public class BombScript : MonoBehaviour { ~ 省略 ~ void Update() { if (GameManagerScript.status != GameManagerScript.GAME_STATUS.Play) { return; } // 端に到達した時の方向転換処理 if ((destPos - transform.position).magnitude < 0.1f) { // 回転途中の場合 if (rotateNum < 180) { anim.SetBool("walk", false); transform.position = destPos; float addNum = rotateSpeed * Time.deltaTime; rotateNum += addNum; transform.Rotate(0, addNum, 0); return; } // 回転し切った場合 // 次の目的地の設定と回転量のリセット else { destPos = destPos == startPos ? endPos : startPos; rotateNum = 0; } } // 次の目的地に向けて移動する anim.SetBool("walk", true); transform.LookAt(destPos); transform.position += transform.forward * speed * Time.deltaTime; } ~ 省略 ~
やや長いですが、基本的な処理の組み合わせとなっていますので、コメントを参考に読んでみて下さい。
良く分からなければとりあえずコピペでかまいません。
アニメーター関連の「walk」は、敵キャラクターにデフォルトで設定されているアニメーターコントローラーのパラメーターです。
スクリプトを保存したらシーンを再生してみて下さい。
敵キャラクターが往復運動をしていれば成功です。
ランダム性を持たせる
少しおまけ的な内容になりますが、敵キャラクターの挙動にランダム性を持たせたいと思います。
項目としては以下の2点です。
・移動速度
・開始位置
BombScript の Startメソッドに以下の通り追記します。
~ 省略 ~ public class BombScript : MonoBehaviour { ~ 省略 ~ void Start() { anim = GetComponent<Animator>(); startPos = transform.position; endPos = endPoint.position; destPos = endPos; // 移動速度をランダムに speed = Random.Range(1.0f, 3.0f); // 開始位置をランダムに transform.position = Vector3.Lerp(startPos, endPos, Random.Range(0.0f, 1.0f)); } ~ 省略 ~
シーンに Bomb を複数配置して、ランダムな挙動となっていれば成功です。
おわりに
これで敵キャラクターの実装は完了となります。
次回はゲームオーバー画面を実装していきたいと思います!
関連リンク ➡ 「初心者のための」Unityゲーム制作 目次
© Unity Technologies Japan/UCL