Вопрос или проблема
Я настраиваю поддержку контроллеров для своей игры, используя виртуальную мышь и новую систему ввода Unity.
Виртуальная мышь работает для взаимодействия с интерфейсом; однако я обнаружил, что для 2D-элементов события OnMouseEnter и/или OnMouseDown не срабатывают:
- Если режим курсора установлен на “Аппаратный курсор”, то OnMouseEnter срабатывает, но NOT OnMouseDown.
- Если режим курсора установлен на “Программный курсор”, ни одно из событий не срабатывает.
Примечание о настройке:
- В настройках проекта “Активное управление вводом” установлено на “Оба”.
- Эти события корректно срабатывают при использовании обычной мыши. Проблема только с виртуальной мышью.
- На моей камере установлен Physics2DRaycaster, а EventMask настроен на попадание в слой Default, на котором находится мой тестовый объект.
2D-объект, который я использую для тестирования, очень простой: кинематическое 2D- rigid body, 2D коллайдер и следующий базовый скрипт:
private void OnMouseEnter()
{
Debug.Log("OnMouseEnter");
}
private void OnMouseDown()
{
Debug.Log("OnMouseDown");
}
Кто-нибудь может предложить, что попробовать?
Я пытался изменить режим курсора на аппаратный, но всё равно события OnMouseDown не срабатывают. Я пробовал добавить Physics2DRaycaster на свою камеру, но это ничего не изменило.
Судя по всему, компонент VirtualMouse был разработан только для работы с UI и неправильно эмулирует аппаратную мышь. К сожалению, Unity не документирует, что именно считается “кликом”.
Возможное, хоть и грубое, решение – сместить реальный курсор мыши системы в позицию виртуального, используя метод Mouse.WarpCursorPosition().
Возможно, также есть проблема с конфигурацией. Я просматривал форумы Unity и нашёл похожую проблему, здесь, и похоже, что виртуальная мышь не назначается так же, как аппаратная, что приводит к отсутствию срабатывания некоторых действий.
Это решение, найденное пользователем “RaspberryPuppies”, похоже, сработало для нескольких людей.
У меня нет доступа к игровому контроллеру для тестирования, поэтому, к сожалению, я не могу подтвердить, что эти решения подойдут в вашем случае. В любом случае, удачи вам.
Ответ или решение
Конечно! Давайте рассмотрим вашу проблему с виртуальной мышью в Unity и тем, как она взаимодействует с 2D-элементами, такими как коллайдеры, и не вызывает события OnMouseEnter и OnMouseDown.
Проблема:
Вы столкнулись с тем, что при использовании виртуальной мыши события OnMouseEnter и OnMouseDown для 2D-коллайдеров не срабатывают, в то время как с обычной мышью они работают корректно. Это может быть связано с особенностями работы виртуальной мыши в Unity и её совместимостью с событиями ввода.
Возможные причины и решения:
-
Виртуальная мышь и события ввода:
Как вы уже заметили, компонент Virtual Mouse в Unity в первую очередь предназначен для работы с UI и не всегда правильно эмулирует поведение обычной мыши для взаимодействия с 2D-объектами. События OnMouseEnter и OnMouseDown могут не срабатывать, поскольку они зависят от системных интерфейсов, которые могут не поддерживаться виртуальной мышью. -
Использование Raycaster:
Убедитесь, что на вашей камере действительно установлен компонентPhysics2DRaycaster
, и что егоEventMask
настроен на слои, соответствующие вашим 2D-объектам. Однако, если вы используете виртуальную мышь, рекомендуется использоватьEventSystem
из нового ввода Unity. -
Замена мыши:
Вариантом решения вашей проблемы может быть использование функцииMouse.WarpCursorPosition()
, чтобы программно перемещать системный курсор мыши в позицию виртуальной мыши. Это может позволить системе регистрировать нажатия и наведения, как будто вы используете обычную мышь.Пример использования:
Vector2 virtualMousePosition = new Vector2(/* ваша логика для получения позиции виртуальной мыши */); Mouse.WarpCursorPosition(virtualMousePosition);
-
Альтернативные Input System:
Рассмотрите возможность использования альтернативных подходов на основе пользовательских событий. Создайте собственную систему управления, которая будет отслеживать события ввода от контроллера и, в зависимости от положения виртуальной мыши, будет вызывать необходимые события для 2D-объектов. -
Работа с UI:
Если ваша цель заключается в взаимодействии именно с UI элементами, убедитесь, что все ваши 2D элементы UI имеют правильные настройки для взаимодействия и привязаны к правильным слоям, если таковые используются. -
Тестирование:
Попробуйте протестировать вышеуказанные методы, используя разные режимы курсора (как Hardware, так и Software), чтобы определить, какой из них лучше всего работает в вашем случае. Также, если у вас есть доступ к другой платформе или устройству ввода, попробуйте протестировать взаимодействие с ним. -
Проверка документации:
Хотя документация Unity может быть не всегда полной, стоит заглянуть в разделы, касающиеся ввода и управления, чтобы проверить, нет ли дополнительных параметров настройки, которые могут помочь в вашей ситуации.
Заключение:
Поскольку проблема заключается в специфике работы системы ввода, пробуйте сочетать различные подходы и заглядывать в сообщества разработчиков. Возможно, кто-то уже нашел более элегантное решение для вашей проблемы. Удачи в реализации ваших идей!