Как добавить прослушиватель триггера события (обратный вызов)

#unity3d

#unity3d

Вопрос:

В основном, как вы могли бы создать общедоступный метод voidtodostuff(), прикрепить скрипт monobehaviour и связать метод с кнопкой, чтобы при ее нажатии вызывался указанный метод «MethodToDoStuff».

Теперь я хочу сделать это с помощью скрипта редактора.

  1. Добавьте компонент триггера события
  2. В компоненте триггера события добавьте события PointerDown и PointerUp
  3. При указании вверх и указании вниз свяжите общедоступный метод с другим скриптом, который будет запущен (doehandler.HidePanel()) «смотрите код ниже»

Я мог бы сделать это вручную, но наличие сценария редактора очень эффективно.

Вот что у меня есть на данный момент:

Любая помощь приветствуется, спасибо!

СЦЕНАРИЙ РЕДАКТОРА:

     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);
        }
  

ДРУГОЙ СЦЕНАРИЙ:

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

Ответ №1:

Во время выполнения вы обычно вызываете, например

 onPointerDown.AddListener(doesHandler.HidePanel);
  

однако это добавило бы слушателя только временно.

Добавление постоянного прослушивателя немного сложнее, но, к счастью, теперь есть инструмент для этого: UnityEventTools.AddPersistentListener так что, afaik, вам нужно будет только добавить

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

Дополнительный afaik, который вы должны перед использованием Undo.RecordObject пометить измененный объект и сцену как грязные и добавить запись отмены / повтора, например

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

Так что, вероятно, что-то вроде

 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);
}
  

Комментарии:

1. Оказывается, я все усложнял. Триггер события перехватит все события, чтобы иметь возможность вызывать OnPointerDown, поэтому вы не сможете добавлять к нему обратные вызовы во время выполнения afaik. Все, что мне было нужно, это реализовать IPointerDownHandler и IPointerUpHandler в моноскрипте, и у меня есть собственный пользовательский «Триггер события», см.: docs.unity3d.com/560/Documentation/Manual/SupportedEvents.html . В любом случае спасибо m8