【コードあり】ホーミングミサイルを実装した

お疲れ様です。本日の進捗をご報告いたします。
一週間ぶりぐらいの進捗報告になってしまいました。
なにをやってたかといいますと、ミサイルを実装しておりました。



プレイヤーに向かってミサイルを飛ばすのは楽なんですけど、何も考えずに実装すると、百発百中の精度を誇る殺人ミサイルになってしまいます。
ミサイルの軌道がしきい値を超えたらそのまま当たらずにアッチに飛んでいく、という挙動になぜだかハマってしまって一週間ですわ。
できあがったコードは以下のとおりです。ご参照ください。


    protected new void FixedUpdate()
    {
        // 爆発中は何もしない
        if (time_counter > LiveTime * 60)
        {
            base.FixedUpdate();
            return;
        }
        // プレイヤーとミサイルのベクトル
        Vector2 target_vect = PlayerObject.transform.position - transform.position;
        // プレイヤーとミサイルのベクトルの角度
        float target_ang = Mathf.Atan2(target_vect.y, target_vect.x) * Mathf.Rad2Deg;
        // ミサイルの進行方向のベクトル

        float this_ang = Mathf.Atan2(force_vect.y, force_vect.x) * Mathf.Rad2Deg;

        // ミサイルの進行方向の角度
        float delta_angle = Mathf.DeltaAngle(this_ang, target_ang);

        // ミサイルが±5~30度の間なら方向を補正する
        if (Mathf.Abs(delta_angle) > 5.0f && Mathf.Abs(delta_angle) < 30.0f)
        {
            if (Mathf.Sign(delta_angle) > 0)
            {
                this_ang += 5.0f;
            }
            else
            {
                this_ang -= 5.0f;
            }

            // 角度の制限
            if (15.0f < this_ang && this_ang < 90.0f)
            {
                this_ang = 15.0f;
            }
            
            if (-90.0f < this_ang && this_ang < -15.0f)
            {
                this_ang = -15.0f;
            }

            if (90.0f < this_ang && this_ang < 165.0f)
            {
                this_ang = 165.0f;
            }
            
            if (-165.0f < this_ang && this_ang < -90.0f)
            {
                this_ang = -165.0f;
            }
        }

        // 飛んでく方向を計算
        force_vect = new Vector2(
            Mathf.Cos(this_ang * Mathf.Deg2Rad),
            Mathf.Sin(this_ang * Mathf.Deg2Rad)
            );

        // スプライトが右向きか、左向きか
        if (force_vect.x < 0.0f)
        {
            sr.flipX = true;
        }
        else
        {
            sr.flipX = false;
        }

        time_counter++;

        // 一定の時間飛んだら爆発する


        if (time_counter > LiveTime * 60)

        {
            force_vect = new Vector2(0, 0);
            animator.SetTrigger(Constants.ANIME_BOMB);
        }

        // 親クラスの移動処理を実行する...
        base.FixedUpdate();
    }


以上です。よろしくお願い致します。

0 コメント:

コメントを投稿