今回の内容
前回に続いて、敵キャラクターの作成を行います。
今回は、敵キャラクターが往復運動する処理を作成します。
※初めての方はこちらから
⇒ 【第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

