Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 状态机-如何将成功后的操作信息传递给状态机_C#_Unity3d_Artificial Intelligence_State Machine - Fatal编程技术网

C# 状态机-如何将成功后的操作信息传递给状态机

C# 状态机-如何将成功后的操作信息传递给状态机,c#,unity3d,artificial-intelligence,state-machine,C#,Unity3d,Artificial Intelligence,State Machine,我在我的城市管理游戏中使用我自己的状态机作为我的AI,它运行得相当好。我使用了一个非常简单的界面: public interface IState { int Id { get; set; } void Enter(); void Execute(); void Exit(); } 要更改状态,请执行以下操作: public void ChangeState(IState newState) { if (currentState !=

我在我的城市管理游戏中使用我自己的状态机作为我的AI,它运行得相当好。我使用了一个非常简单的界面:

public interface IState
{
    int Id { get; set; }

    void Enter();
    void Execute();
    void Exit();
}
要更改状态,请执行以下操作:

public void ChangeState(IState newState)
    {

        if (currentState != null)
            currentState.Exit();

        if (currentState != newState)
        {
            currentState = newState;
            currentState.Enter();
        }
    }
我唯一的问题是,我发现自己重新编写了很多逻辑,给出了一个场景:

有面包师、铁匠、建筑工人等等。所有这些职业都有一个状态,即找到最近的储存设施,然后去那里收集他们工作所需的材料

同样的逻辑也适用于所有的面包店,除了说明当你到达仓库时该做什么的那一行之外,也就是说,面包师想要得到小麦,然后回到他们的面包店。铁匠会想要一些铁,然后回到他们的铁匠那里

基本上他们做的是:

  • 查找存储
  • 去仓库
  • 如果存储有资源,请更改状态以返回工作区
  • 否则,请查找下一个最近的存储,并查看该存储是否具有该资源
  • 重复3,直到找到资源
  • 正如你所能想象的,我对国家“回到工作场所”有着完全相同的问题,在这个国家,除了到达后该做什么,基本上是完全相同的逻辑

    有没有什么聪明的方法可以创建一个名为“FindStorageState”的单一状态,并在我的单位到达后向其传递如何做的信息

    以下是一个很好的职业示例:


    为什么不将这些额外信息存储在实现接口的类中?取决于你对信息的需求程度,它可以是任何东西,从一个简单的值到一个在适当的时候执行的
    委托
    (甚至是另一个带方法的类)@unholyshim嗯,没有“Baker”类或“Blacksmith”类,他们都只是不同职业的工人,因此,要找到一个面包师,我需要
    查找所有工人,其中currentProfessions==“baker”
    我的意思是你可以将其存储在
    FindStorageState
    类中,那么你的意思是通过该职业,并且根据职业的不同,它会做出不同的反应?不要担心投票结果如何,看看首页,一切都会无缘无故地被否决。。。至于您的问题,我认为您应该有一个worker基类,其中包含所有的方法(find shop、action at shop、action at home等等),都是虚拟的,这样您就可以继承子类型。那些是铁匠等等。根据需要使用这些工具中的每一个。整个系统只处理工人类型。