How do you add an UI EventTrigger by Script ?

The new Unity 4.6 System comes with an EventTrigger System. From the editor this is easy to use but how does one add a trigger, for example for PointerClick, by script (C#) ?

Let’s say i have a function called Foo() in a class called ExampleAction on the a child of the gameObject that contains the event trigger. How do i assign now a PointerClick to call ExampleAction.Foo() on that childobject

Thanks!

Hey there, I believe you’re after something like this…

EventTrigger trigger = GetComponentInParent<EventTrigger>();
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerClick;
entry.callback.AddListener( (eventData) => { Foo(); } );
trigger.delegates.Add(entry);

No he means that:

newButton.GetComponent<Button>().onClick.AddListener(()=>TestScript());

or:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
 
public class ClickableButton : MonoBehaviour, IPointerClickHandler {
 
    public void OnPointerClick(PointerEventData eventData)
    {
        if (eventData.button == PointerEventData.InputButton.Left)
            Debug.Log("Left click");
        else if (eventData.button == PointerEventData.InputButton.Middle)
            Debug.Log("Middle click");
        else if (eventData.button == PointerEventData.InputButton.Right)
            Debug.Log("Right click");
    }
}

Building on Phles’s answer, here’s pretty much the same code, neatly wrapped in a function:

public static void AddEventTriggerListener(EventTrigger trigger,
                                           EventTriggerType eventType,
                                           System.Action<BaseEventData> callback)
{
	EventTrigger.Entry entry = new EventTrigger.Entry();
	entry.eventID = eventType;
	entry.callback = new EventTrigger.TriggerEvent();
	entry.callback.AddListener(new UnityEngine.Events.UnityAction<BaseEventData>(callback));
	trigger.triggers.Add(entry);
}

You could use it like this, for example:

	AddEventTriggerListener(
		GetComponent<EventTrigger>(),
		EventTriggerType.PointerClick,
		OnClicked);

// Callback function
void OnClicked(BaseEventData eventData) {
	PointerEventData pointerEventData = (PointerEventData)eventData;
	Debug.Log("Click: pointerEventData=" + pointerEventData);
}

I’ve made an extension method for it. Simply include this class somewhere in your project:

using UnityEngine.EventSystems;

public static class ExtensionMethods
{
	public static void AddListener (this EventTrigger trigger, EventTriggerType eventType, System.Action<PointerEventData> listener)
	{
		EventTrigger.Entry entry = new EventTrigger.Entry();
		entry.eventID = eventType;
		entry.callback.AddListener(data => listener.Invoke((PointerEventData)data));
		trigger.triggers.Add(entry);
	}
}

Then use it like this:

using UnityEngine;
using UnityEngine.EventSystems;

public class UIController : MonoBehaviour
{
	void Start ()
	{
		EventTrigger myEventTrigger = GetComponent<EventTrigger> (); //you need to have an EventTrigger component attached this gameObject
		myEventTrigger.AddListener (EventTriggerType.PointerClick, onClickListener);
	}

	void onClickListener (PointerEventData eventData)
	{
		//put your logic here...
	}
}

My realization of the extension method that takes into account if there is already such event type.
Also, there are methods for removing listeners.

using UnityEngine.Events;
using UnityEngine.EventSystems;

public static class EventTriggerExtensions
{
    public static void AddListener(this EventTrigger eventTrigger, EventTriggerType triggerType,
        UnityAction<BaseEventData> call)
    {
        if (eventTrigger == null)
            throw new ArgumentNullException(nameof(eventTrigger));
        if (call == null)
            throw new ArgumentNullException(nameof(call));

        EventTrigger.Entry entry = eventTrigger.triggers.Find(e => e.eventID == triggerType);
        if (entry == null)
        {
            entry = new EventTrigger.Entry {eventID = EventTriggerType.PointerClick};
            eventTrigger.triggers.Add(entry);
        }

        entry.callback.AddListener(call);
    }

    public static void RemoveListener(this EventTrigger eventTrigger, EventTriggerType triggerType,
        UnityAction<BaseEventData> call)
    {
        if (eventTrigger == null)
            throw new ArgumentNullException(nameof(eventTrigger));
        if (call == null)
            throw new ArgumentNullException(nameof(call));

        EventTrigger.Entry entry = eventTrigger.triggers.Find(e => e.eventID == triggerType);
        entry?.callback.RemoveListener(call);
    }

    public static void RemoveAllListeners(this EventTrigger eventTrigger, EventTriggerType triggerType)
    {
        if (eventTrigger == null)
            throw new ArgumentNullException(nameof(eventTrigger));

        EventTrigger.Entry entry = eventTrigger.triggers.Find(e => e.eventID == triggerType);
        entry?.callback.RemoveAllListeners();
    }
}

Little tip:
If you don’t have EventTrigger already on game object, and do not want to add it on editor. then just write:

void Start()
 {
        EventTrigger trigger = GetComponent<EventTrigger>();

        if (trigger == null)
            trigger = this.gameObject.AddComponent<EventTrigger>();

        trigger.AddListener(EventTriggerType.PointerEnter, showTooltip);
        trigger.AddListener(EventTriggerType.PointerExit, hiderTooltip);
 }

(Example is just for tooltip)