必殺技システムは、SRPGの戦闘にメリハリと爽快感を与える重要な要素です。
本記事では、必殺技を「強化されたクリティカル攻撃」として扱い、クリティカル判定・ダメージ計算・演出・アニメーションを組み合わせた実装例を紹介します。
Unityの基本操作やC#の基礎を理解している方向けに、実際に動く形を重視した実装方法を解説します。
✨ この記事でわかること
- 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 |
using UnityEngine; public class CriticalSystem : MonoBehaviour { public bool CheckCritical(Unit attacker, Unit defender) { // クリティカル率 = 攻撃側のクリティカル率 - 防御側のクリティカル回避率 float criticalRate = attacker.criticalRate - defender.criticalEvade; // 0〜100%の範囲に制限 criticalRate = Mathf.Clamp(criticalRate, 0f, 100f); // 確率判定 float random = Random.Range(0f, 100f); return random < criticalRate; } public float GetCriticalMultiplier(Unit attacker) { // 基本倍率は1.5倍 float baseMultiplier = 1.5f; // スキルや装備による補正 if (attacker.hasCriticalBoost) { baseMultiplier += 0.5f; } return baseMultiplier; } } |
この処理により、攻撃のたびに乱数を使って判定が行われ、設定したクリティカル率に応じて確率的にクリティカルが発生します。
最初はこの程度のシンプルな実装でも、SRPGとして十分に「運」と「戦略性」を演出できます。
クリティカル率の設定
次に重要なのが、クリティカル率そのものの数値設定です。
数値が極端すぎると、ゲームバランスが崩れやすくなります。
SRPGでは、以下のような範囲から調整を始めると扱いやすくなります。
クリティカル率の目安
基本値は5〜10%程度に抑えると、発生時の特別感を保ちやすくなります。
特殊ユニットや必殺技扱いの場合は、15〜20%程度まで引き上げることで差別化できます。
一方、防御側のクリティカル回避率は0〜5%程度に設定すると、過度な無効化を防げます。

まずはこの範囲を基準にし、テストプレイを通して自分のゲームに合う数値へ調整していくのがおすすめです。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
ダメージ倍率の設定

SRPGでは、単にクリティカルが出るだけでなく、通常攻撃との差がはっきり分かるダメージ変化を出すことで、必殺技らしい爽快感を演出できます。
ここでは、既存のダメージ計算処理にクリティカル用の倍率を掛けるだけのシンプルな方法を紹介します。
ダメージ計算システム
基本的な考え方は次のとおりです。
まず通常のダメージを計算し、その後にクリティカル判定を行い、クリティカルが発生した場合のみ倍率を適用します。
以下は、その流れをまとめたサンプルコードです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class CriticalDamageCalculator : MonoBehaviour { public CriticalSystem criticalSystem; public DamageCalculator damageCalculator; public int CalculateFinalDamage(Unit attacker, Unit defender) { // 基本ダメージ int baseDamage = damageCalculator.CalculateDamage(attacker, defender); // クリティカル判定 if (criticalSystem.CheckCritical(attacker, defender)) { float multiplier = criticalSystem.GetCriticalMultiplier(attacker); int criticalDamage = Mathf.RoundToInt(baseDamage * multiplier); Debug.Log($"クリティカル! {baseDamage} → {criticalDamage}"); return criticalDamage; } return baseDamage; } } |
この処理により、通常時はこれまで通りのダメージが適用され、クリティカル時のみ倍率分だけ強化されたダメージになります。
既存のダメージ計算ロジックを流用できるため、システム全体を大きく書き換えずに導入できる点もメリットです。

ダメージ倍率は、まず1.5倍を基準に設定するのがおすすめです。
高すぎると戦略性が崩れやすく、低すぎるとクリティカルの存在感が薄れてしまいます。
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 |
using UnityEngine; using System.Collections; public class CriticalEffectSystem : MonoBehaviour { public GameObject criticalEffectPrefab; public AudioClip criticalSound; public float effectDuration = 1f; public void PlayCriticalEffect(Unit attacker, Unit defender) { StartCoroutine(CriticalEffectCoroutine(attacker, defender)); } IEnumerator CriticalEffectCoroutine(Unit attacker, Unit defender) { // エフェクトを表示 GameObject effect = Instantiate(criticalEffectPrefab, defender.transform.position, Quaternion.identity); // サウンドを再生 AudioSource.PlayClipAtPoint(criticalSound, defender.transform.position); // 画面を揺らす Camera.main.GetComponent<CameraShake>().Shake(0.3f, 0.2f); // 待機 yield return new WaitForSeconds(effectDuration); // エフェクトを削除 Destroy(effect); } } public class CameraShake : MonoBehaviour { public void Shake(float duration, float magnitude) { StartCoroutine(ShakeCoroutine(duration, magnitude)); } IEnumerator ShakeCoroutine(float duration, float magnitude) { Vector3 originalPos = transform.localPosition; float elapsed = 0f; while (elapsed < duration) { float x = Random.Range(-1f, 1f) * magnitude; float y = Random.Range(-1f, 1f) * magnitude; transform.localPosition = originalPos + new Vector3(x, y, 0); elapsed += Time.deltaTime; yield return null; } transform.localPosition = originalPos; } } |
この構成により、クリティカル発生時にエフェクト・サウンド・画面揺れが同時に再生され、攻撃のインパクトを視覚・聴覚の両方で演出できます。
最初は簡単な演出から導入し、慣れてきたらカメラ演出やスローモーションなどを追加していくと、より必殺技らしい表現に発展させられます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
アニメーション切り替え

エフェクトやサウンドだけでなく、通常攻撃とは違うアニメーションを再生することで、プレイヤーは一目で「特別な攻撃が出た」と認識できます。
ここでは、Animatorのトリガーを使って、通常攻撃とクリティカル攻撃のアニメーションを切り替える方法を紹介します。
アニメーション管理システム
アニメーションの切り替え処理は、攻撃判定やダメージ計算とは分離して管理すると、後から演出を調整しやすくなります。
以下のサンプルでは、クリティカルが発生したかどうかに応じて、Animatorに設定したトリガーを切り替えるシンプルな構成を採用しています。
|
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 |
using UnityEngine; public class CriticalAnimationSystem : MonoBehaviour { public Animator animator; public string normalAttackTrigger = "Attack"; public string criticalAttackTrigger = "CriticalAttack"; public void PlayAttackAnimation(bool isCritical) { if (isCritical) { animator.SetTrigger(criticalAttackTrigger); } else { animator.SetTrigger(normalAttackTrigger); } } public void OnCriticalHit(Unit attacker, Unit defender) { // クリティカルアニメーションを再生 PlayAttackAnimation(true); // エフェクトを表示 PlayCriticalEffect(attacker, defender); } void PlayCriticalEffect(Unit attacker, Unit defender) { // エフェクト処理 // 実装は省略 } } |
この仕組みにより、通常攻撃では通常モーション、クリティカル時には専用アニメーションを再生できます。
最初はアニメーションの違いを小さくしておき、必殺技として強調したい場合に、動きや演出を段階的に派手にしていくのもおすすめです。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
実装例:完全な必殺技システム

ここまで紹介してきた内容は、それぞれ単体でも使えますが、実際のゲームでは「攻撃処理の流れの中でどう組み合わせるか」が重要になります。
このセクションでは、これまで実装してきたクリティカル判定・ダメージ計算・演出・アニメーションをまとめて呼び出し、1回の攻撃処理として完結させる実装例を確認します。

「必殺技システム」としていますが、ここで実装するのは通常攻撃の中にクリティカル(必殺技)要素を組み込んだ構成です。
攻撃処理をまとめるクラスの考え方
まず考えるのは、「攻撃ボタンが押されたときに、何が起きるか」という流れです。
一般的には、次のような順番になります。
攻撃が開始されたら、最初にクリティカルかどうかを判定し、その結果に応じてアニメーションを再生します。
次にダメージを計算し、クリティカルの場合のみ追加演出を再生したうえで、最終的なダメージを相手に適用します。
この一連の流れを1つのメソッドにまとめたのが、以下のサンプルです。
|
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 |
using UnityEngine; public class CompleteCriticalSystem : MonoBehaviour { [Header("システム")] public CriticalSystem criticalSystem; public CriticalDamageCalculator damageCalculator; public CriticalEffectSystem effectSystem; public CriticalAnimationSystem animationSystem; public void ProcessAttack(Unit attacker, Unit defender) { // クリティカル判定 bool isCritical = criticalSystem.CheckCritical(attacker, defender); // アニメーションを再生 animationSystem.PlayAttackAnimation(isCritical); // ダメージを計算 int damage = damageCalculator.CalculateFinalDamage(attacker, defender); // エフェクトを表示 if (isCritical) { effectSystem.PlayCriticalEffect(attacker, defender); } // ダメージを適用 defender.TakeDamage(damage); } } |
このクラスは、それぞれの処理を自分で計算しているわけではなく、役割ごとに分けたクラスを呼び出しているだけです。
そのため、処理の流れが追いやすく、後から修正や拡張をしやすい構成になっています。
この実装例をどう応用できるか
この形をベースにすれば、さまざまな必殺技表現に応用できます。
たとえば、特定のスキルを使ったときだけ必ずクリティカルにしたり、ゲージが溜まっている場合のみダメージ倍率や演出を強化することも可能です。
また、SRPGであれば、ユニットの職業や装備によって呼び出す演出クラスを切り替える、といった使い方もできます。

まずはこの実装例をそのまま動かしてみて、「どの処理が何を担当しているのか」を確認するところから始めると、必殺技システム全体の理解がしやすくなります。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
よくある質問(FAQ)

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

クリティカル判定は、確率計算から始めましょう。
演出を追加することで、爽快感が高まります。
✅ 今日から始める3ステップ
- ステップ1:クリティカル判定を実装する(所要2時間)
- ステップ2:ダメージ倍率を実装する(所要1時間)
- ステップ3:演出システムを実装する(所要3時間)
本格的にUnityを学びたい方は、Unity入門の森で実践的なスキルを身につけましょう。
あなたのペースで、少しずつ進めていけば大丈夫です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント