Работа виртуальной мыши в Unity для пользовательского интерфейса, но не срабатывают события OnMouseEnter/OnMouseDown для 2D коллайдеров.

Вопрос или проблема

Я настраиваю поддержку контроллеров для своей игры, используя виртуальную мышь и новую систему ввода 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 и её совместимостью с событиями ввода.

Возможные причины и решения:

  1. Виртуальная мышь и события ввода:
    Как вы уже заметили, компонент Virtual Mouse в Unity в первую очередь предназначен для работы с UI и не всегда правильно эмулирует поведение обычной мыши для взаимодействия с 2D-объектами. События OnMouseEnter и OnMouseDown могут не срабатывать, поскольку они зависят от системных интерфейсов, которые могут не поддерживаться виртуальной мышью.

  2. Использование Raycaster:
    Убедитесь, что на вашей камере действительно установлен компонент Physics2DRaycaster, и что его EventMask настроен на слои, соответствующие вашим 2D-объектам. Однако, если вы используете виртуальную мышь, рекомендуется использовать EventSystem из нового ввода Unity.

  3. Замена мыши:
    Вариантом решения вашей проблемы может быть использование функции Mouse.WarpCursorPosition(), чтобы программно перемещать системный курсор мыши в позицию виртуальной мыши. Это может позволить системе регистрировать нажатия и наведения, как будто вы используете обычную мышь.

    Пример использования:

    Vector2 virtualMousePosition = new Vector2(/* ваша логика для получения позиции виртуальной мыши */);
    Mouse.WarpCursorPosition(virtualMousePosition);
  4. Альтернативные Input System:
    Рассмотрите возможность использования альтернативных подходов на основе пользовательских событий. Создайте собственную систему управления, которая будет отслеживать события ввода от контроллера и, в зависимости от положения виртуальной мыши, будет вызывать необходимые события для 2D-объектов.

  5. Работа с UI:
    Если ваша цель заключается в взаимодействии именно с UI элементами, убедитесь, что все ваши 2D элементы UI имеют правильные настройки для взаимодействия и привязаны к правильным слоям, если таковые используются.

  6. Тестирование:
    Попробуйте протестировать вышеуказанные методы, используя разные режимы курсора (как Hardware, так и Software), чтобы определить, какой из них лучше всего работает в вашем случае. Также, если у вас есть доступ к другой платформе или устройству ввода, попробуйте протестировать взаимодействие с ним.

  7. Проверка документации:
    Хотя документация Unity может быть не всегда полной, стоит заглянуть в разделы, касающиеся ввода и управления, чтобы проверить, нет ли дополнительных параметров настройки, которые могут помочь в вашей ситуации.

Заключение:

Поскольку проблема заключается в специфике работы системы ввода, пробуйте сочетать различные подходы и заглядывать в сообщества разработчиков. Возможно, кто-то уже нашел более элегантное решение для вашей проблемы. Удачи в реализации ваших идей!

Оцените материал
Добавить комментарий

Капча загружается...