如何在Unity Editor Script中将Persistent Listener添加到Button.onClick事件
我想做一件简单的事:
- 创建一个新的
GameObject
- 将
Button
组件添加到gameObject。 - 向按钮的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参数使用AddObjectPersistentListener
和UnityAction
,然后将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"); }
有几点需要注意:
- 您手动创建GameObject并向其添加Button组件。 UI元素有点不同,因为它们具有RectTransform并且必须存在于要呈现的Canvas对象下。
- 在我的示例中,我创建按钮的方式与从UI菜单项本身创建的方式类似(请参阅此处的参考资料)。 这将成功创建它,但不会在canvas下添加它。
- 最后一件事 – 在我的例子中,我定义的TestMethod只是打印一个日志。 单击按钮时,它会记录消息,但在Button的检查器中,我看不到列出的任何onClick事件。 这可能只是意味着在运行时向其添加侦听器时不会刷新检查器。