Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 弾を発射 | 敵の行動
Unityでの格闘ゲーム

book弾を発射

メニューを表示するにはスワイプしてください

public class Projectile : MonoBehaviour
{
    [SerializeField] int damage;
    [SerializeField] float speed;
    Rigidbody2D rb;
    Vector2 direction;

    public void Setup(Vector2 direction)
    {
        this.direction = direction;
        rb = GetComponent<Rigidbody2D>();
        transform.right = direction;
        Destroy(gameObject, 6);
    }

    private void Update()
    {
        rb.velocity = direction * speed;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        Debug.Log(collision.gameObject.name);
        if (collision.tag == "Player")
        {
            if (collision.TryGetComponent(out IGetAttacked getAttacked))
            {
                getAttacked.GetAttacked(damage);
                Destroy(gameObject);
            }
        }
    }
}

Projectile クラスは、敵がプレイヤーに向けて発射するプロジェクタイルの挙動を管理する役割。プロジェクタイルの進行方向や速度の設定、移動の更新、衝突時の処理を担当。

Setup メソッド

public void Setup(Vector2 direction)
{
    this.direction = direction;
    rb = GetComponent<Rigidbody2D>();
    transform.right = direction;
    Destroy(gameObject, 6);
}

目的: このメソッドはプロジェクタイルの初期状態を設定。

パラメータ: Vector2 direction パラメータでプロジェクタイルの進行方向を指定。

処理内容: プロジェクタイルの進行方向を設定し、Rigidbody2D コンポーネントを取得、進行方向に回転、6秒後に自動的に削除されるようスケジュール。

Update メソッド

private void Update()
{
    rb.velocity = direction * speed;
}

目的:このメソッドはプロジェクタイルの移動を更新します。

動作:指定された方向と速度でプロジェクタイルを移動させるために、Rigidbody2D の速度を設定します。

OnTriggerEnter2D メソッド

private void OnTriggerEnter2D(Collider2D collision)
{
    Debug.Log(collision.gameObject.name);
    if (collision.tag == "Player")
    {
        if (collision.TryGetComponent(out IGetAttacked getAttacked))
        {
            getAttacked.GetAttacked(damage);
            Destroy(gameObject);
        }
    }
}

目的:このメソッドは他のオブジェクトとの衝突を処理します。

パラメータCollider2D collision パラメータを受け取り、衝突を検出します。

動作:プロジェクタイルが衝突したオブジェクトの名前をログに記録し、タグが "Player" の場合、IGetAttacked インターフェースを実装したコンポーネントが存在すれば、その GetAttacked メソッドを呼び出してダメージを与えます。最後に、プレイヤーに当たった後プロジェクタイルを破壊します。

このように実装した理由

モジュール性と再利用性Projectile クラスは、敵が使用するあらゆる種類のプロジェクタイルに対応できるよう、モジュール化および再利用可能な設計となっています。方向と速度を設定することで、さまざまな挙動を持つプロジェクタイルを作成できます。

効率的な移動処理:移動には Rigidbody2D コンポーネントを使用することで、Unity の物理システムに従った滑らかでリアルな動きを実現しています。

衝突検出とダメージ処理OnTriggerEnter2D メソッドにより、プロジェクタイルがプレイヤーと衝突した際に適切にダメージを与えることができ、プロジェクタイルとプレイヤー間のインタラクションが効果的になります。

SendProjectileState クラス

public class SendProjectileState : State
{
    Animator animator;
    System.Action sendProjectileFunc;

    public SendProjectileState(Animator animator, System.Action sendProjectileFunc)
    {
        this.animator = animator;
        this.sendProjectileFunc = sendProjectileFunc;
    }

    public override void StartState()
    {
        isStateFinished = false;
        animator.SetBool("projectil", true);
    }

    public override void StartAction()
    {
        sendProjectileFunc();
    }

    public override void EndState()
    {
        animator.SetBool("projectil", false);
    }
}

SendProjectileState クラスは、敵が飛び道具を発射する際の挙動を管理する特定のステート。State クラスを継承し、飛び道具攻撃アクションの開始、終了、実行を行うメソッドを含む。

コンストラクタ

コンストラクタはSendProjectileStateを、アニメーション用のAnimatorと飛び道具を発射するアクションで初期化し、対応するメンバ変数に設定する。

StartState メソッド

このメソッドは isStateFinishedfalse に設定し、アニメーター内の "projectil" ブールパラメータを true に設定することで、飛び道具アニメーションを開始します。

StartAction メソッド

このメソッドは sendProjectileFunc を呼び出し、飛び道具を発射するために定義されたアクションを実行します。通常、このメソッドはアニメーターイベントによって呼び出され、アニメーションと飛び道具の発射を同期させます。

EndState メソッド

このメソッドはアニメーター内の "projectil" ブールパラメータを false に設定することで、飛び道具アニメーションを停止します。

この方法を選んだ理由

モジュール化と再利用性: SendProjectileState クラスはモジュール化されており、System.Action を利用することでさまざまな弾発射動作を柔軟に統合可能。

アニメーションとの連携: アニメーターのパラメーターを使用することで、弾の発射が対応するアニメーションと同期し、滑らかでリアルな体験を実現。

弾発射関数

void SendProjectile()
{
    Vector2 direction = (player.position - transform.position).normalized;
    Instantiate(projectile, projectileSendingPosition.position, Quaternion.identity).Setup(direction);
}

SendProjectile メソッドは、プレイヤーに向かって弾を生成し発射する役割。敵からプレイヤーへの方向を計算し、弾を生成して、その方向に進むように設定。

メソッド定義とコンポーネント

メソッド定義: void SendProjectile(): 戻り値のないメソッドで、飛び道具の発射処理を担当。

コンポーネント: Vector2 direction = (player.position - transform.position).normalized; この行は、敵からプレイヤーへの方向を計算。敵の位置をプレイヤーの位置から引き、その結果を正規化(.normalized)することで、長さ1の単位ベクトルとして方向のみを示す。

Instantiate(projectile, projectileSendingPosition.position, Quaternion.identity).Setup(direction); この行は、指定した位置(projectileSendingPosition.position)に回転なし(Quaternion.identity)で新しい飛び道具のインスタンスを生成。生成した飛び道具に対してSetupメソッドを呼び出し、方向を設定する。

Unityアニメーターとの連携

StartAction関数はアニメーターイベントを利用して呼び出し。これにより、敵のアニメーション内で飛び道具を発射したい正確なフレームを指定可能。アニメーションは多数のフレームで構成されているため、このアクションを実行する正確なタイミングを特定することが重要。

question mark

発射体が「Player」というタグの付いたゲームオブジェクトと衝突したとき、何が起こりますか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  9

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 3.  9
some-alt