Unityで自分に向かってくる敵の弾を作る

自分を狙って飛んでくる敵の弾を作りたいのです。

ある地点に向かってオブジェクトを動かすにはMoveTowardsを使うと出来るそうなので、プレイヤーの位置情報を取得してそこに動かせばいいのだろうと

this.transform.position = Vector3.MoveTowards(this.transform.position, new Vector3(playerpos.x, playerpos.y, playerpos.z), 0.5f);

このように書いてみたところ

自分のほうに飛んでは来たものの、ずっと張り付いて離れなくなってしまった。ずっとプレイヤーの座標を参照してるからずっとその座標を目指してしまう。

位置を参照するのは1回で良さそう。

プレイヤーのボールをP1、敵弾を赤丸とすると

プレイヤーは前に進むわけだからP1の座標を目指して敵弾を飛ばしても命中しないし狙ってる感じがしない。

プレイヤーの移動先のP2の地点の座標をゲットしてそこに飛ばそう。

public class EnemyMove : MonoBehaviour {

   Vector3 tmpE;                        //myballの位置情報をここに入れる 
    public Transform hogeEne;
    GameObject BPninja;     //
    int Ecnt = 0;       //フラグ立てに使う
    float calcZ = 0;    //敵とプレイヤーの距離を測るのに使う

    void Start () {

        this.BPninja= GameObject.Find("MyBall");            //playerposにボール位置情報を格納
        Vector3 playerpos =this.BPninja.transform.position; //
    }

	// Update is called once per frame
	void Update () {

         Vector3 playerpos = this.BPninja.transform.position;    //ball位置情報取得する
            this.calcZ = this.transform.position.z - playerpos.z;   //敵のZ座標からボールのZ座標を引く。これで距離が出る

            if (this.calcZ < 50)    //プレイヤーが弾に近づいて来たら

            {
                if (this.Ecnt == 0)     //ここで一回だけ現在のプレイヤー位置情報を調べる
                {
                    hogeEne = GameObject.Find("MyBall").GetComponent<Transform>();  //ボールを見つける
                    tmpE = hogeEne.transform.position;                              //ボールの位置情報をvector3でtmpに格納
                    this.Ecnt = 2;      //Ecntを2にして再度位置情報をゲットしないようにする
                }

                if (this.Ecnt == 2)     //Ecnt=2ならゲットした位置情報の座標にMoveTowardsで弾を飛ばす
                {
                    this.transform.position = Vector3.MoveTowards(this.transform.position, new Vector3(tmpE.x, tmpE.y, tmpE.z + 10), 0.6f);
                }
            }
        }

上のコードではプレイヤーのボールが敵弾に近づくと弾が発射されるようにしています。狙う位置はプレイヤーの移動先なのでtmpE.z + 10 としてプレイヤーより奥の座標を指定しています。

このコードを敵弾のオブジェクトにD&Dでアタッチして実行してみると

うむ!

プレイヤーが近づくと移動先に向かって敵弾が発射されました!

四角い岩も飛んできたぜ! やった^^v

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です