1

そのため、私は Unity でプロジェクトに取り組んでおり (C# スクリプトを使用していますが、質問はほとんど言語に依存しません)、さまざまなゲームの状態を非常に単純なステート マシンで表現しています。

public enum State
{
    Initialized,
    ShowBriefing,
    Running,
    Quitting
};

私の GameStateController クラスでは、ネットワークからのいくつかのコマンドを処理します。たとえば、次のようになります。

if (gameState.CurrentState == GameState.State.Initialized) {
    HandleGameCommand ();
    NetworkInterface.Instance.HandlePresenceMessages ();                
} else if (gameState.CurrentState == GameState.State.ShowBriefing) {
    HandleGameCommand ();
    NetworkInterface.Instance.HandlePresenceMessages ();                
} else if (gameState.CurrentState == GameState.State.Running) { 
    HandleGameCommand ();

    if (lookTargets.Count > 0) {
        // do some stuff
    }

    NetworkInterface.Instance.HandlePresenceMessages ();
} else if (gameState.CurrentState == GameState.State.Quitting) {
    NetworkInterface.Instance.Close ();
    Application.Quit ();                
}

また、HandleGameCommand は通常、次のようになります。

Messages.GameCommand gameCommand = NetworkInterface.Instance.NextMessage<Messages.GameCommand> ("game.command");

if (gameCommand != null) {

    switch (gameCommand.type) {
    case "show-briefing":
        // Show the mission briefing. Currently a NOOP.
        if (gameState.CurrentState == GameState.State.Initialized) {
            gameState.CurrentState = GameState.State.ShowBriefing;
        }

        // Do some other stuff
        break;
    case "run":
        // Set the gameState to Running and respond
        gameState.CurrentState = GameState.State.Running;       
        // Do some other stuff
        break;
    case "detect-look-at":
        if (gameState.CurrentState == GameState.State.Running) {
            lookTargets.Add (json ["target"] as string);
        }
    // And so on

私の質問は - これを行うためのより良い方法は何ですか? 統一された GameCommand ハンドラーを使用するのは好きですが、現在の State を検出するために GameCommand ハンドラー内に if-else を含める必要があるのは好きではありません。

状態ごとに個別の「HandleGameCommand()」メソッドを作成することもできます-HandleGameCommand-Initialized()、HandleGameCommand-ShowBriefing()、しかしそれはずさんなようです。

を作成しDictionary<State, List<string>>、各状態で処理するコマンドのリストを事前に作成できます。

私がやろうとしていることをするための確かなパターンはありますか?

4

0 に答える 0