Dennis M
Dennis M

Reputation: 41

How to add an event trigger listener(callback)

Basically how you would create a public void MethodToDoStuff(), attach a monobehaviour script and link the method on a button, so that when its clicked, said method "MethodToDoStuff" is called.

Now I want to do that via an editor script.

  1. Add an event trigger component
  2. On the event trigger component, add a PointerDown and PointerUp event
  3. On the PointerUp and PointerDown, link a public method on another script to be run (doesHandler.HidePanel()) "see code below"

I could do this manually but having an editor script is super effiecient.

Here is what I have so far:

All help is appreciated, Thanks!

EDITOR SCRIPT:

    void OnWizardCreate()
        {
            doesHandler = GameObject.FindWithTag("WhatItDoes").GetComponent<WhatThisDoes>();
    
            GameObject selection = Selection.activeGameObject;
            EventTrigger trig=(EventTrigger)selection.AddComponent(typeof(EventTrigger));
    
            EventTrigger.Entry onPointerDown = new EventTrigger.Entry();
            onPointerDown.eventID = EventTriggerType.PointerDown;
            
            EventTrigger.Entry onPointerUp = new EventTrigger.Entry();
            onPointerUp.eventID = EventTriggerType.PointerUp;
      
            trig.triggers.Add(onPointerDown);
            trig.triggers.Add(onPointerUp);
        }

OTHER SCRIPT:

    public void HidePanel()
    {
        whatItDoesPanel.SetActive(false);
    }

Upvotes: 0

Views: 7515

Answers (1)

derHugo
derHugo

Reputation: 90580

On runtime you would usually call e.g.

onPointerDown.AddListener(doesHandler.HidePanel);

however this would only add the listener temporarily.

Adding a persistent listener is a bit more complex but luckily there now is a tool for this: UnityEventTools.AddPersistentListener so afaik you would only have to add

UnityEventTools.AddPersistentListener(onPointerDown, doesHandler.HidePanel);
UnityEventTools.AddPersistentListener(onPointerUp, doesHandler.HidePanel);

Additional afaik you should before use Undo.RecordObject in order to mark the changed object and the scene as dirty and add a Undo/Redo entry like

Undo.RecordObject(selection, "Added event triggers");

So probably something like

void OnWizardCreate()
{
    doesHandler = Object.FindObjectOfType<WhatThisDoes>();

    if(!doesHandler)
    {
        Debug.LogWarning("No WhatThisDoes found in the scene -> Ignored");
        return;
    }

    var selection = Selection.activeGameObject;

    if(!selection)
    {
        Debug.LogWarning("Nothing selected -> Ignored")
        return;
    }

    if(selection.GetComponent<EventTrigger>())
    {
        Debug.LogWarning($"The selected object {selection} already has an EventTrigger attached! -> Ignored");
        return;
    }

    // log the undo before making changes
    Undo.RecordObject(selection, "Added event triggers");

    var onPointerDown = new EventTrigger.Entry();
    onPointerDown.eventID = EventTriggerType.PointerDown;
    UnityEventTools.AddPersistentListener(onPointerDown, doesHandler.HidePanel);

    var onPointerUp = new EventTrigger.Entry();
    onPointerUp.eventID = EventTriggerType.PointerUp;
    UnityEventTools.AddPersistentListener(onPointerUp, doesHandler.HidePanel);

    var trig = selection.AddComponent<EventTrigger>();

    trig.triggers.Add(onPointerDown);
    trig.triggers.Add(onPointerUp);
}

Upvotes: 1

Related Questions