キャラクターの制御で、状態がごちゃごちゃになってしまう。
多くの学生が最初に感じるのが、この問題です。
実は、ステートマシンを使うことで、すっきりと整理できます。
この記事では、キャラ制御はステートマシンが最強として、Idle/Run/Jumpの基本構造を解説します。
✨ この記事でわかること
- ステートマシンの基本概念
- Idle/Run/Jumpの実装方法
- Animatorとの使い分け
- 実践的な応用例

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

ステートマシンは、キャラクターの状態を管理する仕組みです。
主な特徴は次の通りです。
- 状態を明確に定義する
- 状態の遷移を管理する
- 各状態での処理を分離する
状態を分けるだけで、キャラの動きが一気に扱いやすくなります。
ジャンプや走りの切り替えが思い通りに動く瞬間、ゲーム制作がぐっと楽しくなります。
とくにゲームでは Idle(待機)→Run(走行)→Jump(ジャンプ)のような“切り替わりの分かりやすい動作” が揃っているため、ステートマシンを理解する題材としてぴったりです。
Idle/Run/Jumpの実装方法

ステートマシンの魅力が最も分かりやすく表れるのが、Idle(待機)・Run(走行)・Jump(ジャンプ)の基本3ステートです。
この3つは動きの切り替えがはっきりしており、ステートマシンの構造を理解する題材として最適です。
まずは「どうやって状態を切り替えるのか」をイメージできるよう、最小構成のコード例とともに解説します。
これを理解すれば、攻撃やダメージなどの複雑な動きも簡単に追加できるようになります。
Idle/Run/Jumpが基本ステートとして使われる理由
以下の3つの動作は、プレイヤーの入力に直結しており、遷移条件が直感的に理解できます。
- 入力なし → Idle(待機)
- 移動キー → Run(走行)
- ジャンプキー → Jump(ジャンプ)
状態遷移がわかりやすいため、ステートマシンの理解が進み、コードの構造も掴みやすくなります。
基本ステートのコード構造イメージ
以下は最低限のシンプルなステートマシン構造です。
1行ごとに「何をしているのか」コメントを入れているため、初心者でも動作イメージが掴みやすくなっています。
状態の共通ルール(抽象クラス)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// すべての状態(Idle/Run/Jump)が必ず持つ仕組み public abstract class PlayerState { protected PlayerController player; // プレイヤー本体への参照 public PlayerState(PlayerController player) { this.player = player; } public abstract void Enter(); // 状態に入った瞬間の処理 public abstract void Update(); // 毎フレーム実行する処理 public abstract void Exit(); // 状態を抜ける瞬間の処理 } |
Idle(待機状態)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Idle(立ち止まり状態) public class IdleState : PlayerState { public IdleState(PlayerController player) : base(player) {} public override void Update() { // 移動キーを押したら Run に切り替える if (player.IsMoveKey) player.ChangeState(player.RunState); // ジャンプキーが押されたら Jump に切り替える if (player.IsJumpKey) player.ChangeState(player.JumpState); // それ以外は Idle のまま待機 } } |
Run(走行状態)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Run(走行状態) public class RunState : PlayerState { public RunState(PlayerController player) : base(player) {} public override void Update() { player.Move(); // 横移動処理 // 移動キーを離したら Idle に戻る if (!player.IsMoveKey) player.ChangeState(player.IdleState); // ジャンプされたら Jump へ if (player.IsJumpKey) player.ChangeState(player.JumpState); } } |
Jump(ジャンプ状態)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// Jump(ジャンプ状態) public class JumpState : PlayerState { public JumpState(PlayerController player) : base(player) {} public override void Enter() { player.Jump(); // 上方向の力を加える } public override void Update() { // 地面に着いたら Idle に戻る if (player.IsGrounded) player.ChangeState(player.IdleState); // 空中では左右移動が可能 player.AirMove(); } } |
ステートを切り替える司令塔(PlayerController)
|
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 |
public class PlayerController : MonoBehaviour { public PlayerState IdleState; public PlayerState RunState; public PlayerState JumpState; private PlayerState current; // 現在の状態 void Start() { // 各ステートを生成してプレイヤー本体を渡す IdleState = new IdleState(this); RunState = new RunState(this); JumpState = new JumpState(this); ChangeState(IdleState); // 最初は待機からスタート } void Update() { current.Update(); // 現在の状態の処理だけが動く } public void ChangeState(PlayerState next) { current?.Exit(); // 今の状態を終了 current = next; // 次の状態に切り替え current.Enter(); // 新しい状態を開始 } // 状態から呼び出される簡易メソッド public void Move() { /* 横移動 */ } public void AirMove() { /* 空中移動 */ } public void Jump() { /* ジャンプ力を加える */ } // 入力や地面判定(簡易版) public bool IsMoveKey => Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.LeftArrow); public bool IsJumpKey => Input.GetKeyDown(KeyCode.Space); public bool IsGrounded => true; // 実際は地面判定と連動 } |
ステートマシンを使うと何が嬉しいのか
Idle・Run・Jumpの3ステートを作るだけで、キャラクターはつねに「今の状態が担当する処理だけ」 を実行するようになります。
- Idle中 → 待機処理だけ
- Run中 → 移動処理だけ
- Jump中 → 空中処理だけ
処理が混ざらないため、コードがとても読みやすくなり、後から攻撃やダメージステートを追加するのも簡単です。
ステートマシンの本当の気持ちよさは、この「拡張性の高さ」にあります。
次に、Idle/Run/Jumpの遷移手順をタイムライン形式でまとめています。
- STEP1状態を定義Idle、Run、Jumpの3つの状態を定義します。
- STEP2遷移条件を設定各状態から別の状態への遷移条件を設定します。
- STEP3各状態の処理を実装各状態での処理を実装します。
- STEP4状態遷移を実装条件に応じて状態を遷移させます。
ここまで理解できれば、アクションゲームのキャラ制御は一気に扱いやすくなります。
Animatorとの使い分け

キャラ制御では、「アニメーションの見た目」と「キャラの動きのロジック」を分けて考えると、とても作りやすくなります。
まずはシンプルに、Animator とコードが得意なことを比べてみましょう。
| 用途 | Animator | コード |
| アニメーション制御 | 得意 | 不向き |
| ロジック制御 | 不向き | 得意 |
| 複雑な条件分岐 | 不得意 | 得意 |
初心者が迷わないシンプルな考え方
キャラの制御は、次のように分担するとわかりやすくなります。
- Animator:見た目の動き(アニメ)
- コード:キャラの判断と行動(ロジック)
たとえば「走る」場合はこうなります。
- コード:移動キーが押された → Run状態に切り替える
- Animator:Runアニメを再生する
この役割分担をしておくと、アニメーションが暴走したり、ジャンプ中に走りアニメが出るような混乱が起きにくくなります。
使い分けを意識するとどう変わる?
- キャラの動きが思い通りになる
- アニメ切り替えが楽になる
- 後から追加する処理が壊れにくい
難しいことを覚えなくても、「見た目=Animator」「動き=コード」と分けるだけで、ゲーム制作がかなりスムーズになります。
実践的な応用例

Idle / Run / Jump の基本構造が分かると、キャラクターの動きをどんどん広げられます。
アクションゲームでは、次のような状態を追加することが多いです。
- 攻撃状態
- ダメージ状態
- 死亡状態
ステートマシンの良さは、こうした状態を後から増やしても、既存の仕組みを壊さず自然に組み込めるところです。
新しい状態用のクラスを1つ追加し、必要な遷移を数行書き足すだけで、動きがきれいに繋がります。
コードが混ざらないため、アクションが増えるほど「制御のしやすさ」を実感できます。
基本が整っていると、キャラクターの表現を自由に広げていける感覚があって、作っていてとても楽しくなります。
ここでステートマシンがよく使われる理由が分かりはじめる人が多いです。
複雑なキャラ制御ほど、そのメリットがそのまま開発のしやすさにつながります。
基本構造を押さえていれば、拡張は難しくありません。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
実践的なステートマシン制作を学ぶには

ここまで、キャラ制御はステートマシンが最強について解説してきました。
ステートマシンは、アクションゲームの設計に必須です。
Unity入門の森では、Unityを使ったアクションゲームの作り方を、基礎から完成まで丁寧に解説しています。
コードの意味から、なぜその実装方法を選ぶのかまで、しっかり理解できる内容になっています。
アクションゲーム制作に特化した講座なら、効率的にスキルアップできます。
ゲーム制作でスキルを上げたい方は、ぜひチェックしてみてください。
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
まとめ

キャラ制御はステートマシンが最強について解説しました。
要点のまとめ
- ステートマシンは、キャラクターの状態を管理する仕組み
- Idle/Run/Jumpの実装は、状態を定義して遷移条件を設定する
- Animatorはアニメーション制御、コードはロジック制御に適している
- ステートマシンは、アクションゲームの設計に必須
基本を押さえれば、あとは応用していくだけです。
まずは、シンプルなステートマシンから始めてみてください。
動かしながら理解を深めていくのが、上達への近道です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント