C# 职责重叠的状态机模式

C# 职责重叠的状态机模式,c#,state-machine,C#,State Machine,因此,我正在Unity中进行一个项目(使用C#脚本,尽管问题主要是语言不可知的),我用一个非常简单的状态机表示各种游戏状态 public enum State { Initialized, ShowBriefing, Running, Quitting }; 在我的GameStateController类中,我处理来自网络的一些命令,假设它看起来像这样: if (gameState.CurrentState == GameState.State.Initiali

因此,我正在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 ();                
}
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
HandleGameCommand通常如下所示:

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 ();                
}
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
Messages.GameCommand GameCommand=NetworkInterface.Instance.NextMessage(“game.command”);
if(gameCommand!=null){
开关(gameCommand.type){
案例“展示简报”:
//显示任务简报。目前为NOOP。
if(gameState.CurrentState==gameState.State.Initialized){
gameState.CurrentState=gameState.State.ShowBriefing;
}
//做些别的事情
打破
案例“运行”:
//将游戏状态设置为Running并响应
gameState.CurrentState=gameState.State.Running;
//做些别的事情
打破
案例“检测看”:
if(gameState.CurrentState==gameState.State.Running){
添加(json[“target”]作为字符串);
}
//等等
我的问题是-有什么更好的方法可以做到这一点?我喜欢有一个统一的GameCommand处理程序,但我不喜欢在GameCommand处理程序中有if-else来检测我所处的状态

我可以为每个状态创建单独的“HandleGameCommand()”方法-HandleGameCommand-Initialized(),HandleGameCommand-ShowBriefing(),但这似乎有些草率

我可以创建一个
字典
,并预先构建一个列表,列出每个状态要处理的命令


我想做的事情有固定的模式吗?

为什么要使用单独的“HandleGameCommand()”方法看起来很邋遢?在我看来,让一个方法尝试做所有事情似乎更邋遢。因为每个方法在结构上都非常相似。也许我试图对其进行过度设计,但应该有一个方法可以实现获取GameCommand和打开类型的框架,并简单地传递一个映射字符串和委托。