I’m still pretty new to certain subjects of unity, so I don’t know if this is a stupid question. XD
I tried to find information on this subject but I couldn’t find anything specific.
Currently I’m learning to create dynamic menus.
To handle the variable processes started by buttons I’m working with unityactions.
However, there’s something I don’t understand.
When adding listeners to an onclick event for example it doesn’t seem to make a difference if I’m passing a unityaction or just simply the name of a method.
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using System.Collections;
public class test_unityaction : MonoBehaviour {
private UnityAction action;
void Awake() {
action = new UnityAction (Func);
gameObject.GetComponent<Button> ().onClick.AddListener (action);
gameObject.GetComponent<Button> ().onClick.AddListener (Func);
}
void Func() {
print ("Func");
}
}
This is a very basic and easy code example.
Add it to a button to test it.
The function is launched twice.
So my question is what is the difference here?
Why should I pass a unityaction if I can simply pass the method name?
Passing the method directly instead of a unityaction makes the code much more simple.
Is there a disadvantage for passing the method directly because it seems to work as intended?
I have never used UnityActions. I read in the doc that it is a delegate. Then, you could possibly do something like this (didn’t tested)
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using System.Collections;
public class test_unityaction : MonoBehaviour {
private UnityAction action;
void Awake() {
action = new UnityAction (Func);
action += Func1 ;
action += Func2 ;
gameObject.GetComponent<Button> ().onClick.AddListener (action);
}
void Func() {
print ("Func");
}
void Func1() {
print ("Func1");
}
void Func2() {
print ("Func2");
}
void Func3() {
print ("Func3");
}
}
Obviously, using UnityAction is clearer.
You could also modify the function called dynamically with something like this :
void Update() {
if (Input.GetKeyDown("space"))
{
gameObject.GetComponent<Button> ().onClick.RemoveListener( action ) ;
action -= Func1 ;
action += Func3 ;
gameObject.GetComponent<Button> ().onClick.AddListener (action);
}
}
Then, your button won’t call Func1 anymore but call Func3 instead when you click on your button.
EDIT : I have tested without removing and adding back again the action, it doesn’t seem to work.
Everything I did could have been possible without the UnityAction. Just remove the function you don’t want anymore and add the one you want.
By the way, since AddListener is wainting for a delegate without any parameter and a return type of void, you could have done this :
gameObject.GetComponent<Button> ().onClick.AddListener ( delegate()
{
Debug.Log("Hello World !") ;
}
)
Or, with anonymous delegate :
gameObject.GetComponent<Button> ().onClick.AddListener ( () =>
{
Debug.Log("Hello World !") ;
}
)