Skip to content

外部ライブラリを一切使用していないゲーム進行管理用ステートマシンです

License

Notifications You must be signed in to change notification settings

Yuffter/UnityGameStateMachine

Repository files navigation

Native Game State Machine

Unity向けのシンプルで軽量なステートマシンライブラリです。外部依存なしでゲームの進行管理を簡単に実装できます。

特徴

  • 🚀 軽量: 外部ライブラリを一切使用しない純粋なC#実装
  • 🔄 シンプル: 最小限のAPIで直感的に使える
  • 💾 効率的: ステートをキャッシュし、無駄なインスタンス生成を防ぐ
  • 🎮 Unity最適化: Unity 6000.0以降に対応
  • 🔌 即使用可能: 自動初期化により設定不要で使い始められる
  • 🎬 シーン連携: シーンロードとステート遷移を同時に実行可能
  • 🔧 開発支援: ビルド設定からシーン名のEnum自動生成ツール付き

インストール

UnityPackage からインストール

  1. Releasesページから最新のGameStateMachine-x.x.x.unitypackageをダウンロード
  2. Unityエディタでダウンロードした.unitypackageファイルをダブルクリック、またはAssets > Import Package > Custom Packageから選択
  3. インポートダイアログで必要なファイルを確認し、「Import」をクリック

使い方

基本的な使い方

1. ステートクラスを作成

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("ゲームプレイ終了");
        // ゲーム終了時の処理
    }
}

2. 初期ステートを設定

任意のスクリプトから初期ステートを設定します。

using UnityEngine;
using Yuffter.GameStateMachine;

public class GameInitializer : MonoBehaviour
{
    void Start()
    {
        // タイトル画面から開始
        GameStateMachine.Instance.SetInitialState<TitleState>();
    }
}

3. ステートを遷移

ChangeState<T>()メソッドでステートを切り替えます。

// ゲームプレイステートに遷移
GameStateMachine.Instance.ChangeState<GamePlayState>();

// タイトルステートに戻る
GameStateMachine.Instance.ChangeState<TitleState>();

シーンをロードしながらステート遷移

シーンの読み込みとステート遷移を同時に行います。

// GameSceneをロードしてGamePlayステートに遷移
GameStateMachine.Instance.ChangeStateWithSceneLoad<GamePlayState>(SceneName.GameScene);

SceneEnum を生成

ビルド設定に登録されたシーンから、タイプセーフなEnum定義を自動生成できます。

  1. メニューから Tools > Yuffter > Game State Machine > Generate SceneEnum を選択
  2. Assets/GameStateMachine/Generated/SceneEnum.cs にEnumファイルが生成されます
  3. ChangeStateWithSceneLoad メソッドで使用できます

現在のステートを取得

IState currentState = GameStateMachine.Instance.CurrentState;
Debug.Log($"現在のステート: {currentState.GetType().Name}");

API リファレンス

GameStateMachine

シングルトンパターンで実装されたステートマシン本体。

プロパティ

  • 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

    • シーンを非同期でロードし、ロード完了後に指定したステートに遷移します
    • シーン遷移が必要なステート変更に使用します

IState

ステートが実装すべきインターフェース。

メソッド

  • void Enter() - このステートに入ったときに呼ばれます
  • void Update() - このステートの間、毎フレーム呼ばれます
  • void Exit() - このステートから出るときに呼ばれます

StateBase

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

リンク

About

外部ライブラリを一切使用していないゲーム進行管理用ステートマシンです

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages