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

时间:2017-11-28 15:06:01

标签: c# oop unity3d state

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

BaseState

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

IntroState

public class IntroState : BaseState {
    public void Enter()
    {
        Debug.Log("Entered IntroState");
    }
}

StateController

public class StateController : MonoBehavior {
    private BaseState state;

    void Start()
    {
        state = new IntroState();
        state.Enter();
    }
}

当我将它附加到GameObject时,我希望看到"进入IntroState"在控制台中。相反,我看到"进入BaseState"。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

你是"隐藏"在子类中使用相同签名定义它时的方法。 您应将BaseState.Enter标记为public void virtual并在override中添加IntroState.Enter,使其变为public override void Enter()

发生的事情是您拥有state类型的BaseState变量。当您编写state = new IntroState();时,您正在进行隐式上传(谷歌搜索)。之后,您在Enter对象上调用了BaseState方法,这就是为什么你得到"进入BaseState"

我还建议您查看名为" Stateless"的图书馆。以及更多信息的答案

Overriding vs method hiding