Unity C#で敵や玉が自分を追いかけてくるようにする方法/Vector2、normalizedの使い方

chasing IT

「敵などがプレイヤーキャラを追いかけてくる」処理の実装方法です。
イメージ的には移動するスクリプトの「移動方向」を敵キャラと自キャラの位置関係から割り出し、一定速度で移動させます。

スポンサーリンク

成果物

cat4
敵キャラが自分を追いかけてくるようにしてみます。

cat1
仮に脱出ゲームからネコチャァンを使いまわし、敵キャラとして移動させてみます。
cat2
敵には任意のコライダーとRigidBody2Dをセットしておきます。
cat3
敵キャラにスクリプトをセットして、public GameObjectで変数を指定し、プレイヤーキャラクターをセットします。
cat4
2Dの「方向と速度(力の強さ)」=ベクトルを意味するVector 2Dに、(player.transform.position – this.transform.position).normalized;を代入します。
プレイヤーキャラの位置(player.transform.position)から敵キャラ=自分の位置(this.transform.position)を引き算しますが、これをそのまま速度に使うと相互距離が近づく=数値が小さくなる=近づくほど遅くなるので、最後にnormalizedを付けて速度を一定化しています。
cat5
この求めたVector2Dはxで横、yで縦方向へ進むベクトルになるので、xをVelocityのx軸に指定してやれば、
cat1
まあ大体目標を達成できます。
cat6
速度を変えたい場合は、()で閉じて掛け算してあげます。
もしこのスクリプトを色々な敵で使いまわす場合、掛け算する数値はpublicで指定しておくとスピードを変更するのが簡単になります。
cat2
あとはこの状態だと後ろに回っても向きを変えずに追ってくるので、
cat7
プレイヤーキャラ-敵キャラの結果が0より大きいかどうかでflipxを切り替えてやれば、
cat4
いい感じに自分を追ってくるネコチャァンが完成します。

    public GameObject player;

    void FixedUpdate()
    {
     //プレイヤー-敵キャラの位置関係から方向を取得し、速度を一定化
        Vector2 targeting = (player.transform.position - this.transform.position).normalized;
        if(targeting.x > 0)
        {
            this.GetComponent().flipX = true;
        }
        else
        {
            this.GetComponent().flipX = false;
        }
     //x方向にのみプレイヤーを追う
        this.GetComponent<Rigidbody2D>().velocity = new Vector2((targeting.x * 5), 0);
    }

接近すると動き出す

aim1
ついでに。normalizedをかけない相互距離が、ある程度の範囲の場合のみ動くようにしてやれば、
a2
「近づくと動き出す」敵を実装することもできます。ご参考まで。
//Unity C#
    void FixedUpdate()
    {
        targeting = (player.transform.position - this.transform.position).normalized;
        targetingAim = (player.transform.position - this.transform.position);
        if (targetingAim.x > 0 && targetingAim.x < searchArea)
        {
            this.GetComponent<SpriteRenderer>().flipX = true;
            this.GetComponent<Rigidbody2D>().velocity = new Vector2(targeting.x * 5, 0);
        }
        else if (targetingAim.x < 0 && targetingAim.x > -searchArea)
        {
            this.GetComponent<SpriteRenderer>().flipX = false;
            this.GetComponent<Rigidbody2D>().velocity = new Vector2(targeting.x * 5, 0);
        }

    }


完成品はこちら

やりたいことから逆引きするUNITYの使い方まとめ
Unityをやりたいことから学習していけるよう、機能・用途別にまとめたページです。C#の命令別の逆引きは現時点で作っていません。2019の時期に書き始めているので、それより前のバージョンについては言及しません。

コメント