我正在为回调设置一个注册表(我自己的事件处理程序系统)。
客户端代码应该调用Register
,并且可以添加一个函数来处理触发事件。例如,假设FunctionA和FunctionB都订阅了" GOT_HIT"事件,将调用这两个函数。
我知道UnityEvents是要走的路,但我似乎无法向它们添加方法。如果我使用参数,我无法正确使用语法。以下是我在_battleEvents.AddListener(handler);
上出错的代码,因为:
严重级代码描述项目文件行抑制状态 错误CS1503参数1:无法转换为' ActionHandler'到UnityEngine.Events.UnityAction>'
以下是我在指定委托类型的代码中的最佳尝试:
public class ActionEvent:UnityEvent<Dictionary<string, Object>>
{
}
public delegate void ActionHandler(Dictionary<string, Object> props);
public class Dispatcher
{
static Dispatcher _singleton = new Dispatcher();
static Dictionary<string, Object> _subscriptions = new Dictionary<string, Object>();
static ActionEvent _battleEvents = new ActionEvent();
public static void Register(string actionName, ActionHandler handler)
{
switch(actionName)
{
case "battle":
_battleEvents.AddListener(handler);
break;
default:
Debug.Log("Error");
break;
}
}
如果你能告诉我如何正确地制作我的handler
参数,以便我可以添加任何我希望传递的功能,这将是理想的。
当我传递一个像这样的匿名函数时,我能够让它工作:
_battleEvents.AddListener((Dictionary<string, Object> props) => { });
但我希望能够从论证中设置它。
我可以只是在那里调用我的实际处理程序:
_battleEvents.AddListener((Dictionary<string, Object> props) => {handler(props); });
但是我试图跳过它。
即。我想这样做:
public static void Register(GenericDelegate handler)
{
// _battleEvents is UnityEvents object
_battleEvents.AddListener(handler);
}
答案 0 :(得分:0)
知道了。
关键是使用UnityAction
类:
public static void Register(string actionName, UnityAction<Dictionary<string, Object>> handler)
{
switch(actionName)
{
case "battle":
_battleEvents.AddListener(handler);
break;
default:
Debug.Log("Error");
break;
}
}