UnityUnityメモ

【実践】UnityでRPGのスキルシステムを作る!ステートマシンで簡単管理

Unity

1.はじめに

RPG(ロールプレイングゲーム)を作るとき、キャラクターのスキルはゲームの楽しさを左右する重要な要素ですよね。攻撃スキルや回復スキル、バフやデバフなど、スキルをうまく使うことで戦略性が生まれ、プレイヤーは自分だけの戦い方を楽しめるようになります。

でも、「スキルシステムを実装する」と言っても、どうやって作ればいいのか悩んでしまう人も多いのではないでしょうか?スキルには様々な種類があり、それぞれの発動条件やエフェクト、クールダウン時間などを管理する必要があります。適切に設計しないと、スキルの追加や調整が大変になり、コードが複雑になってしまうこともあります。

そこで、「ステートマシン(状態遷移)」を活用することで、スキルの管理をスムーズに行うことができます。ステートマシンを使えば、「スキル準備 → 発動 → クールダウン」といったスキルの流れを分かりやすく制御できるため、複雑な処理でも整理しやすくなるんです。

この記事では、Unityのステートマシンを活用して、シンプルで拡張しやすいスキルシステムを作る方法を紹介します。初心者でも分かりやすいように、基本的な考え方から実際の実装まで詳しく解説するので、一緒にスキルシステムを作っていきましょう!




2. ステートマシンとは?

スキルシステムを作るうえで「ステートマシン(状態遷移)」の考え方はとても重要です。ここでは、ゲーム開発におけるステートマシンの基本概念と、スキルシステムでの活用方法を紹介します。


ゲーム開発におけるステートマシンの基本概念

ゲームでは、キャラクターやオブジェクトの動作は「状態(ステート)」によって決まります。たとえば、RPGのキャラクターなら、以下のような状態が考えられます。

  • 待機中(Idle):プレイヤーが操作を待っている状態
  • 移動中(Walk / Run):キャラクターが動いている状態
  • 攻撃中(Attack):スキルや通常攻撃を発動している状態
  • 被ダメージ中(Damage):敵の攻撃を受けている状態
  • スキル発動中(Skill):スキルを使用している状態

ステートマシンは、これらの「状態」と「状態の遷移(移り変わり)」を管理する仕組みです。例えば、「待機中」から「移動中」に変わるときは、プレイヤーが移動キーを押すことがトリガーになります。「スキル発動中」から「待機中」に戻るのは、スキルの処理が完了したタイミングです。

これを適切に管理することで、キャラクターの動きをスムーズに制御できるようになります。


スキルシステムでの活用例

スキルシステムにも、ステートマシンは非常に役立ちます。スキルを発動するときの流れを考えてみましょう。

  1. 準備(Ready)
    • プレイヤーがスキルボタンを押す
    • マナやスタミナが十分かチェックする
    • スキルが発動できるかを確認する
  2. 発動(Casting)
    • スキルアニメーションを再生する
    • ダメージやエフェクトを適用する
    • キャラクターが移動できないようにする(詠唱時間がある場合)
  3. クールダウン(Cooldown)
    • スキルの再使用までの時間をカウントする
    • UIでクールダウン時間を表示する
  4. 再び準備状態に戻る(Readyへ)
    • クールダウンが終わったらスキルが再使用可能になる

この流れをステートマシンで管理することで、スキルの発動がスムーズになり、新しいスキルを追加するのも簡単になります。


UnityのAnimatorと組み合わせたステート管理

UnityにはAnimatorというステートマシンを管理する便利なツールがあります。本来はキャラクターのアニメーションを制御するための機能ですが、スキルの管理にも活用できます。

例えば、Animatorを使って以下のようなスキルのステートを設定できます。

  • Idle(待機) → スキルボタンが押されたら → Casting(詠唱)
  • Casting(詠唱) → アニメーションが終了したら → Cooldown(クールダウン)
  • Cooldown(クールダウン) → クールダウンが終わったら → Idle(待機)

これをAnimatorのステートマシンで設定しておけば、スキル発動の流れをスムーズに制御できます。
また、スクリプトからAnimatorのステートを変更することで、より柔軟なスキルの管理も可能です。


まとめ

  • ステートマシンはキャラクターの状態管理に役立つ
  • スキルシステムでは「準備 → 発動 → クールダウン」の流れを管理できる
  • UnityのAnimatorを活用するとスムーズにスキルを制御できる

このステートマシンの仕組みを理解すれば、より直感的にスキルの動きを作ることができます。次は、スキルシステムの基本設計について詳しく見ていきましょう!




3. スキルシステムの基本設計

スキルシステムを作るには、まず「どんなスキルがあるのか」「どのように発動するのか」「データをどう管理するのか」を設計する必要があります。ここでは、スキルの種類、発動の流れ、データの管理方法について解説していきます。


スキルの種類(アクティブスキル / パッシブスキル)

スキルは大きく分けて 「アクティブスキル」「パッシブスキル」 の2種類があります。

① アクティブスキル

アクティブスキルは、プレイヤーが特定の操作を行うことで発動するスキルです。一般的なRPGでは、以下のようなスキルが該当します。

  • 攻撃系スキル:ファイアボール、斬撃、雷撃など
  • 回復系スキル:ヒール、リジェネレーションなど
  • バフ / デバフスキル:攻撃力アップ、防御力ダウンなど

アクティブスキルは、発動時にエフェクトやアニメーションを再生する必要があるため、ステートマシンを使った管理が重要になります。

② パッシブスキル

パッシブスキルは、プレイヤーが特定の操作をしなくても、自動的に効果が発動するスキルです。たとえば、以下のようなスキルが挙げられます。

  • ステータス向上系:HPや攻撃力が永続的に上昇
  • 特殊能力系:敵を倒すとHPが回復する、ダメージを受けると一定確率で反撃する

パッシブスキルは、一度習得すると 常に効果を発揮する ため、スキルのデータを管理し、適用タイミングをチェックする仕組みが必要です。


スキル発動のフロー

スキルを発動するには、一連の処理を適切に管理する必要があります。基本的なスキル発動の流れを見ていきましょう。

  1. 入力(Input)
    • プレイヤーがスキルボタンを押す
    • AIの場合は、一定の条件を満たしたら発動(例:HPが50%以下になったら回復スキルを使う)
  2. 条件チェック(Condition Check)
    • スキル発動に必要なMPやスタミナが足りているか?
    • クールダウンが完了しているか?
    • 敵がスキルの範囲内にいるか?
  3. スキル発動(Casting)
    • アニメーションの再生
    • ダメージ計算
    • エフェクトの表示
  4. クールダウン(Cooldown)
    • 一定時間スキルを使用不可にする
    • UI上でクールダウン時間を表示する

この流れをステートマシンで管理すれば、スキルの追加や修正がしやすくなります。


スキルデータの管理方法(ScriptableObjectの活用)

スキルの情報を管理する方法として、ScriptableObject を使うのが便利です。

なぜScriptableObjectを使うのか?

  • スキルのデータをオブジェクトとして保存できる
  • スキルの種類が増えてもコードを変更せずに追加できる
  • インスペクターで直感的にスキルの値を調整できる

ScriptableObjectを使ったスキルデータの作成

まず、スキルのデータを定義するための SkillData クラスを作成します。

  1. スクリプトを作成 プロジェクトウィンドウを右クリック → 「Create」 → 「C# Script」 を選び、
    スクリプト名を SkillData にします。
  2. スクリプトを編集
using UnityEngine;

[CreateAssetMenu(fileName = "NewSkill", menuName = "Skill System/Skill Data")]
public class SkillData : ScriptableObject
{
    public string skillName;      // スキル名
    public string description;    // 説明
    public float damage;          // ダメージ量
    public float cooldown;        // クールダウン時間
    public Sprite icon;           // スキルのアイコン
    public AnimationClip animation; // スキル発動時のアニメーション
}
  1. ScriptableObjectを作成
    • プロジェクトウィンドウ「Create」 → 「Skill System」 → 「Skill Data」 を選ぶ
    • 新しいスキルデータを作成し、ファイアボール などの情報を入力
  2. スクリプトからスキルデータを読み込む スキルを発動するスクリプトで、ScriptableObjectを参照します。
public class Skill : MonoBehaviour
{
    public SkillData skillData; // スキルデータを参照

    public void CastSkill()
    {
        Debug.Log(skillData.skillName + " を発動!");
        // ダメージやエフェクト処理を追加
    }
}

これで、スキルのデータを オブジェクト化 し、簡単に追加や編集ができる ようになりました。


まとめ

  • スキルは 「アクティブスキル」「パッシブスキル」 に分類される
  • スキル発動の流れは 「入力 → 条件チェック → 発動 → クールダウン」 で構成される
  • ScriptableObject を活用するとスキルデータの管理が簡単になる

スキルシステムでは、スキルのデータ管理やUI、アニメーションの紐付けなど、複数の要素が絡みます。しかし、こうした設定を一括で管理できるのが RPG Builder です。このアセットを使えば、スキル発動の処理やクールダウンの設定が簡単に行えます。

これで、スキルの基本設計ができました!次は 「ステートマシンを使ったスキルの実装」 に進み、実際にスキルを発動できる仕組みを作っていきましょう!




4. ステートマシンを使ったスキルの実装

ここまででスキルシステムの基本設計ができました。次は、ステートマシンを使ってスキルの実装 をしていきます。ステートマシンを使うことで、スキルの状態遷移を管理しやすくなり、新しいスキルの追加やカスタマイズが簡単になります。


ステートマシンのセットアップ

スキルの動作は、以下のような 3つの状態(ステート) に分けられます。

  1. 準備状態(Ready)
    • スキルを発動できる状態
    • プレイヤーがスキルボタンを押したら発動
  2. 発動中(Casting)
    • スキルのエフェクトやアニメーションが再生される
    • ダメージや効果が適用される
    • この間、他のスキルは使えない
  3. クールダウン(Cooldown)
    • スキルの再使用までの待機時間
    • クールダウンが終わると「準備状態」に戻る

この3つのステートをスクリプトで管理することで、スキルの流れを明確にできます。


スキルの状態遷移(準備状態 → 発動中 → クールダウン)

スキルの状態を管理するために、列挙型(enum) を使ってステートを定義します。

public enum SkillState
{
Ready, // スキルが発動可能な状態
Casting, // スキル発動中
Cooldown // クールダウン中
}

この SkillState を使って、スキルの状態を制御していきます。


スクリプトでの実装例(スキルの発動処理)

では、実際にスキルを発動するスクリプトを作成してみましょう。

① スキル管理用スクリプトを作成

プロジェクトウィンドウを右クリック → 「Create」 → 「C# Script」 を選び、
スクリプト名を SkillSystem にします。

② スクリプトを編集

以下のコードを入力してください。

using System.Collections;
using UnityEngine;

public class SkillSystem : MonoBehaviour
{
public SkillData skillData; // スキルデータ(ScriptableObject)
private SkillState state = SkillState.Ready; // 現在のスキル状態
private float cooldownTimer = 0f; // クールダウンのカウント

void Update()
{
switch (state)
{
case SkillState.Ready:
if (Input.GetKeyDown(KeyCode.Space)) // スペースキーでスキル発動
{
StartCoroutine(CastSkill());
}
break;

case SkillState.Cooldown:
cooldownTimer -= Time.deltaTime;
if (cooldownTimer <= 0)
{
state = SkillState.Ready;
}
break;
}
}

IEnumerator CastSkill()
{
if (state != SkillState.Ready) yield break; // 既にスキル発動中なら無効

state = SkillState.Casting;
Debug.Log(skillData.skillName + " を発動!");

// スキルアニメーションの再生
if (skillData.animation != null)
{
GetComponent<Animator>().Play(skillData.animation.name);
}

// ダメージ計算やエフェクトの処理(仮)
yield return new WaitForSeconds(1.5f); // 発動時間のシミュレーション

// クールダウン開始
state = SkillState.Cooldown;
cooldownTimer = skillData.cooldown;
Debug.Log("クールダウン開始: " + cooldownTimer + " 秒");
}
}

スクリプトの解説

1. スキル発動の準備

スキルが 「Ready」状態 なら、スペースキーを押すことでスキルを発動できます。

if (Input.GetKeyDown(KeyCode.Space)) 
{
StartCoroutine(CastSkill());
}

2. スキルの発動処理

スキル発動中(Casting)の間は、アニメーションを再生し、一定時間後に次の処理へ移ります。

state = SkillState.Casting;
Debug.Log(skillData.skillName + " を発動!");

この間は他のスキルを発動できないようにして、一定時間待機します。

yield return new WaitForSeconds(1.5f); // スキル発動時間

3. クールダウンの開始

スキル発動後、クールダウン(Cooldown) に移行し、一定時間経過すると「Ready」に戻ります。

state = SkillState.Cooldown;
cooldownTimer = skillData.cooldown;
Debug.Log("クールダウン開始: " + cooldownTimer + " 秒");

実装結果の確認

  1. スキルを設定
    • SkillSystem をプレイヤーオブジェクトにアタッチ
    • SkillData に作成したスキルデータ(ScriptableObject)をセット
  2. スキル発動をテスト
    • スペースキー を押すとスキルが発動
    • 1.5秒後にクールダウン開始
    • クールダウンが終わると再びスキルが発動可能に

まとめ

  • スキルの状態を 「準備 → 発動 → クールダウン」 の3つに分ける
  • スキル発動中は他の行動を制限 し、アニメーションを適用する
  • クールダウン管理を導入 して連続使用を防ぐ
  • ステートマシンを活用することで、スキル管理がスムーズに

この仕組みを使えば、スキルごとに発動時間やクールダウンを簡単に調整できます!
次は 「スキルの視覚効果を追加」 して、より迫力のあるスキル演出を作っていきましょう!




5. スキルの視覚効果を追加

スキルの基本的な仕組みができたら、次は視覚効果を追加して、スキルをより魅力的に演出しましょう!スキルの演出には、エフェクト(Particle System / Shader)、アニメーション、サウンドを組み合わせることで、迫力ある動きを作ることができます。


エフェクトを適用する方法(Particle System / Shader)

スキルの発動時にエフェクトを追加すると、より華やかで分かりやすい演出になります。Unityでは、Particle SystemShader を活用することで、リアルなスキルエフェクトを作成できます。

① Particle Systemを使ったエフェクト

Particle System は、炎、雷、魔法陣などのエフェクトを作るのに便利な機能です。

Particle System の追加方法

  1. ヒエラルキー(Hierarchy)ウィンドウを右クリック
  2. 「Effects」→「Particle System」 を選択
  3. Inspector で設定を調整
    • Duration(持続時間):スキルの発動時間に合わせる
    • Start Lifetime(寿命):エフェクトが表示される時間
    • Start Speed(速度):炎や雷のスピードを調整
    • Start Size(サイズ):エフェクトの大きさを変更
  4. スキルと連携させる スキル発動時にエフェクトを再生するため、スクリプトにエフェクトの参照を追加します。
public ParticleSystem skillEffect; // エフェクトの参照

IEnumerator CastSkill()
{
if (state != SkillState.Ready) yield break;

state = SkillState.Casting;
Debug.Log(skillData.skillName + " を発動!");

// スキルエフェクトの再生
if (skillEffect != null)
{
skillEffect.Play();
}

yield return new WaitForSeconds(1.5f);

state = SkillState.Cooldown;
cooldownTimer = skillData.cooldown;
Debug.Log("クールダウン開始: " + cooldownTimer + " 秒");
}

② Shaderを使ったエフェクト

Shader を使うと、キャラクターや武器が光る演出や、魔法陣の特殊効果を簡単に作れます。

例えば、スキル発動時に武器を光らせる場合、マテリアルの Emission(発光)を変更することで、簡単に光るエフェクトを実装できます。

public Renderer weaponRenderer; // 武器のマテリアル
private Color originalColor;

void Start()
{
originalColor = weaponRenderer.material.GetColor("_EmissionColor");
}

IEnumerator CastSkill()
{
state = SkillState.Casting;

// 武器を光らせる
weaponRenderer.material.SetColor("_EmissionColor", Color.red * 5f);

yield return new WaitForSeconds(1.5f);

// 元の色に戻す
weaponRenderer.material.SetColor("_EmissionColor", originalColor);

state = SkillState.Cooldown;
}

アニメーションと連携させる(Animatorのトリガー)

スキル発動時に、キャラクターが専用のアニメーションを再生すると、よりリアルな演出ができます。

① Animatorにスキルのアニメーションを追加

  1. キャラクターに Animator コンポーネントを追加
  2. Animator ウィンドウを開く(Window → Animation → Animator)
  3. 新しいスキルのアニメーションを追加
  4. スクリプトから Animator を制御できるようにする

② スクリプトでスキル発動時にアニメーションを再生

Animatorの Trigger を設定して、スキル発動時にアニメーションを実行します。

public Animator animator; // キャラクターのAnimator

IEnumerator CastSkill()
{
state = SkillState.Casting;

// スキルのアニメーションを再生
animator.SetTrigger("CastSkill");

yield return new WaitForSeconds(1.5f);

state = SkillState.Cooldown;
}

Animatorの設定

  1. Animator ウィンドウで新しいステートを作成
  2. 「CastSkill」 というトリガーを設定
  3. スクリプトから animator.SetTrigger("CastSkill") で呼び出し

これで、スキル発動時にキャラクターが特定のモーションをするようになります!


スキルをより魅力的に見せるには、エフェクトが重要です。しかし、自作するのは時間がかかりますよね。
Action RPG FX を使えば、魔法や剣技などのエフェクトを手軽に追加できます!特にRPG向けのスキルエフェクトが豊富なので、スキルの演出を一気にレベルアップできます。


音を追加してスキルの演出を強化

スキルに音をつけることで、より迫力のある演出が可能になります。Unityでは AudioSource を使って簡単に音を再生できます。

① スキル用の音を追加

  1. プロジェクトウィンドウに音ファイル(.mp3や.wav)をインポート
  2. スキル発動時に音を再生するスクリプトを追加
public AudioSource skillSound; // スキル音

IEnumerator CastSkill()
{
state = SkillState.Casting;

// スキル音を再生
if (skillSound != null)
{
skillSound.Play();
}

yield return new WaitForSeconds(1.5f);

state = SkillState.Cooldown;
}

② AudioSource を設定

  1. スクリプトをアタッチしたオブジェクトに AudioSource コンポーネントを追加
  2. Inspector で AudioSource にスキル音を設定
  3. スクリプトから skillSound.Play(); で再生

これで、スキル発動時に音が鳴るようになります!


スキルのエフェクトが派手でも、音がないと迫力が半減してしまいます。特に魔法スキルでは、 詠唱音や発動音、爆発音 などのサウンドがあることで、よりリアルで没入感のあるバトルになります。
そんなときに便利なのが、 RPG Magic Sound Effect Pack 3: Elemental AAA です!
炎・氷・雷などの魔法エフェクトにぴったりな高品質なサウンドが揃っている ので、簡単にスキルのクオリティをアップできます。


まとめ

  • Particle System を使って炎や雷のエフェクトを追加
  • Shader で武器を光らせるなどの特殊エフェクトを作成
  • Animator のトリガー を活用し、スキル専用アニメーションを実装
  • AudioSource を使ってスキル音を追加 し、演出を強化

これで、スキルの演出がより魅力的になりました!次は 「応用編:複数スキルの管理」 を学び、スキルツリーやAIのスキル使用を実装していきましょう!




6. 応用編:複数スキルの管理

これまでのステップで、基本的なスキルの実装ができました。ここからは、複数のスキルを管理する方法を学んでいきましょう。プレイヤーにスキルを習得させたり、AIキャラクターにスキルを使わせたりすることで、より高度なゲームシステムを作ることができます。


スキルツリーの設計(スキルポイント制 / スキルレベル制)

プレイヤーがレベルアップするごとにスキルを強化したり、新しいスキルを習得できる仕組みを作ることで、ゲームの成長要素が生まれます。スキルの管理方法として、「スキルポイント制」「スキルレベル制」 の2つを紹介します。

① スキルポイント制

  • レベルアップ時に スキルポイント(SP) を獲得
  • プレイヤーがスキルツリーで 習得したいスキルを選択
  • スキルごとに 必要なSPを設定 し、消費して習得
スキルポイント制の実装例
public class SkillManager : MonoBehaviour
{
public List<SkillData> availableSkills; // 習得可能なスキル
public int skillPoints = 3; // 初期スキルポイント

public void LearnSkill(SkillData skill)
{
if (skillPoints > 0 && !availableSkills.Contains(skill))
{
availableSkills.Add(skill);
skillPoints--;
Debug.Log(skill.skillName + " を習得した!");
}
else
{
Debug.Log("スキルポイントが足りません!");
}
}
}

② スキルレベル制

  • スキルごとにレベルを設定 し、使用するたびに経験値を獲得
  • 一定の経験値でスキルのレベルが上がる
  • レベルが上がるとスキルの威力やクールダウンが変化
スキルレベル制の実装例
public class SkillProgression : MonoBehaviour
{
public SkillData skill;
public int skillLevel = 1;
public float skillXP = 0;
public float xpThreshold = 100; // レベルアップの必要経験値

public void GainSkillXP(float amount)
{
skillXP += amount;
if (skillXP >= xpThreshold)
{
skillXP = 0;
skillLevel++;
skill.damage *= 1.2f; // レベルアップ時にダメージ増加
Debug.Log(skill.skillName + " のレベルが " + skillLevel + " になった!");
}
}
}

スキルポイント制はプレイヤーが自由にスキルを選択できるのが特徴、スキルレベル制はスキルを使うほど強くなるのが特徴です。ゲームのバランスに合わせて選びましょう。


AIキャラクターにスキルを使わせる(NavMeshAgentとの連携)

プレイヤーだけでなく、敵キャラクターにもスキルを使わせることで、戦闘の面白さが増します。敵AIにスキルを使用させるために、以下の流れで実装します。

① NavMeshAgentを使って敵を移動させる

NavMeshAgent を使うと、敵が自動的にプレイヤーを追いかけることができます。

using UnityEngine;
using UnityEngine.AI;

public class EnemyAI : MonoBehaviour
{
public Transform target;
private NavMeshAgent agent;

void Start()
{
agent = GetComponent<NavMeshAgent>();
}

void Update()
{
if (target != null)
{
agent.SetDestination(target.position);
}
}
}

② 一定距離に近づいたらスキルを発動

敵がプレイヤーに近づいたらスキルを発動するようにします。

public class EnemySkillAI : MonoBehaviour
{
public Transform target;
public SkillSystem skill;
public float attackRange = 5f;

void Update()
{
float distance = Vector3.Distance(transform.position, target.position);
if (distance <= attackRange)
{
skill.StartCoroutine(skill.CastSkill());
}
}
}

このスクリプトを敵キャラクターにアタッチすれば、プレイヤーが近づくとスキルを使うようになります。


デバッグ&バランス調整のポイント

スキルシステムを作ると、強すぎるスキルや使いにくいスキルが出てくることがあります。ここでは、デバッグとバランス調整のポイントを紹介します。

① スキルのクールダウン時間を調整

  • クールダウンが短すぎると、連発されてゲームバランスが崩れる
  • 長すぎると使いにくいので、適度な調整が必要
デバッグ用のスクリプト
public void AdjustCooldown(float newCooldown)
{
skillData.cooldown = newCooldown;
Debug.Log(skillData.skillName + " のクールダウンを " + newCooldown + " 秒に変更");
}

② スキルのダメージバランス

  • ダメージが大きすぎるとゲームが簡単になりすぎる
  • 逆に低すぎると、使う意味がなくなる
ダメージ計算の調整
public void AdjustDamage(float multiplier)
{
skillData.damage *= multiplier;
Debug.Log(skillData.skillName + " のダメージを " + multiplier + " 倍に変更");
}

③ AIのスキル使用頻度を調整

  • 敵がスキルを連発しすぎると、プレイヤーにとって不公平
  • スキル使用頻度を時間制限で調整
private float lastSkillTime;
public float skillCooldown = 3f;

void Update()
{
if (Time.time - lastSkillTime >= skillCooldown)
{
lastSkillTime = Time.time;
skill.StartCoroutine(skill.CastSkill());
}
}

まとめ

  • スキルツリーは「スキルポイント制」と「スキルレベル制」の2種類がある
  • AIにスキルを使わせることで戦闘をより戦略的に
  • デバッグとバランス調整 を行い、スキルが強すぎたり弱すぎたりしないようにする

スキルツリーやAIキャラクターのスキル管理をゼロから作るのは大変ですが、 RPG Builder なら、スキルの習得・強化システムが標準搭載されています。初心者でも手軽にスキルシステムを導入できるので、開発の時間を大幅に短縮できます!

この応用テクニックを活用すれば、より奥深いスキルシステムを作ることができます!
次は 「まとめ」 に進み、スキルシステムの要点をおさらいしていきましょう!




7. まとめ

ここまで、UnityでRPGのスキルシステムを作る方法を学んできました。スキルはゲームの戦略性を大きく左右する要素であり、うまく設計することで、プレイヤーに楽しいゲーム体験を提供できます。
それでは、スキルシステムを作る際のポイントを振り返ってみましょう!


スキルシステムを作る際のポイントをおさらい

スキルの基本設計

  • アクティブスキルとパッシブスキル を分類して設計
  • スキル発動の流れ(入力 → 条件チェック → 発動 → クールダウン)を整理
  • ScriptableObjectを活用 してスキルデータを管理しやすくする

ステートマシンでスキルの状態を管理

  • スキルには 「準備 → 発動 → クールダウン」 の3つのステートを設定
  • ステートマシンを使うことで、スキルの流れを整理し、追加・修正しやすくする

スキルの視覚効果を追加

  • Particle SystemShader でエフェクトを追加し、迫力のある演出を作る
  • Animatorのトリガー を使ってスキル専用のアニメーションを設定
  • AudioSourceを使ってサウンドを追加 し、スキルのインパクトを強化

応用編:複数スキルの管理

  • スキルポイント制 / スキルレベル制 を使ってスキルを習得・成長させる
  • 敵AIにスキルを使用させる ことで、戦闘の駆け引きを増やす
  • バランス調整とデバッグ を行い、スキルの強さやクールダウン時間を最適化

ステートマシンを使うことでスキル管理がシンプルに

スキルシステムは、管理が複雑になりがち ですが、ステートマシンを活用することで 整理しやすく、拡張もしやすい設計 ができます。

たとえば:

  • スキルの発動条件を追加するSkillState.Ready にチェック処理を追加するだけ
  • スキルの発動時間を変えるCasting の処理時間を変更するだけ
  • 新しいスキルを追加するSkillData に新しいスキル情報を登録するだけ

このように、シンプルな構造にすることで、スキルの追加や調整が楽になる というメリットがあります。


次のステップ

スキルシステムをさらに発展させるなら、次のような機能を実装してみるのもおすすめです!

✅ ステートマシンを使った敵AIの実装

  • 敵AIがスキルを状況に応じて使い分ける
  • HPが低くなったら回復スキルを使う
  • プレイヤーが近づいたら攻撃スキルを発動

✅ スキルの組み合わせシステム

  • 2つのスキルを組み合わせてコンボスキルを発動
  • 例えば「炎」+「風」=「火炎竜巻」など

✅ スキルのネットワーク同期

  • マルチプレイヤーゲームで、スキルの発動を他のプレイヤーと同期
  • PhotonやMirrorを使ってオンライン対応

おわりに

この記事では、Unityでステートマシンを活用したスキルシステムの作り方を紹介しました。
ここで学んだ知識を活かせば、自由度の高いスキルシステムを作ることができるようになります。

最初はシンプルなスキルから始めて、少しずつエフェクトやスキルツリーを追加していきましょう!
これからのゲーム開発に、ぜひ活用してみてください!🎮🔥




よくある質問(FAQ)

Q
スキルを個別に追加・削除するにはどうすればいい?
A

スキルを動的に追加・削除するには、リスト(List)を使って管理するのが便利です。プレイヤーがスキルを習得したときにリストへ追加し、スキルを忘れたときには削除するようにすれば、スキルの管理が簡単になります。

スクリプトでスキルの追加・削除を管理

using System.Collections.Generic;
using UnityEngine;

public class SkillManager : MonoBehaviour
{
public List<SkillData> playerSkills = new List<SkillData>(); // プレイヤーのスキルリスト

// スキルを追加する
public void AddSkill(SkillData newSkill)
{
if (!playerSkills.Contains(newSkill))
{
playerSkills.Add(newSkill);
Debug.Log(newSkill.skillName + " を習得しました!");
}
else
{
Debug.Log(newSkill.skillName + " はすでに習得済みです。");
}
}

// スキルを削除する
public void RemoveSkill(SkillData skillToRemove)
{
if (playerSkills.Contains(skillToRemove))
{
playerSkills.Remove(skillToRemove);
Debug.Log(skillToRemove.skillName + " を忘れました。");
}
else
{
Debug.Log(skillToRemove.skillName + " は習得していません。");
}
}
}

使い方

  1. スクリプトを プレイヤーオブジェクト にアタッチ
  2. AddSkill(SkillData skill) を呼び出すとスキルを習得
  3. RemoveSkill(SkillData skill) を呼び出すとスキルを削除

これにより、スキルの追加や削除をスクリプトで自由に管理できます。

Q
スキルの発動をボタン入力だけでなく、スクリプトからも制御できる?
A

はい、スクリプトから直接スキルを発動 することも可能です。例えば、特定のイベント(敵に攻撃されたとき、HPが一定以下になったときなど)でスキルを発動する場合、スクリプト内でスキル発動メソッドを呼び出せばOKです。

スクリプトからスキルを発動する例

public class AutoSkillTrigger : MonoBehaviour
{
public SkillSystem skill; // スキルシステムの参照
public float hpThreshold = 30f; // スキルを発動するHPの閾値
private float playerHP = 100f; // 仮のHP管理

void Update()
{
// HPが一定以下になったら自動でスキル発動
if (playerHP <= hpThreshold)
{
skill.StartCoroutine(skill.CastSkill());
}
}
}

他のスクリプトからスキルを発動する

public SkillSystem skill; // スキルシステムを参照

void SomeEvent()
{
skill.StartCoroutine(skill.CastSkill()); // イベント発生時にスキル発動
}

これで、ボタンを押さなくてもスキルが発動するようになります。

Q
スキルの発動中に他の行動をキャンセルさせる方法は?
A

スキルの発動中に移動や攻撃を禁止するには、スクリプトで 「現在のステートがCastingなら他のアクションを無効化する」 という処理を追加すればOKです。

プレイヤーの動きを制限する

csharpコピーする編集するpublic class PlayerController : MonoBehaviour
{
    public SkillSystem skillSystem; // スキル管理システム

    void Update()
    {
        if (skillSystem.GetCurrentState() == SkillState.Casting)
        {
            return; // スキル発動中は操作を無効化
        }

        // 通常の移動処理
        float moveX = Input.GetAxis("Horizontal");
        float moveZ = Input.GetAxis("Vertical");
        transform.Translate(new Vector3(moveX, 0, moveZ) * Time.deltaTime * 5);
    }
}

スキル発動中に攻撃を禁止する

csharpコピーする編集するpublic class PlayerAttack : MonoBehaviour
{
    public SkillSystem skillSystem;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && skillSystem.GetCurrentState() != SkillState.Casting)
        {
            Attack(); // スキル発動中でなければ攻撃
        }
    }

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

これで、スキル発動中は移動や攻撃をキャンセル し、スキルが終わった後に再び操作できるようになります。

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