如何在Unity Editor Script中将Persistent Listener添加到Button.onClick事件

我想做一件简单的事:

  1. 创建一个新的GameObject
  2. Button组件添加到gameObject。
  3. 向按钮的onClick事件添加持久监听器。

我试图注册的方法是在其他一些脚本中。 这是我正在尝试的一段代码:

 MyScript myScriptInstance = FindObjectOfType(); var go = new GameObject(); var btn = go.AddComponent

MyScript.cs看起来像这样:

 public class MyScript : MonoBehaviour { public void OnButtonClick(GameObject sender) { // do some stuff here. } } 

当我运行此代码时,按钮Onclick侦听器是空的,如下所示:

在此处输入图像描述

如果我换行

 var action = (UnityAction) Delegate.CreateDelegate(typeof(UnityAction), go, targetinfo, false); 

 var action = (UnityAction) Delegate.CreateDelegate(typeof(UnityAction), go, targetinfo, true); 

我明白了:

ArgumentException:方法参数长度不匹配System.Delegate.CreateDelegate(System.Type类型,System.Object firstArgument,System.Reflection.MethodInfo方法,Boolean throwOnBindFailure)

我遵循了这些说明,但不知道这里出了什么问题。

真的很感激任何forms的帮助。

花了这么多时间,我得出结论,这是一个错误。 这是一个单声道的bug。

以下是参考资料:

参考文献1 , 参考文献2 , 参考文献3和参考文献4

Unity不会很快解决这个问题。 他们通常不修复与Mono相关的东西,因为他们已经在努力升级到最新的Mono运行时。

幸运的是,还有另外两种解决方法:

1.使用generics参数使用AddObjectPersistentListenerUnityAction ,然后将generics传递给Delegate.CreateDelegate函数。

 MyScript myScriptInstance = FindObjectOfType(); var go = new GameObject(); var btn = go.AddComponent 

2,不要使用Delegate.CreateDelegate 。 只需使用AddObjectPersistentListener

 MyScript myScriptInstance = FindObjectOfType(); var go = new GameObject(); var btn = go.AddComponent 

如果这些都给你这个:

在此处输入图像描述

第二种解决方案不需要通过reflection找到函数。 您必须在运行时绑定该函数。 第一个使用reflection。

您可能需要使用第一个解决方案,因为它与您正在执行的操作非常相似,您可以将函数名称作为字符串变量提供。

也许我不明白你的问题,但Button脚本公开了onClick事件,你可以添加监听器 (在代码中)。

这是我使用的代码:

 // Use this for initialization void Start () { MyScript myScriptInstance = FindObjectOfType (); GameObject go = DefaultControls.CreateButton (new DefaultControls.Resources()); var btn = go.GetComponent 

这是MyScript.TestMethod的代码:

 public void TestMethod () { Debug.Log ("TestMethod"); } 

有几点需要注意:

  1. 您手动创建GameObject并向其添加Button组件。 UI元素有点不同,因为它们具有RectTransform并且必须存在于要呈现的Canvas对象下。
  2. 在我的示例中,我创建按钮的方式与从UI菜单项本身创建的方式类似(请参阅此处的参考资料)。 这将成功创建它,但不会在canvas下添加它。
  3. 最后一件事 – 在我的例子中,我定义的TestMethod只是打印一个日志。 单击按钮时,它会记录消息,但在Button的检查器中,我看不到列出的任何onClick事件。 这可能只是意味着在运行时向其添加侦听器时不会刷新检查器。