Unityゲームの作り方メモ格闘ゲーム

【Unity】2D格闘ゲームの作り方②!攻撃&ダメージ判定を実装する方法!

Unity

1. はじめに

前回の記事では、プレイヤーの移動やアニメーションの切り替えを実装しました。
キャラクターを動かせるようになったことで、ゲームらしくなってきましたね!

しかし、格闘ゲームといえば「攻撃」と「ダメージ判定」が欠かせません。
そこで、この記事ではプレイヤーが攻撃できるように
し、敵にダメージを与える処理を実装していきます!

具体的には、以下の内容を解説します。

攻撃範囲(AttackPoint)の作成
攻撃アクションのスクリプト実装(Spaceキーで攻撃)
攻撃が当たったときに敵がダメージを受ける処理
攻撃アニメーションとダメージアニメーションの切り替え
敵のHP管理と倒れる処理

プレイヤーが剣を振ると敵に攻撃が当たり、ダメージを受けた敵がモーションを変える…
そんなリアルなバトル演出を作っていきます!

今回の実装を終えれば、「攻撃→ダメージ→敵が倒れる」といった格闘ゲームの基本システムが完成します。
ぜひ一緒にチャレンジしてみましょう!🔥

それでは、攻撃範囲の作成から始めていきます! 🚀



2. 攻撃範囲の設定

プレイヤーが攻撃をするときに、どこに当たり判定を作るかを決める必要があります。
今回は、剣の位置を基準に攻撃範囲(AttackPoint)を設定し、その範囲内に敵がいる場合にダメージを与えるようにします。


2.1 AttackPointの作成

まず、プレイヤーの攻撃判定を行うための空のオブジェクトを作成します。

AttackPointを作成

  1. Hierarchy(ヒエラルキー)ウィンドウで「Player」を選択
  2. 右クリック → Create Empty を選択(新しい空のオブジェクトを作成)
  3. 名前を「AttackPoint」に変更
  4. Inspector(インスペクター)ウィンドウでTransformを調整
    • AttackPointを剣の中心あたりに移動
    • Position(X, Y, Z)を微調整し、攻撃範囲を適切な位置に配置

💡 ポイント:
AttackPointの位置がプレイヤーキャラクターの剣の振り下ろし位置にあると、攻撃判定が正しく働きます!


2.2 敵にレイヤーを設定

次に、プレイヤーの攻撃が敵にだけ当たるようにするために、敵のレイヤーを設定します。

レイヤーの追加手順

  1. Inspectorウィンドウで「Layer」をクリック
  2. 「Add Layer」を選択
  3. 新しいレイヤーを2つ追加
    • Player
    • Enemy
  4. 敵のオブジェクトを選択し、「Enemy」レイヤーを適用

この設定をすることで、攻撃判定が特定のレイヤー(Enemy)にのみ反応するようになります!


2.3 攻撃範囲を見えるようにする

攻撃範囲が正しく設定されているか確認するため、Gizmos(ギズモ)を使って攻撃範囲を表示させます。

PlayerManagerにGizmosを追加

private void OnDrawGizmos()
{
// 攻撃範囲を視覚的に確認するための円を描画
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(attackPoint.position, attackRadius);
}

このコードを追加すると、UnityエディターのSceneビューで攻撃範囲が円で表示されるようになります。

次は、Spaceキーを押したときに攻撃アクションが実行されるようにスクリプトを実装していきます! 💥



3. スクリプトで攻撃を実装

攻撃範囲(AttackPoint)を作成したので、次はプレイヤーが攻撃できるようにスクリプトを実装していきます。
Spaceキーを押すと攻撃モーションが再生され、攻撃範囲にいる敵にダメージを与えるようにしていきます!


3.1 PlayerManagerスクリプトの更新

プレイヤーの攻撃処理をPlayerManagerスクリプトに追加します。
以下の手順でスクリプトを作成または編集してください。

① PlayerManagerスクリプトに変数を追加

using UnityEngine;

public class PlayerManager : MonoBehaviour
{
    public float moveSpeed = 3f;  // 移動速度
    Rigidbody2D rb;
    Animator animator;

    public Transform attackPoint;  // 攻撃の発生地点
    public float attackRadius = 0.5f;  // 攻撃の当たり判定の半径
    public LayerMask enemyLayer;  // 敵のレイヤーを指定

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space)) 
        {
            Attack();
        }

        Move();
    }

    private void Attack()
    {
        // 攻撃モーションを再生
        animator.SetTrigger("Attack");

        // 攻撃範囲にいる敵を検出
        Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(attackPoint.position, attackRadius, enemyLayer);
        foreach (Collider2D enemy in hitEnemies)
        {
            Debug.Log(enemy.gameObject.name + " に攻撃!");
        }
    }

    private void OnDrawGizmos()
    {
        // 攻撃範囲を可視化
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireSphere(attackPoint.position, attackRadius);
    }

    void Move()
    {
        float x = Input.GetAxisRaw("Horizontal");

        if (x > 0) transform.localScale = new Vector3(1, 1, 1);
        if (x < 0) transform.localScale = new Vector3(-1, 1, 1);

        animator.SetFloat("Speed", Mathf.Abs(x));

        rb.velocity = new Vector2(x * moveSpeed, rb.velocity.y);
    }
}

3.2 スクリプトの解説

✅ Spaceキーで攻撃モーションを再生

animator.SetTrigger("Attack");

「Attack」トリガーを使って攻撃アニメーションを再生します。
後ほどAnimatorウィンドウでアニメーションの遷移を設定します。

✅ 攻撃範囲にいる敵を検出

Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(attackPoint.position, attackRadius, enemyLayer);

AttackPointの位置から半径 attackRadius の範囲内にいる敵(enemyLayerのレイヤー)をすべて検出。

✅ 攻撃が当たった敵の名前をログに表示

foreach (Collider2D enemy in hitEnemies)
{
Debug.Log(enemy.gameObject.name + " に攻撃!");
}

攻撃が当たった敵の名前をデバッグログに表示します。(あとでダメージ処理を追加)


3.3 Unityエディターでの設定

① PlayerManagerのInspectorウィンドウで以下を設定

  • AttackPoint には作成した AttackPointオブジェクト をドラッグ&ドロップ
  • EnemyLayerEnemy に設定
  • AttackRadius0.5(適宜調整)

② Sceneビューで攻撃範囲が可視化されることを確認

  • Sceneビューで黄色の円が表示される
  • 円の大きさが適切か調整する

3.4 実行テスト

  1. 敵キャラクターを適当な位置に配置
  2. プレイヤーを近づけて Spaceキー を押す
  3. Console(コンソール)ウィンドウに「敵の名前 + “に攻撃!」」と表示される

格闘ゲームの攻撃処理は、ヒット判定やコンボシステムなどを実装するとなると非常に複雑になります。
もし一から作るのが大変なら、Universal Fighting Engine 2 Basic を活用するのもアリ!
このアセットなら、基本的な格闘ゲームのシステムがすべて揃っているので、すぐに本格的なゲームを作成できます。


これで、攻撃アクションの基本実装ができました!🎉
次は、攻撃アニメーションを作成し、よりリアルな戦闘システムにしていきます! 💥




4. 攻撃アニメーションを作成

プレイヤーが攻撃するときに、剣を振るアニメーションが再生されるようにします。
また、攻撃が当たった敵はダメージモーションを再生することで、視覚的に「攻撃が当たった」ことが分かるようにします。


4.1 プレイヤーの攻撃モーション

プレイヤーの攻撃時にアニメーションが再生されるように、新しい攻撃モーションを作成します。

① 攻撃アニメーションの作成

  1. Project ウィンドウで HeavyBandit_19~23 を選択
  2. そのまま Player(プレイヤーキャラ)にドラッグ&ドロップ
  3. 「新しいアニメーションを作成しますか?」と表示されたら「保存」
  4. 名前を「HeavyBandit_Attack」に変更

4.2 敵のダメージモーション

敵が攻撃を受けたときに、ダメージアニメーションを再生できるようにします。

① ダメージアニメーションの作成

  1. Project ウィンドウで LightBandit_32, 33 を選択
  2. そのまま Enemy(敵キャラ)にドラッグ&ドロップ
  3. 「新しいアニメーションを作成しますか?」と表示されたら「保存」
  4. 名前を「LightBandit_Damage」に変更



5. アニメーションの切り替え

プレイヤーが Spaceキー を押したときに、攻撃アニメーションが再生されるように設定します。
これを実現するために、Animatorの設定スクリプトの更新を行います。


5.1 攻撃時のアニメーション設定

まずは、プレイヤーの Idle(待機) モーションから Attack(攻撃) モーションへの遷移を作成します。

① Animator の設定

  1. Unityエディターで Player(プレイヤーキャラ) を選択
  2. Inspector(インスペクター)で Animator を開く
  3. Idle(待機) モーションを右クリック → Make TransitionAttack(攻撃) モーションへ矢印を作成
  4. パラメータを作成
    • 「Parameters」タブを開く
    • + ボタンをクリックし、Trigger を追加(名前は Attack

② 遷移の設定

  1. 矢印(遷移)をクリック
  2. 「Has Exit Time」のチェックを外す
  3. 「Transition Duration」を 0 に設定
  4. 「Conditions」欄に Attack を追加

これで、スクリプトから Attack トリガーを設定すると、攻撃アニメーションが再生されるようになります!攻撃モーションから戻るほうの矢印も同じように設定します。


5.2 スクリプトで攻撃モーションを再生

次に、スクリプトで Spaceキー を押したときに攻撃アニメーションが再生されるようにします。

① PlayerManager スクリプトを更新

private void Attack()
{
animator.SetTrigger("Attack");
}

5.3 動作確認

  1. プレイヤーを Hierarchy に配置
  2. Spaceキー を押す
  3. 攻撃アニメーションが再生されることを確認

これで、Spaceキーを押すとプレイヤーが攻撃アニメーションをするようになりました! 🎉
次は、攻撃が敵に当たったときにダメージを与える処理を追加していきます! 🔥




6. ダメージ判定の追加

これまでにプレイヤーの攻撃アニメーションを作成しました。
次は、攻撃が敵に当たったときにダメージを受ける処理を追加します!

これを実現するために、以下の3つの設定を行います。

敵のダメージアニメーションを設定
敵のスクリプト(EnemyManager)を作成
攻撃時に敵がダメージを受けるようにスクリプトを修正


6.1 敵のアニメーション設定

まず、敵のダメージアニメーションを設定し、攻撃を受けたときに再生されるようにします。

① Animatorでダメージモーションを設定

  1. Hierarchy(ヒエラルキー)ウィンドウで Enemy(敵キャラ) を選択
  2. Inspector(インスペクター)で Animator を開く
  3. Idle(待機) モーションを右クリック → Make TransitionLightBandit_Damage(ダメージ) モーションへ矢印を作成
  4. パラメータを作成
    • 「Parameters」タブを開く
    • + ボタンをクリックし、Trigger を追加(名前は Damage

② 遷移の設定

  1. 矢印(遷移)をクリック
  2. 「Has Exit Time」のチェックを外す
  3. 「Transition Duration」を 0 に設定
  4. 「Conditions」欄に Damage を追加

これで、スクリプトから Damage トリガーを設定すると、ダメージアニメーションが再生されるようになります!


6.2 敵のスクリプト作成

次に、攻撃を受けたときにダメージモーションを再生するスクリプトを作成します。

EnemyManager.cs を作成

  1. Project ウィンドウを開く
  2. 右クリック → CreateC# Script を選択
  3. 名前を EnemyManager に変更
  4. EnemyManager.cs を開き、以下のコードを入力
  5. 作成したスクリプトを Enemy(敵キャラ) にアタッチ

EnemyManager.cs のコード

using UnityEngine;

public class EnemyManager : MonoBehaviour
{
    Animator animator;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    public void OnDamage()
    {
        animator.SetTrigger("Damage");
    }
}

このスクリプトを敵にアタッチすると、OnDamage() が呼ばれたときにダメージアニメーションが再生されるようになります。


6.3 プレイヤーの攻撃時にダメージ処理を呼び出す

最後に、プレイヤーが攻撃したときに敵がダメージを受ける処理を追加します。

PlayerManager.csAttack() を修正

private void Attack()
{
    animator.SetTrigger("Attack");

    Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(attackPoint.position, attackRadius, enemyLayer);
    foreach (Collider2D enemy in hitEnemies)
    {
        Debug.Log(enemy.gameObject.name + " に攻撃");
        enemy.GetComponent<EnemyManager>().OnDamage();
    }
}

このコードを追加することで、攻撃範囲内の敵が OnDamage() を呼び出し、ダメージアニメーションに切り替わるようになります!


6.4 動作確認

  1. プレイヤーを Hierarchy に配置
  2. 敵キャラクターを Hierarchy に配置
  3. Spaceキー を押して攻撃
  4. 攻撃が当たると、コンソールに「敵の名前 + “に攻撃”」と表示される
  5. 敵が攻撃を受けると、ダメージアニメーションが再生される

🎉 これで、攻撃が敵に当たるとダメージアニメーションが再生されるようになりました!
次は、敵のHPを管理し、倒れる処理を追加していきます! 🔥




7. HPと倒れるアニメーション

これまでに、プレイヤーの攻撃が敵に当たった際にダメージアニメーションが再生されるようになりました。
ここからは、敵のHPを管理し、HPが0になったら倒れるアニメーションを再生する処理を追加していきます。

敵の「倒れる」アニメーションを作成
HPと攻撃力をスクリプトで管理
HPが0になったら倒れる処理を実装


7.1 倒れるアニメーションの作成

まず、敵がHP0になったときに再生される**「倒れる」アニメーション**を作成します。

① 倒れるアニメーションの設定

  1. Project ウィンドウで LightBandit_35 を選択
  2. そのまま Enemy(敵キャラ)にドラッグ&ドロップ
  3. 「新しいアニメーションを作成しますか?」と表示されたら「保存」
  4. 名前を「LightBandit_Die」に変更

② Animator の設定

  1. Enemy の Animator を開く
  2. 「Idle(待機)」モーションから「LightBandit_Die」に矢印を作成
    • Idle を右クリック → Make TransitionLightBandit_Die へ矢印を繋ぐ
  3. パラメータを設定
    • + ボタンをクリックし、Trigger を作成(名前は Die
  4. 遷移の設定
    • 矢印をクリック
    • 「Has Exit Time」のチェックを外す
    • 「Transition Duration」を 0 に設定
    • Conditions に Die を設定

これで、スクリプトから Die トリガーを設定すると、敵が倒れるアニメーションが再生されるようになります!


7.2 HPと攻撃力を実装

次に、敵にHPを持たせ、攻撃を受けるたびにHPを減らし、0になったら倒れる処理を追加します。

EnemyManager.cs の更新

using UnityEngine;

public class EnemyManager : MonoBehaviour
{
    Animator animator;
    public int hp = 3;  // 敵のHP

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    public void OnDamage(int damage)
    {
        hp -= damage;  // ダメージを受けてHPを減らす
        animator.SetTrigger("Damage");

        if (hp <= 0)
        {
            Die();
        }
    }

    private void Die()
    {
        hp = 0;  // HPが0以下になったら倒れる
        animator.SetTrigger("Die");
    }
}

② スクリプトのポイント

hp -= damage; で敵のHPを減少
if (hp <= 0) Die(); でHPが0になったら倒れる処理を実行
Die() メソッドで Die トリガーを発動し、倒れるアニメーションを再生


7.3 Playerの攻撃力を設定

次に、プレイヤーが**敵に与えるダメージ(攻撃力)**を設定します。

PlayerManager.csAttack() を修正

private int attackPower = 1;  // プレイヤーの攻撃力

private void Attack()
{
    animator.SetTrigger("Attack");

    Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(attackPoint.position, attackRadius, enemyLayer);
    foreach (Collider2D enemy in hitEnemies)
    {
        Debug.Log(enemy.gameObject.name + " に攻撃");
        enemy.GetComponent<EnemyManager>().OnDamage(attackPower);
    }
}

② スクリプトのポイント

attackPower = 1; でプレイヤーの攻撃力を設定
enemy.GetComponent<EnemyManager>().OnDamage(attackPower); で攻撃力分のダメージを敵に与える
敵のHPが0になったら倒れるアニメーションが再生される


7.4 動作確認

  1. 敵のHPを 3 に設定(EnemyManager.cs
  2. プレイヤーが Spaceキー で攻撃
  3. 攻撃が当たると、コンソールに「敵の名前 + “に攻撃”」と表示
  4. 敵のHPが減少
  5. 3回攻撃すると、敵が倒れるアニメーションが再生

🎉 これで、敵にHPが設定され、プレイヤーの攻撃によって倒れるようになりました!




8. まとめ

この記事では、プレイヤーの攻撃アクションと敵のダメージ処理を実装しました!
プレイヤーが Spaceキー を押すと攻撃し、攻撃範囲内の敵にダメージを与え、HPが0になると倒れるようになりました。


今回実装したこと

攻撃範囲(AttackPoint)の作成
攻撃アニメーションの設定
敵のダメージアニメーションの設定
プレイヤーの攻撃が敵に当たる処理
敵のHP管理と倒れる処理

これで、格闘ゲームの基本となる「攻撃 → ダメージ → 敵が倒れる」流れが完成しました! 🎮✨


今回の記事では、基本的な攻撃処理やアニメーションの切り替えを実装しました!
ただ、本格的な格闘ゲームを作るなら、必殺技やコンボシステム、ガードなどの要素も必要です。
「もっと簡単に格闘ゲームを作りたい!」という方には、Universal Fighting Engine 2 Basic がオススメ!
このアセットを使えば、プロレベルの格闘ゲームの仕組みがすぐに実装できます。




よくある質問(FAQ)

Q
攻撃の当たり判定が正しく機能しません。どうすればいいですか?
A

AttackPointの位置が正しく設定されているか確認し、Physics2D.OverlapCircleAllの半径(attackRadius)を調整してください。また、敵にEnemyレイヤーが設定されているか確認してください。

Q
Spaceキーを押しても攻撃アニメーションが再生されません。
A

PlayerManagerのAttackメソッド内で animator.SetTrigger("Attack"); を実行しているか確認してください。また、AnimatorのParametersに「Attack」のTriggerが正しく設定されているかチェックしましょう。

Q
敵のHPが減らず、倒れるアニメーションが再生されません。
A

OnDamage(int damage) メソッド内で hp -= damage; が正しく処理されているか、hpが0以下になったときに Die() が呼ばれているか確認してください。

タイトルとURLをコピーしました