# Input module

### **Как добавить модуль на сцену**

Чтобы добавить его на сцену, нужно добавить его префаб в корень общего канваса.

![](https://lh3.googleusercontent.com/MVvrJxzLVlQR8k30rlLBxI8TKCHUiuFoG6eZB4JxZSTpT2KL04P6_1XK0Nrat_Xc3DJwsfBuAQs0URjZCQh4IiiiFMZL6FV0D3k6EnfuZZfzhTOOQ9i9x-d1Et8kisABfE78ED3-IQkjLowF_g)

![](https://lh6.googleusercontent.com/GnGYiivDzJTaZxvRyHIXEgFzIo-gXbaqtVZiMJMPL-NPl5CWqxp3DJdqc2cOCYf0F_T6K8l0LyiaXH-mIOuU88sI0iYzxN-sAv3JySrYOcMSuk5xjTtzNMFjqEDAJUjDCubyBANW5kuZbWbyNg)

### **Как подписаться**

1\. Класс-обработчик должен имплементировать интерфейс **IInputHandler**

![](https://lh6.googleusercontent.com/S7VL-gKXeNxEg0AFDK9Ze8cq9pw4JNhtE90g2LYIYAnYzyyVD1M6w_7PdDatPcIcZv1CL7_IxTRw2020j2g3ADyxLT4Ro69MEh4ZozS3cbX7HdGEuxw9nhLds2gqhHI-sKlpjMbf76BsSj54Hw)

2\. Нужно делегировать нужные публичные методы класса для подписки на эти события, добавив к ним атрибут **InputCallback** с нужным типом триггера, вызывающего нужный event (клик, перетаскивание и другие). Метод должен иметь один **PointerEventData** параметр или ни одного параметра (то есть нужно передавать метод, похожий на **IDragHandler**-интерфейс, либо без параметров). \
Обычно достаточно **PointerEventData** eventData параметра для получения данных по нажатию.

![](https://lh6.googleusercontent.com/RBjxtCF_506xITyh9BECDdjLzJJYo6L5AWFhMEGRGjxK67QJOnZK4ncVDnLGdTemOEQYEXA_PEpDw-FDHk9AffaoOr5l6huk5qHCrwZ368iL6uQvK_1RNXyfQLpgI63hdMfGOHbCllTXGRfRgw)

![](https://lh3.googleusercontent.com/JGozGH47iow-RGDHOpn6xhzGtcsu2Ytw2BaulkzcT4xrjKTXFs5KY44ouYzbDRn4nqqik2LC0IbkaeUk5t7o0TXCKLt4NOkkCnuL4-Hu1FBId-8ELpSHiv_hrGRmmpMRfuarbCJT5w-YnY6ucg)

### **Отписка вручную**

Для отписки можно вызвать метод расширения **UnsubscribeInput**():

![](https://lh4.googleusercontent.com/MfGMdU-LvbdPZ5MXtqm3Xj8g9LgYLi3BNIQGJEynbFsCy-JYKfUFaoPggwPDOvhDGrF9Py43dMCemEHamLwhX26cAKeu9isABQCpHFUW0bclEbm7CTKLXe9GBJLB1lxOuUGlmWD97KvLJ5rs1w)

Необходимо передать имя метода, который нужно отписать.\
**Необходимости в отписке на OnDisable нет, отписка происходит автоматически.** Полностью отписка не происходит, если скрипт хоть и отключен, но все еще существует на сцене. При повторном включении подписка заработает вновь. Полная отписка происходит при удалении объекта со сцен&#x44B;**.**

### **Возможные проблемы**

Когда подписки перестают работать или работают некорректно, возможны несколько проблем, связанные с самим модулем:

1. Возможно появилась **ошибка** ArgumentException: No parameter of BaseEventData class in method <название метода> of class <класс обработчика>;. Тогда у подписанного метода лишние параметры и отсутствует **PointerEventData** параметр.
2. Делегируемый метод не публичный, и его **нельзя** передать **InputEventsTrigger**-у.\
   \&#xNAN;*Тогда ничего не произойдет, и подписки не будет.*
3. На канвасе есть растянутый Image, который перекрывает префаб **TriggerInput**. UI, которые не должны перекрывать ввод пользователя, должны быть не доступны для **Raycast** (У **Image** есть флаг **Raycast Target**, его необходимо выключить).
4. Если класс не имплементирует интерфейс **IInputHandler**, подписки этого класса не зафиксируются. Также если нет атрибутов, то **IInputHandler** ничего не даст.
5. Ну, или объект с таким скриптом просто не лежит на сцене/ в каком-либо префабе, и  менеджер обработчиков событий не будет его видеть.

### **Важная доп. информация**

* События нажатий обрабатываются при помощи реализации класса Event Trigger (класс InputEventsTrigger), скрипт которого лежит на объекте рядом с Image (image растянут на весь экран).
* Префабы самостоятельно решают свои подписки (информация об атрибутах запекается в каждом подписанном префабе).
* Вызывать подписанные методы никто не запрещает, если нужно вызвать его из других методов того же класса. Атрибут на это повлиять не может.
* Для просмотра затронутых модулем префабов есть свой ScriptableObject - InputSettings. Здесь можно запустить поиск подписок в скриптах и увидеть, какие префабы были подписаны.\
  Можно также добавить папки, префабы в которых могут подписываться и по которым будет происходить поиск. По умолчанию стоит папка префабов  Assets/Prefabs\
  \&#xNAN;***Не рекомендуется тут ничего менять в принципе, это для отладки, если вдруг не понятно что-то.***

![](https://lh6.googleusercontent.com/8HV1WUXraY9lSVEVwtMyD3oKg2o_HSBtr7mLMLrkigLohIaVYdYcmfErocmWCGeb9_h52frAXmHLgQ-36ooIh7Z3EGu_KXMDOKwzwXzFLK1n4iFWivfEOM_Q5mgy5HDnGIMPVrdlO5GoV2ay0A)
