How to add Persistent Listener to Button.onClick event in Unity Editor Script
After spending so much time on this, I came to conclusion that this is a bug. This is a Mono bug.
Here are the references:
Ref 1, Ref 2, Ref 3 and Ref 4
Unity wont fix this anytime soon. They usually don't fix stuff related to Mono since they are already working to upgrade to the latest Mono run-time.
Luckily, there are two other workarounds:
Use
AddObjectPersistentListener
andUnityAction
with generic parameter then pass in the generic to theDelegate.CreateDelegate
function.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);
Don't use
Delegate.CreateDelegate
at-all. Simply useAddObjectPersistentListener
.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);
Both of these gives you this:
The second solution does not require finding the function with reflection. You must bind the function before run-time. The first one uses reflection.
You probably need to use the first solution as it is very similar to what you are doing and you can provide the function name as a string variable.