#unity3d
#unity3d
Вопрос:
В основном, как вы могли бы создать общедоступный метод voidtodostuff(), прикрепить скрипт monobehaviour и связать метод с кнопкой, чтобы при ее нажатии вызывался указанный метод «MethodToDoStuff».
Теперь я хочу сделать это с помощью скрипта редактора.
- Добавьте компонент триггера события
- В компоненте триггера события добавьте события PointerDown и PointerUp
- При указании вверх и указании вниз свяжите общедоступный метод с другим скриптом, который будет запущен (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