У меня есть четыре класса, Event
и Action
, которые оба являются базовыми классами, и затем у меня есть два дочерних класса Create : Event
и 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();
}
}
}
Событие
public class Create : Event {
void Start() {
Trigger();
}
}
Действие
[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 на префаб.Я не уверен, как единство обрабатывает их во время выполнения, инициализирует их или нет?В этом я не уверен.Вот что может быть причиной моей проблемы ...
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
.Это имя до запуска игры:
![before](https://i.stack.imgur.com/b9Skq.png)
После запуска игры кнопка теперь выглядит так:
![after](https://i.stack.imgur.com/uqfE5.png)
При работе:
evt.actions.Add((Action)Activator.CreateInstance(actionType));
Редактор отображает Несоответствие типов , даже если выходные данные actionType
и Activator.CreateInstance(actionType)
MoveTo
:
![type mismatch](https://i.stack.imgur.com/WJ0KY.png)