Я работаю над двумерной пошаговой игрой и могу управлять мышью и касанием.
Игра имеет гексагональную карту и требует действия панорамирования, масштабирования и щелчка.
Я решил применить шаблон делегата, чтобы каждый объект, для которого требуется действие, отправлял событие своему делегату, который будет делать или нет.Таким образом, все входные данные сходятся к TurnManager, который с помощью конечного автомата обрабатывает события в соответствии с текущим игровым состоянием.
Пример: MapCell.OnMouseUpAsButton()
звонки delegate.OnCellClick(MapCell)
Все работает хорошо, и таким образом я могу обработать , когда делает что-то .
Проблемы возникли, когда я начал использовать Zoom и Pan на карте.Для этих двух действий мне пришлось избегать классического метода Monobehaviour ( OnMouseDown , OnMouseUpAsButton , ...) и использовать LateUpdate .
Итак,Я создал CameraHandler , который в LateUpdate использует:
- HandleMouse ()
- HandleTouch()
и, используя шаблон делегата, вызывает следующие действия:
- OnMapWillPan ()
- OnMapPan ()
- OnMapEnd ()
Чтобы избежать панорамирования или кликов по элементам пользовательского интерфейса, TurnManager фильтрует полученные события с EventSystem.current.IsPointerOverGameObject()
Задача На Mac / Mouse все отлично работает!: DНа смартфоне / Touch не могу ничего нажать, работает только Pan.Отладка на устройстве адская из-за отсутствия точки останова или консоли.
Вопросы
- Вы когда-нибудь обращались с этим?Как?
- Какой подход вы использовали?
- Как вы думаете, что я делаю не так?
- Существуют ли передовые практики, позволяющие избежать подобных проблем и правильно обрабатывать кроссплатформенный ввод?
- Есть ли хорошая лекция / книга для этого аргумента?
PS: при необходимости я могу показать код