将通用委托参数传递给UnityEvent

时间:2016-05-08 21:10:52

标签: c# generics unity3d delegates

我正在为回调设置一个注册表(我自己的事件处理程序系统)。

客户端代码应该调用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);
  }

1 个答案:

答案 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;
    }
  }