反撃システムは、SRPGの戦闘に深みを与えます。
適切に実装すれば、戦略性が高まります。
この記事では、実装方法を詳しく解説します。
✨ この記事でわかること
- 反撃条件の判定
- 射程チェックの実装
- 反撃処理の実装
- 連鎖防止の実装
- 実装例とコード

反撃システムは、射程チェックが重要です。攻撃側の射程内にいれば、反撃できます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
反撃条件の判定

反撃条件は、反撃が可能かどうかを判定します。
実装方法を紹介します。
反撃判定システム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using UnityEngine; public class CounterSystem : MonoBehaviour { public bool CanCounter(Unit attacker, Unit defender) { // 生存しているかチェック if (defender.currentHP <= 0) { return false; } // 反撃可能な武器かチェック if (!defender.weapon.canCounter) { return false; } // 射程チェック if (!IsInRange(defender, attacker)) { return false; } return true; } bool IsInRange(Unit attacker, Unit target) { float distance = Vector2Int.Distance(attacker.position, target.position); return distance <= attacker.weapon.range; } } |
このコードで、反撃判定が実装できます。
生存、武器、射程をチェックして、反撃可能か判定します。
反撃条件の種類
✅ 反撃条件の種類
- 生存チェック:HPが0より大きい
- 武器チェック:反撃可能な武器を持っている
- 射程チェック:攻撃側が射程内にいる
- 状態チェック:麻痺などの状態異常がない
これらの条件を満たせば、反撃できます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
射程チェックの実装

射程チェックは、反撃の核心です。
実装方法を紹介します。
射程判定システム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public class RangeChecker : MonoBehaviour { public bool IsInAttackRange(Unit attacker, Unit target) { float distance = Vector2Int.Distance(attacker.position, target.position); return distance <= attacker.weapon.range; } public bool CanCounterAttack(Unit defender, Unit attacker) { // 攻撃側が防御側の射程内にいるかチェック return IsInAttackRange(defender, attacker); } public List<Vector2Int> GetAttackablePositions(Unit unit) { List<Vector2Int> positions = new List<Vector2Int>(); Vector2Int center = unit.position; int range = unit.weapon.range; for (int x = -range; x <= range; x++) { for (int z = -range; z <= range; z++) { float distance = Mathf.Sqrt(x * x + z * z); if (distance <= range) { positions.Add(center + new Vector2Int(x, z)); } } } return positions; } } |
このコードで、射程チェックが実装できます。
距離を計算して、射程内か判定します。

射程チェックは、ユークリッド距離で計算しましょう。これにより、正確な判定ができます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
反撃処理の実装

反撃処理は、反撃を実行します。
実装方法を紹介します。
反撃実行システム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public class CounterAttackSystem : MonoBehaviour { public CounterSystem counterSystem; public DamageCalculator damageCalculator; private bool isCountering = false; // 連鎖防止フラグ public void ProcessAttack(Unit attacker, Unit defender) { isCountering = false; // 通常攻撃 int damage = damageCalculator.CalculateDamage(attacker, defender); defender.TakeDamage(damage); // 反撃判定 if (counterSystem.CanCounter(attacker, defender)) { ExecuteCounter(defender, attacker); } } void ExecuteCounter(Unit counterAttacker, Unit target) { if (isCountering) { return; // 連鎖防止 } isCountering = true; Debug.Log($"{counterAttacker.unitName}が反撃しました!"); // 反撃ダメージを計算 int counterDamage = damageCalculator.CalculateDamage(counterAttacker, target); target.TakeDamage(counterDamage); // 反撃に対する反撃はしない(連鎖防止) } } |
このコードで、反撃処理が実装できます。
連鎖防止フラグで、反撃の連鎖を防ぎます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
連鎖防止の実装

連鎖防止は、反撃が無限に続くのを防ぎます。
実装方法を紹介します。
連鎖防止システム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
public class ChainPreventionSystem : MonoBehaviour { private HashSet<Unit> counteringUnits = new HashSet<Unit>(); public void ProcessAttack(Unit attacker, Unit defender) { // 反撃中のユニットをクリア counteringUnits.Clear(); // 通常攻撃 int damage = damageCalculator.CalculateDamage(attacker, defender); defender.TakeDamage(damage); // 反撃判定(連鎖チェック付き) if (CanCounterWithoutChain(defender, attacker)) { ExecuteCounter(defender, attacker); } } bool CanCounterWithoutChain(Unit defender, Unit attacker) { // 既に反撃中のユニットは反撃しない if (counteringUnits.Contains(defender)) { return false; } // 通常の反撃条件をチェック return counterSystem.CanCounter(attacker, defender); } void ExecuteCounter(Unit counterAttacker, Unit target) { // 反撃中のユニットを記録 counteringUnits.Add(counterAttacker); Debug.Log($"{counterAttacker.unitName}が反撃しました!"); int counterDamage = damageCalculator.CalculateDamage(counterAttacker, target); target.TakeDamage(counterDamage); } } |
このコードで、連鎖防止が実装できます。
反撃中のユニットを記録して、連鎖を防ぎます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
実装例:完全な反撃システム

実際に使える、完全な反撃システムの実装例を紹介します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using UnityEngine; public class CompleteCounterSystem : MonoBehaviour { [Header("システム")] public CounterSystem counterSystem; public RangeChecker rangeChecker; public CounterAttackSystem attackSystem; public ChainPreventionSystem chainPrevention; public void OnAttack(Unit attacker, Unit defender) { // 反撃処理を実行 chainPrevention.ProcessAttack(attacker, defender); } } |
このコードで、完全な反撃システムが実装できます。
反撃判定、射程チェック、連鎖防止を統合しています。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
よくある質問(FAQ)

Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
まとめ

反撃システムは、射程チェックが重要です。
適切に実装すれば、戦略性が高まります。
✅ 今日から始める3ステップ
- ステップ1:反撃条件の判定を実装する(所要2時間)
- ステップ2:射程チェックを実装する(所要1時間)
- ステップ3:連鎖防止を実装する(所要2時間)
本格的にUnityを学びたい方は、Unity入門の森で実践的なスキルを身につけましょう。
あなたのペースで、少しずつ進めていけば大丈夫です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント