Благодаря пользователю 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
кнопок.