Developer

【Unity実践】#20 敵キャラクターの作成②【ランゲーム】
2022.01.05
Lv2

【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