【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使用 / 完全無料構成
いいなと思ったら応援しよう!
よろしければ応援お願いします!
