Нажатие кнопок пользовательского интерфейса наряду с обработкой Input.GetMouseDown () в обновлении - PullRequest
0 голосов
/ 29 июня 2019

Игра, которую я создаю, предназначена для мобильных устройств.

У меня есть класс PlayerInput, в котором я проверяю события мыши в Update():

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        //hide UI elements
    }
}

У меня есть кнопка, которую я скрываю, когда обнаруживаю ввод мыши в классе PlayerInput, но не хочу скрывать ее, если игрок нажимает кнопку.
Мне удалось решить эту проблему, добавив этот компонент в мои элементы пользовательского интерфейса:

public class UiPointerHandler : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    public void OnPointerEnter(PointerEventData eventData)
    {
        //disable mouse checks
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        //enable mouse checks
    }
}  

Позволяет отключить обработку событий мыши в PlayerInput Update() для взаимодействия с некоторыми элементами пользовательского интерфейса.

Это хорошо работает на ПК, когда я тестирую / создаю прототип игры, но когда я создаю игру для мобильных устройств, она вообще не работает и я не могу нажимать кнопки.

Я ищу решение, которое бы работало и на мобильных устройствах.

Ответы [ 3 ]

2 голосов
/ 30 июня 2019

Вы можете решить это довольно легко, добавив следующую проверку

void Update()
{
    if (Input.GetMouseButtonDown(0) && !EventSystem.current.IsPointerOverGameObject())
    {
        //hide UI elements
    } 
}

Что он делает, проверяет, находится ли ваш указатель (мышь или палец) над элементом пользовательского интерфейса.Проверяя, если это не так, вы получаете желаемое поведение.

0 голосов
/ 30 июня 2019

Благодаря пользователю Immorality мне удалось решить мою проблему.

Я добавил EventSystem.current.IsPointerOverGameObject() чек к Update() внутри моего PlayerInput класса.

void Update()
{
    if(EventSystem.current.IsPointerOverGameObject()) return;

    if (Input.GetMouseButtonDown(0))
    {
        //hide UI elements
    }
}

Я протестировал это решение самостоятельно, и в моем случае это не помогло, я все еще не мог нажимать кнопки.

Я ввел bool в PlayerInput, который контролирует, обрабатывается ли ввод мыши, и 2 статических метода, позволяющих изменить эту переменную.

public class PlayerInput : MonoBehaviour
{
    private static bool _transmitInput;

    void Update()
    {
        if(!_transmitInput || EventSystem.current.IsPointerOverGameObject()) return;

        if (Input.GetMouseButtonDown(0))
        {
        //hide UI elements
        }
    }

    public static void DisableInput()
    {
        if (!_transmitInput) return;

        _transmitInput = false;
    }

    public static void EnableInput()
    {
        if (_transmitInput) return;

        _transmitInput = true;
    }
}

Они вызываются из UiPointerHandler:

public class UiPointerHandler : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    public void OnPointerEnter(PointerEventData eventData)
    {
        PlayerInput.DisableInput();
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        PlayerInput.EnableInput();
    }
}  

В этот момент у меня все еще были проблемы с мобильным телефоном. При нажатии кнопки вызывается OnPointerEnter(), а OnPointerExit() - нет.

Полагаю, это из-за того, как настроена моя сцена. Две кнопки, с которыми я работаю, находятся в одинаковом положении и имеют одинаковый размер. Я просто отключаю один и включаю другой.

Я решил эту проблему, вызвав PlayerInput.EnableInput() на onClick кнопок.

0 голосов
/ 30 июня 2019

См. «Input.GetTouch» в классе «Input» в Unity, GetMouseButtonDown не работает на мобильных устройствах.Unity разработал событие «Touch» на мобильном телефоне вместо события мыши, поэтому попробуйте его.он должен работать с вашим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...