C# Unity3D:交换子类实例(状态模式)

C# Unity3D:交换子类实例(状态模式),c#,oop,unity3d,state,C#,Oop,Unity3d,State,我创建了以下三个脚本来测试Unity3D中的状态模式(我是Unity的新手),得到了意想不到的结果: 基态 public class BaseState { public void Enter() { Debug.Log("Entered BaseState"); } } 内向 public class IntroState : BaseState { public void Enter() { Debug.Log("En

我创建了以下三个脚本来测试Unity3D中的状态模式(我是Unity的新手),得到了意想不到的结果:

基态

public class BaseState {
    public void Enter()
    {
        Debug.Log("Entered BaseState");
    }
}
内向

public class IntroState : BaseState {
    public void Enter()
    {
        Debug.Log("Entered IntroState");
    }
}
状态控制器

public class StateController : MonoBehavior {
    private BaseState state;

    void Start()
    {
        state = new IntroState();
        state.Enter();
    }
}
当我将其附加到游戏对象时,我希望在控制台中看到“进入内部状态”。相反,我看到的是“进入BaseState”

我做错了什么?

在子类中使用相同的签名定义方法时,您是在“隐藏”方法。 您应该标记
BaseState。将
输入为
public void virtual
并在
IntroState中添加
override
。输入
使其成为
public override void Enter()

发生的情况是,您有一个
state
变量,其类型为
BaseState
。当您编写
state=newintrostate()时您正在进行隐式向上转换(谷歌向上搜索)。在此之后,对
BaseState
对象调用
Enter
方法,这就是为什么会得到“Entered BaseState”

我还建议您查看一个名为“无状态”的库以及这个答案,以获取更多信息