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

chasing IT

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

スポンサーリンク

成果物

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

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

    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);
    }

接近すると動き出す

ついでに。normalizedをかけない相互距離が、ある程度の範囲の場合のみ動くようにしてやれば、
「近づくと動き出す」敵を実装することもできます。ご参考まで。
//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の時期に書き始めているので、それより前のバージョンについては言及しません。

コメント

モバイルバージョンを終了