コンテンツへスキップ

【Unity】2D アニメーションの中にある攻撃の当たり判定

この記事では、アニメーションの中にある攻撃の当たり判定を方法を解説します。当たり判定の有効・無効の切り替えが重要です。どのように実現しているか確認してみてください。

作るもの(完成形)

Hero Knight – Pixel Art」のシーン「Demo」に追加していく形で作成しました(敵のスプライトは他のアセットを利用しています)。攻撃のアニメーションのときだけ、当たり判定を有効にするところがポイントです。

ゲームオブジェクトの概要

構成(ヒエラルキー)

Hero Knight – Pixel Art」のシーン「Demo」に、追加するゲームオブジェクトは下図の赤枠部分です。

unity-2d-attack-in-animation1

■ AttackSensor:
 攻撃の当たり判定。攻撃のアニメーションのときだけ有効にする。それ以外は無効にする。

■ Dino1、2:
 敵

シーン上のゲームオブジェクト

それぞれのゲームオブジェクトは、下図のようにシーン上に配置します。

unity-2d-attack-in-animation2

ゲームオブジェクトの詳細

AttackSensor(攻撃の当たり判定)

unity-2d-attack-in-animation3

■ Polygon Collider 2D:
 剣の形に合わせてコライダーを設定します。

アニメーションの中に攻撃のスプライト(画像)があります。下記の手順で攻撃時のスプライトを表示・確認することができます。

unity-2d-attack-in-animation5

■ AttackSensorController:
 スクリプトです。

Dino(敵)

unity-2d-attack-in-animation4

■ Rigidbody 2D:
 重力をつけるために追加します。

■ Capsule Collider 2D:
 当たり判定に使用します。

■ DinoController:
 敵のスクリプトです。

プログラム

プログラムの流れ

アニメーション中の攻撃しているスプライトのときだけ、当たり判定を有効にする必要があります。これは、「アニメーションイベント」を利用して実現できます。「アニメーションイベント」は、「アニメーション」ウィンドウから追加します。

攻撃のスプライトの前後で、AttackStart メソッドと AttackEnd メソッドを実行します。これらのメソッドの中で当たり判定の有効、無効を切り替えます。

unity-2d-attack-in-animation6

プログラムの中身

HeroKnight.cs(プレイヤーのスクリプト)

もともとある HeroKnight.cs に以下のプログラムを追加します。

private void AttackStart()
{
    attackSensorCtroller.gameObject.SetActive(true);
    if (GetComponent<SpriteRenderer>().flipX)
    {
        attackSensorCtroller.transform.localScale = new Vector2(-transform.localScale.x, transform.localScale.y);
    }
    else
    {
        attackSensorCtroller.transform.localScale = new Vector2(transform.localScale.x, transform.localScale.y);
    }
}

private void AttackEnd()
{
    attackSensorCtroller.gameObject.SetActive(false);
}

■ 1 行目:AttackStart
 攻撃のスプライトが表示される直前に実行されます

■ 3 行目:
 当たり判定を有効にします

■ 4~11 行目:
 プレイヤーの向きに合わせて、当たり判定の向きも変えています。
 ※プレイヤーが Scale を使って向きを変えている場合はこのプログラムは不要です(親オブジェクトに合わせて子オブジェクトの向きが変わります)

■ 14 行目:
 攻撃のスプライトが表示された後に実行されます

■ 16 行目:
 当たり判定を無効にします

AttackSensorController.cs(攻撃の当たり判定)

中身はありません。空のスクリプトです。

DinoController.cs(敵のスクリプト)

using UnityEngine;

public class DinoController : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision)
    {
        var attackSensor = collision.gameObject.GetComponent<AttackSensorController>();
        if (attackSensor != null)
        {
            Destroy(gameObject);
        }
    }
}

■ 8 ~ 11 行目:
 剣の当たり判定に当たったら、敵を消滅させます。

アニメーションイベントの登録

HeroKnight.cs に追加した AttackStart メソッドと、AttackEnd メソッドが攻撃時に呼び出されるようにします。「アニメーション」ウィンドウを開いて、アニメーションイベントに登録します。

unity-2d-attack-in-animation7
① アニメーションの秒数が表示されているすぐ下のスペースを右クリックすると、「アニメーションイベントを追加」する操作が選択できるようになります
unity-2d-attack-in-animation8
② インスペクタービューにアニメーションイベントの設定画面が表示されるので、AttackStart や AttackEnd メソッドを選択します

以上で、「アニメーションの中にある攻撃の当たり判定」が設定できたと思います。お疲れ様でした。

広告

コメントを残す

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

CAPTCHA