我有四节课Event
and Action
这两个都是基类,然后我有两个子类Create : Event
and MoveTo : Action
.
Event
包含一个列表Action
实例,以及何时Trigger()
被称为孩子Create
它调用Event.Trigger()
,它循环操作列表,并调用Action.Run()
在每个调用的操作上Called()
.
我遇到的问题是virtual
方法被调用,而不是override
里面的方法MoveTo
.
[Serializable]
public abstract class Event : MonoBehaviour {
[SerializeField] public List<Action> actions = new List<Action>();
protected void Trigger() {
foreach (Action action in actions) {
action.Run();
}
}
}
Event
public class Create : Event {
void Start() {
Trigger();
}
}
Action
[Serializable]
public class Action {
public virtual void Called() {
Debug.Log("Virtual");
}
public void Run() {
Called();
}
}
MoveTo
public class MoveTo : Action {
public override void Called() {
Debug.Log("Called");
}
}
我正在添加MoveTo
将事件列表从 Unity 编辑器添加到预制件上。我不确定 Unity 如何在运行时处理这些,是初始化它们还是我?我不确定。这可能是导致我的问题的原因......
private Event GetCurrentEvent(){}
void AddActionCallback(Type actionType) {
// actionType is MoveTo
var prefab = GetCurrentPrefabItem().Value;
var evt = GetCurrentEvent();
evt.actions.Add((Action)Activator.CreateInstance(actionType));
Undo.RecordObject(prefab.gameObject, "Added actions");
PrefabUtility.RecordPrefabInstancePropertyModifications(prefab.gameObject);
}
这是我运行游戏之前的样子。表明MoveTo
,红栏中的按钮显示使用的操作action.GetType().Name
。这是我运行游戏之前的名称:
运行游戏后,按钮现在看起来像这样:
运行时:
evt.actions.Add((Action)Activator.CreateInstance(actionType));
编辑器显示类型不匹配即使当输出actionType
and Activator.CreateInstance(actionType)
is MoveTo
: