- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试做一件简单的事情:
GameObject
Button
组件添加到 GameObject
。Button
的 OnClick
事件添加持久监听器。我尝试注册的方法在其他一些脚本中。这是我正在尝试的一段代码:
MyScript myScriptInstance = FindObjectOfType<MyScript>();
var go = new GameObject();
var btn = go.AddComponent<Button>();
var targetinfo = UnityEvent.GetValidMethodInfo(myScriptInstance,
"OnButtonClick", new Type[]{typeof(GameObject)});
var action = (UnityAction) Delegate.CreateDelegate(typeof(UnityAction),go, targetinfo, false);
UnityEventTools.AddPersistentListener(btn.onClick, action);
MyScript.cs 看起来像这样:
public class MyScript : MonoBehaviour
{
public void OnButtonClick(GameObject sender)
{
// do some stuff here.
}
}
当我运行这段代码时,Buttons Onclick 监听器是空的,如下所示:
如果我换行
var action = (UnityAction) Delegate.CreateDelegate(typeof(UnityAction),
go, targetinfo, false);
到
var action = (UnityAction) Delegate.CreateDelegate(typeof(UnityAction),
go, targetinfo, true);
我明白了:
ArgumentException: method argument length mismatchSystem.Delegate.CreateDelegate (System.Type type, System.ObjectfirstArgument, System.Reflection.MethodInfo method, BooleanthrowOnBindFailure)
我关注了these instructions但不知道这里出了什么问题。
非常感谢任何形式的帮助。
最佳答案
在这上面花了这么多时间之后,我得出结论,这是一个错误。这是一个单声道错误。
引用资料如下:
Unity 不会很快解决这个问题。他们通常不会修复与 Mono 相关的问题,因为他们已经在努力升级到最新的 Mono 运行时。
幸运的是,还有另外两种解决方法:
将 AddObjectPersistentListener
和 UnityAction
与通用参数一起使用,然后将通用参数传递给 Delegate.CreateDelegate
函数。
MyScript myScriptInstance = FindObjectOfType<MyScript>();
var go = new GameObject();
var btn = go.AddComponent<Button>();
var targetinfo = UnityEvent.GetValidMethodInfo(myScriptInstance,
"OnButtonClick", new Type[] { typeof(GameObject) });
UnityAction<GameObject> action = Delegate.CreateDelegate(typeof(UnityAction<GameObject>), myScriptInstance, targetinfo, false) as UnityAction<GameObject>;
UnityEventTools.AddObjectPersistentListener<GameObject>(btn.onClick, action, go);
根本不要使用 Delegate.CreateDelegate
。只需使用 AddObjectPersistentListener
。
MyScript myScriptInstance = FindObjectOfType<MyScript>();
var go = new GameObject();
var btn = go.AddComponent<Button>();
UnityAction<GameObject> action = new UnityAction<GameObject>(myScriptInstance.OnButtonClick);
UnityEventTools.AddObjectPersistentListener<GameObject>(btn.onClick, action, go);
这两个都给你这个:
第二种方案不需要用反射找函数。您必须在运行时之前绑定(bind)函数。第一个使用反射。
您可能需要使用第一个解决方案,因为它与您正在做的非常相似,并且您可以提供函数名称作为字符串变量。
关于c# - 如何在 Unity Editor 脚本中将 Persistent Listener 添加到 Button.onClick 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40655089/
我是一名优秀的程序员,十分优秀!