Input module
Как добавить модуль на сцену
Чтобы добавить его на сцену, нужно добавить его префаб в корень общего канваса.
Как подписаться
1. Класс-обработчик должен имплементировать интерфейс IInputHandler
2. Нужно делегировать нужные публичные методы класса для подписки на эти события, добавив к ним атрибут InputCallback с нужным типом триггера, вызывающего нужный event (клик, перетаскивание и другие). Метод должен иметь один PointerEventData параметр или ни одного параметра (то есть нужно передавать метод, похожий на IDragHandler-интерфейс, либо без параметров). Обычно достаточно PointerEventData eventData параметра для получения данных по нажатию.
Отписка вручную
Для отписки можно вызвать метод расширения UnsubscribeInput():
Необходимо передать имя метода, который нужно отписать. Необходимости в отписке на OnDisable нет, отписка происходит автоматически. Полностью отписка не происходит, если скрипт хоть и отключен, но все еще существует на сцене. При повторном включении подписка заработает вновь. Полная отписка происходит при удалении объекта со сцены.
Возможные проблемы
Когда подписки перестают работать или работают некорректно, возможны несколько проблем, связанные с самим модулем:
Возможно появилась ошибка ArgumentException: No parameter of BaseEventData class in method <название метода> of class <класс обработчика>;. Тогда у подписанного метода лишние параметры и отсутствует PointerEventData параметр.
Делегируемый метод не публичный, и его нельзя передать InputEventsTrigger-у. Тогда ничего не произойдет, и подписки не будет.
На канвасе есть растянутый Image, который перекрывает префаб TriggerInput. UI, которые не должны перекрывать ввод пользователя, должны быть не доступны для Raycast (У Image есть флаг Raycast Target, его необходимо выключить).
Если класс не имплементирует интерфейс IInputHandler, подписки этого класса не зафиксируются. Также если нет атрибутов, то IInputHandler ничего не даст.
Ну, или объект с таким скриптом просто не лежит на сцене/ в каком-либо префабе, и менеджер обработчиков событий не будет его видеть.
Важная доп. информация
События нажатий обрабатываются при помощи реализации класса Event Trigger (класс InputEventsTrigger), скрипт которого лежит на объекте рядом с Image (image растянут на весь экран).
Префабы самостоятельно решают свои подписки (информация об атрибутах запекается в каждом подписанном префабе).
Вызывать подписанные методы никто не запрещает, если нужно вызвать его из других методов того же класса. Атрибут на это повлиять не может.
Для просмотра затронутых модулем префабов есть свой ScriptableObject - InputSettings. Здесь можно запустить поиск подписок в скриптах и увидеть, какие префабы были подписаны. Можно также добавить папки, префабы в которых могут подписываться и по которым будет происходить поиск. По умолчанию стоит папка префабов Assets/Prefabs Не рекомендуется тут ничего менять в принципе, это для отладки, если вдруг не понятно что-то.
Last updated