【发布时间】:2019-10-06 06:50:21
【问题描述】:
我来自这篇文章
https://unity3d.com/how-to/architect-with-scriptable-objects
并且想知道如何引发事件并将数据传递给它。因为仅仅听这个事件是不够的。我将尝试解释它以进行复制。
首先我创建了一个新的游戏事件LevelSceneLoadedGameEvent
class LevelSceneLoadedGameEvent : UnityEvent<Scene> { }
当引发此事件时,它应该返回加载的当前场景。接下来我创建了一个静态 EventManager 来管理所有这些事件
public static class EventManager
{
private static Dictionary<Type, UnityEvent> events = new Dictionary<Type, UnityEvent>()
{
{
typeof(LevelSceneLoadedGameEvent),
new LevelSceneLoadedGameEvent()
}
};
private static UnityEvent GetEvent<EventType>() where EventType : UnityEvent
{
return events[typeof(EventType)];
}
public static void SubscribeTo<EventType>(UnityAction listener) where EventType : UnityEvent
{
GetEvent<EventType>().AddListener(listener);
}
public static void UnsubscribeFrom<EventType>(UnityAction listener) where EventType : UnityEvent
{
GetEvent<EventType>().RemoveListener(listener);
}
public static void Trigger<EventType>() where EventType : UnityEvent
{
GetEvent<EventType>().Invoke();
}
public static void Trigger<EventType, FirstParam>(FirstParam firstParam) where EventType : UnityEvent
{
GetEvent<EventType>().Invoke(firstParam);
}
}
其他脚本可以订阅/取消订阅事件并触发这些事件。现在出现了两个属于同一类的问题:
- 我无法将我的通用
UnityEvents 存储到字典中,因为它只能保存非通用的
最好的重载Add方法'Dictionary.Add(Type, UnityEvent)' 的集合初始值设定项有一些无效参数 (CS1950) [Assembly-CSharp] 参数 2:无法从 'LevelSceneLoadedGameEvent' 到 'UnityEngine.Events.UnityEvent' (CS1503) [程序集-CSharp]
- 我的带有一个参数的
Trigger方法在Invoke处失败,因为GetEvent返回一个非泛型UnityEvent
“Invoke”方法没有重载需要 1 个参数 (CS1501) [汇编-CSharp]
如何修复我的 EventManager 以处理非泛型和泛型 UnityEvents?
【问题讨论】: