【Unity初心者】お金をかけずに2D RPGを作る!Step 3:戦闘システム

はじめに

前回はTilemapでマップを作成し、カメラ追従を実装しました。 今回は攻撃・HP管理・ダメージ処理の戦闘システムを実装します。



Step 3の全体の流れ

① 敵キャラクターの配置
② 敵のHP管理スクリプト
③ プレイヤーの攻撃処理
④ プレイヤーのHP管理
⑤ 敵の接触ダメージ

使用する敵素材

Tiny RPG Forestには2種類の敵素材が含まれている:

Assets/Tiny RPG Forest/Artwork/sprites/
├── mole/  ← モグラ敵
│   ├── idle/(front・back・side)
│   └── walk/
└── treant/ ← 木の精敵
    ├── idle/(front・back・side)
    └── walk/

① 敵キャラクターの配置

Moleを配置

Hierarchy → 右クリック → Create Empty
→ 名前を「Mole」に変更
→ Add Component → Sprite Renderer
→ Sprite欄に「mole-idle-front」をドラッグ
→ Transform → Scale を (2, 2, 1) に変更
→ Sprite Renderer → Order in Layer → 2
→ Add Component → Capsule Collider 2D
→ Add Component → Rigidbody 2D
 └ Gravity Scale → 0
 └ Constraints → Freeze Rotation Z ✅

Treantも同様に配置

Hierarchy → 右クリック → Create Empty
→ 名前を「Treant」に変更
→ Add Component → Sprite Renderer
→ Sprite欄に「treant-idle-front」をドラッグ
→ Transform → Scale を (2, 2, 1) に変更
→ Sprite Renderer → Order in Layer → 2
→ Add Component → Capsule Collider 2D
→ Add Component → Rigidbody 2D
 └ Gravity Scale → 0
 └ Constraints → Freeze Rotation Z ✅

⚠️ スプライトが小さい場合はPixels Per Unitを16に変更してApply!


② 敵のHP管理スクリプト

Enemy.cs

using UnityEngine;

public class Enemy : MonoBehaviour
{
    public int maxHP = 3;
    public int attackDamage = 1;
    private int currentHP;

    void Start()
    {
        currentHP = maxHP;
    }

    void OnCollisionEnter2D(Collision2D collision)
    {
        // プレイヤーに触れたらダメージ
        if (collision.gameObject.CompareTag("Player"))
        {
            PlayerHP playerHP = collision.gameObject.GetComponent<PlayerHP>();
            if (playerHP != null)
            {
                playerHP.TakeDamage(attackDamage);
            }
        }
    }

    public void TakeDamage(int damage)
    {
        currentHP -= damage;
        Debug.Log(gameObject.name + " HP:" + currentHP);

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

    void Die()
    {
        Debug.Log(gameObject.name + " を倒した!");
        Destroy(gameObject);
    }
}

MoleとTreantの両方にアタッチする。


③ プレイヤーの攻撃処理

Layerの設定

Edit → Project Settings → Tags and Layers
→ Layers の空いている欄に「Enemy」と入力

HierarchyのMoleをクリック
→ Inspectorの「Layer」→「Enemy」を選択

HierarchyのTreantも同様に「Enemy」を選択

PlayerController.csに攻撃処理を追加

変数を追加(上部):

[Header("攻撃設定")]
public int attackDamage = 1;
public float attackRange = 1.0f;
public LayerMask enemyLayer;

Update()の中に追加:

// 攻撃
if (Input.GetKeyDown(KeyCode.Space))
{
    Attack();
}

Attack()メソッドを追加:

void Attack()
{
    Debug.Log("攻撃!");

    // 攻撃方向を設定
    Vector2 attackDir = Vector2.zero;
    if (lastDirection == "front") attackDir = Vector2.down;
    else if (lastDirection == "back") attackDir = Vector2.up;
    else if (lastDirection == "side")
        attackDir = spriteRenderer.flipX ? Vector2.left : Vector2.right;

    // 攻撃範囲内の敵を検出
    Vector2 attackPos = rb.position + attackDir * attackRange;
    Collider2D hit = Physics2D.OverlapCircle(attackPos, 0.5f, enemyLayer);

    if (hit != null)
    {
        Enemy enemy = hit.GetComponent<Enemy>();
        if (enemy != null)
        {
            enemy.TakeDamage(attackDamage);
        }
    }
}

InspectorでEnemy Layerを設定

HierarchyのPlayerをクリック
→ Player Controller (Script)
→「Enemy Layer」の▼をクリック
→「Enemy」にチェック✅

④ プレイヤーのHP管理

PlayerHP.cs

using UnityEngine;

public class PlayerHP : MonoBehaviour
{
    public int maxHP = 5;
    private int currentHP;

    void Start()
    {
        currentHP = maxHP;
    }

    public void TakeDamage(int damage)
    {
        currentHP -= damage;
        Debug.Log("プレイヤー HP:" + currentHP);

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

    void Die()
    {
        Debug.Log("ゲームオーバー!");
        // Step5でゲームオーバー画面を追加予定
    }
}

PlayerにアタッチしてTagを「Player」に設定:

HierarchyのPlayerをクリック
→ Inspectorの「Tag」→「Player」を選択

完了チェックリスト

  • [x] MoleとTreantが配置されている

  • [x] Spaceキーで攻撃できる

  • [x] 敵にダメージが入る

  • [x] HPが0になると敵が消える

  • [x] 敵に触れるとプレイヤーがダメージを受ける

  • [x] プレイヤーHPが0になるとゲームオーバーログが出る


ハマったポイント

① 敵のスプライトが小さかった

Pixels Per Unitがデフォルトの100のままだった。 16に変更して解決。


次回予告

Step 4:敵AIを作る

敵がプレイヤーを追いかけてくるAIを実装します!

Step 5:UIとセーブ機能

HPバーの表示・ゲームオーバー画面・セーブ機能を実装します!


Unity Personal / Tiny RPG - Forest使用 / 完全無料構成


いいなと思ったら応援しよう!

パパレットスタディ 倉木 勉 よろしければ応援お願いします!