Unity向けのシンプルで軽量なステートマシンライブラリです。外部依存なしでゲームの進行管理を簡単に実装できます。
- 🚀 軽量: 外部ライブラリを一切使用しない純粋なC#実装
- 🔄 シンプル: 最小限のAPIで直感的に使える
- 💾 効率的: ステートをキャッシュし、無駄なインスタンス生成を防ぐ
- 🎮 Unity最適化: Unity 6000.0以降に対応
- 🔌 即使用可能: 自動初期化により設定不要で使い始められる
- 🎬 シーン連携: シーンロードとステート遷移を同時に実行可能
- 🔧 開発支援: ビルド設定からシーン名のEnum自動生成ツール付き
- Releasesページから最新の
GameStateMachine-x.x.x.unitypackageをダウンロード - Unityエディタでダウンロードした
.unitypackageファイルをダブルクリック、またはAssets > Import Package > Custom Packageから選択 - インポートダイアログで必要なファイルを確認し、「Import」をクリック
StateBaseクラスを継承してステートを作成します。
using Yuffter.GameStateMachine;
public class TitleState : StateBase
{
public override void Enter()
{
Debug.Log("タイトル画面に入りました");
// タイトル画面のUIを表示する処理など
}
public override void Update()
{
// タイトル画面での毎フレームの処理
if (Input.GetKeyDown(KeyCode.Space))
{
GameStateMachine.Instance.ChangeState<GamePlayState>();
}
}
public override void Exit()
{
Debug.Log("タイトル画面を離れました");
// タイトル画面のUIを非表示にする処理など
}
}
public class GamePlayState : StateBase
{
public override void Enter()
{
Debug.Log("ゲームプレイ開始");
// ゲーム開始時の処理
}
public override void Update()
{
// ゲームプレイ中の処理
}
public override void Exit()
{
Debug.Log("ゲームプレイ終了");
// ゲーム終了時の処理
}
}任意のスクリプトから初期ステートを設定します。
using UnityEngine;
using Yuffter.GameStateMachine;
public class GameInitializer : MonoBehaviour
{
void Start()
{
// タイトル画面から開始
GameStateMachine.Instance.SetInitialState<TitleState>();
}
}ChangeState<T>()メソッドでステートを切り替えます。
// ゲームプレイステートに遷移
GameStateMachine.Instance.ChangeState<GamePlayState>();
// タイトルステートに戻る
GameStateMachine.Instance.ChangeState<TitleState>();シーンの読み込みとステート遷移を同時に行います。
// GameSceneをロードしてGamePlayステートに遷移
GameStateMachine.Instance.ChangeStateWithSceneLoad<GamePlayState>(SceneName.GameScene);ビルド設定に登録されたシーンから、タイプセーフなEnum定義を自動生成できます。
- メニューから
Tools > Yuffter > Game State Machine > Generate SceneEnumを選択 Assets/GameStateMachine/Generated/SceneEnum.csにEnumファイルが生成されますChangeStateWithSceneLoadメソッドで使用できます
IState currentState = GameStateMachine.Instance.CurrentState;
Debug.Log($"現在のステート: {currentState.GetType().Name}");シングルトンパターンで実装されたステートマシン本体。
static GameStateMachine Instance- シングルトンインスタンスIState CurrentState- 現在のステート(読み取り専用)
-
void SetInitialState<T>() where T : IState- 初期ステートを設定します
- 通常はゲーム開始時に一度だけ呼び出します
-
void ChangeState<T>() where T : IState- 指定したステートに遷移します
- 現在のステートと同じステートを指定した場合は何もしません
- 前のステートの
Exit()を呼び、新しいステートのEnter()を呼びます
-
void ChangeStateWithSceneLoad<T>(SceneName sceneName) where T : IState- シーンを非同期でロードし、ロード完了後に指定したステートに遷移します
- シーン遷移が必要なステート変更に使用します
ステートが実装すべきインターフェース。
void Enter()- このステートに入ったときに呼ばれますvoid Update()- このステートの間、毎フレーム呼ばれますvoid Exit()- このステートから出るときに呼ばれます
IStateインターフェースの基本実装を提供する抽象クラス。すべてのメソッドはvirtualなので、必要なものだけオーバーライドできます。
public class TitleState : StateBase
{
public override void Enter()
{
// タイトルUIを表示
UIManager.Instance.ShowTitle();
}
public override void Update()
{
if (Input.GetKeyDown(KeyCode.Return))
{
GameStateMachine.Instance.ChangeState<GamePlayState>();
}
}
public override void Exit()
{
// タイトルUIを非表示
UIManager.Instance.HideTitle();
}
}
public class GamePlayState : StateBase
{
public override void Enter()
{
// ゲームを初期化
GameController.Instance.Initialize();
}
public override void Update()
{
// ゲームロジック実行
if (GameController.Instance.IsGameOver())
{
GameStateMachine.Instance.ChangeState<GameOverState>();
}
}
public override void Exit()
{
// ゲームをクリーンアップ
GameController.Instance.Cleanup();
}
}
public class GameOverState : StateBase
{
public override void Enter()
{
// ゲームオーバーUIを表示
UIManager.Instance.ShowGameOver();
}
public override void Update()
{
if (Input.GetKeyDown(KeyCode.R))
{
GameStateMachine.Instance.ChangeState<GamePlayState>();
}
else if (Input.GetKeyDown(KeyCode.Escape))
{
GameStateMachine.Instance.ChangeState<TitleState>();
}
}
}RuntimeInitializeOnLoadMethod属性を使用して、シーン読み込み前に自動的にGameStateMachineを初期化します。手動でGameObjectに追加する必要はありません。
DontDestroyOnLoadにより、シーン遷移してもGameStateMachineインスタンスは破棄されません。これによりシーンをまたいだステート管理が可能です。
一度作成されたステートはキャッシュされ、再利用されます。これにより、頻繁なステート遷移でもパフォーマンスが維持されます。
GameStateMachineはシングルトンパターンで実装されており、どこからでもGameStateMachine.Instanceでアクセスできます。
- Unity 6000.0 以降
- .NET Standard 2.1 以降
MITライセンス - 詳細はLICENSEファイルを参照してください。
プルリクエストや Issue の報告を歓迎します!
Yuffter