SRPGのスキルシステムは、戦略性を高めます。
スキルデータの設計と実装方法を理解すれば、多様なスキルが作れます。
この記事では、実装方法を詳しく解説します。
✨ この記事でわかること
-
- スキルデータの設計
- 効果範囲の実装
- 持続時間・クールタイムの管理
- 攻撃・回復・補助スキルの実装
- 実装例とコード

スキルシステムは、まずデータ構造から設計しましょう。ScriptableObjectで管理すれば、調整が簡単になります。
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 35 36 37 38 39 40 41 42 |
using UnityEngine; [CreateAssetMenu(fileName = "NewSkill", menuName = "SRPG/Skill")] public class SkillData : ScriptableObject { [Header("基本情報")] public string skillName; public string description; public SkillType skillType; public int cost; // MP消費 [Header("効果")] public int damage; // ダメージ public int heal; // 回復量 public int buffValue; // バフ値 public int debuffValue; // デバフ値 [Header("範囲")] public SkillRange range; public int rangeRadius; // 範囲半径 [Header("時間")] public float duration; // 持続時間 public float cooldown; // クールタイム } public enum SkillType { Attack, // 攻撃 Heal, // 回復 Buff, // バフ Debuff // デバフ } public enum SkillRange { Single, // 単体 Area, // 範囲 Line, // 直線 All // 全体 } |
このコードで、スキルデータ構造が定義できます。
ScriptableObjectで管理すれば、デザイナーも編集できます。
スキルの種類
✅ 基本スキルの種類
- 攻撃スキル:ダメージを与える(MP消費:10〜30)
- 回復スキル:HPを回復する(MP消費:15〜25)
- バフスキル:能力値を上げる(MP消費:20、持続時間:3ターン)
- デバフスキル:能力値を下げる(MP消費:20、持続時間:3ターン)
スキルの種類を増やすことで、戦略性が高まります。
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 45 46 47 48 49 50 51 52 |
public class SkillRangeSelector : MonoBehaviour { public SkillData skillData; public GridSystem gridSystem; public List<Vector2Int> GetTargetTiles(Vector2Int center, Vector2Int direction) { List<Vector2Int> targets = new List<Vector2Int>(); switch (skillData.range) { case SkillRange.Single: // 単体:中心のみ targets.Add(center); break; case SkillRange.Area: // 範囲:中心から半径内 for (int x = -skillData.rangeRadius; x <= skillData.rangeRadius; x++) { for (int z = -skillData.rangeRadius; z <= skillData.rangeRadius; z++) { float distance = Mathf.Sqrt(x * x + z * z); if (distance <= skillData.rangeRadius) { targets.Add(new Vector2Int(center.x + x, center.y + z)); } } } break; case SkillRange.Line: // 直線:方向に沿って for (int i = 0; i <= skillData.rangeRadius; i++) { targets.Add(new Vector2Int( center.x + direction.x * i, center.y + direction.y * i )); } break; case SkillRange.All: // 全体:全てのユニット // 実装は省略 break; } return targets; } } |
このコードで、効果範囲の選択が実装できます。
スキルの種類に応じて、範囲を計算します。

効果範囲は、グリッド座標で計算しましょう。これにより、正確な範囲選択ができます。
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 45 46 47 48 |
public class SkillCooldownManager : MonoBehaviour { private Dictionary<SkillData, float> cooldowns = new Dictionary<SkillData, float>(); public bool CanUseSkill(SkillData skill) { if (!cooldowns.ContainsKey(skill)) { return true; } return cooldowns[skill] <= 0f; } public void UseSkill(SkillData skill) { if (CanUseSkill(skill)) { cooldowns[skill] = skill.cooldown; } } public void UpdateCooldowns(float deltaTime) { List<SkillData> keys = new List<SkillData>(cooldowns.Keys); foreach (var skill in keys) { cooldowns[skill] -= deltaTime; if (cooldowns[skill] <= 0f) { cooldowns.Remove(skill); } } } public float GetRemainingCooldown(SkillData skill) { if (!cooldowns.ContainsKey(skill)) { return 0f; } return cooldowns[skill]; } } |
このコードで、クールタイム管理が実装できます。
スキルを使用すると、クールタイムが設定されます。
バフ・デバフの持続時間管理
|
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 45 46 47 48 |
[System.Serializable] public class StatusEffect { public SkillData skill; public float remainingTime; public int value; } public class StatusEffectManager : MonoBehaviour { private List<StatusEffect> effects = new List<StatusEffect>(); public void AddEffect(SkillData skill, int value) { StatusEffect effect = new StatusEffect { skill = skill, remainingTime = skill.duration, value = value }; effects.Add(effect); } public void UpdateEffects(float deltaTime) { for (int i = effects.Count - 1; i >= 0; i--) { effects[i].remainingTime -= deltaTime; if (effects[i].remainingTime <= 0f) { effects.RemoveAt(i); } } } public int GetTotalEffectValue() { int total = 0; foreach (var effect in effects) { total += effect.value; } return total; } } |
このコードで、バフ・デバフの持続時間管理が実装できます。
時間が経過すると、効果が解除されます。
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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
public class SkillExecutor : MonoBehaviour { public SkillCooldownManager cooldownManager; public SkillRangeSelector rangeSelector; public StatusEffectManager statusEffectManager; public void ExecuteSkill(Unit caster, SkillData skill, Vector2Int targetPos, Vector2Int direction) { // MPを消費 if (caster.currentMP < skill.cost) { Debug.Log("MPが足りません"); return; } caster.currentMP -= skill.cost; // クールタイムを設定 cooldownManager.UseSkill(skill); // 範囲内のターゲットを取得 List<Vector2Int> targets = rangeSelector.GetTargetTiles(targetPos, direction); // スキルの種類に応じて処理 switch (skill.skillType) { case SkillType.Attack: ExecuteAttackSkill(caster, skill, targets); break; case SkillType.Heal: ExecuteHealSkill(caster, skill, targets); break; case SkillType.Buff: ExecuteBuffSkill(caster, skill, targets); break; case SkillType.Debuff: ExecuteDebuffSkill(caster, skill, targets); break; } } void ExecuteAttackSkill(Unit caster, SkillData skill, List<Vector2Int> targets) { foreach (var targetPos in targets) { Unit target = GetUnitAtPosition(targetPos); if (target != null) { int damage = skill.damage + caster.attack; target.TakeDamage(damage); } } } void ExecuteHealSkill(Unit caster, SkillData skill, List<Vector2Int> targets) { foreach (var targetPos in targets) { Unit target = GetUnitAtPosition(targetPos); if (target != null) { int heal = skill.heal + caster.magic; target.Heal(heal); } } } void ExecuteBuffSkill(Unit caster, SkillData skill, List<Vector2Int> targets) { foreach (var targetPos in targets) { Unit target = GetUnitAtPosition(targetPos); if (target != null) { statusEffectManager.AddEffect(skill, skill.buffValue); } } } void ExecuteDebuffSkill(Unit caster, SkillData skill, List<Vector2Int> targets) { foreach (var targetPos in targets) { Unit target = GetUnitAtPosition(targetPos); if (target != null) { statusEffectManager.AddEffect(skill, -skill.debuffValue); } } } Unit GetUnitAtPosition(Vector2Int pos) { // 位置からユニットを取得 // 実装は省略 return null; } } |
このコードで、スキル実行システムが実装できます。
スキルの種類に応じて、適切な処理を実行します。
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 |
using UnityEngine; public class CompleteSkillSystem : MonoBehaviour { [Header("システム")] public SkillCooldownManager cooldownManager; public SkillRangeSelector rangeSelector; public SkillExecutor executor; public StatusEffectManager statusEffectManager; void Update() { // クールタイムを更新 cooldownManager.UpdateCooldowns(Time.deltaTime); // ステータス効果を更新 statusEffectManager.UpdateEffects(Time.deltaTime); } public void OnSkillSelected(Unit caster, SkillData skill, Vector2Int targetPos, Vector2Int direction) { if (cooldownManager.CanUseSkill(skill)) { executor.ExecuteSkill(caster, skill, targetPos, direction); } else { float remaining = cooldownManager.GetRemainingCooldown(skill); Debug.Log($"クールタイム中: 残り{remaining:F1}秒"); } } } |
このコードで、完全なスキルシステムが実装できます。
スキルデータ、範囲選択、クールタイム、効果を統合しています。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
よくある質問(FAQ)

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

スキルシステムは、データ構造から設計しましょう。
ScriptableObjectで管理すれば、調整が簡単になります。
✅ 今日から始める3ステップ
- ステップ1:スキルデータ構造を設計する(所要2時間)
- ステップ2:効果範囲システムを実装する(所要3時間)
- ステップ3:クールタイム管理を実装する(所要2時間)
本格的にUnityを学びたい方は、Unity入門の森で実践的なスキルを身につけましょう。
あなたのペースで、少しずつ進めていけば大丈夫です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント