处理未在UI上启动的触摸

我寻求一种方法来处理不在Unity Engine中的UI元素上启动的触摸。

这样做的目的是旋转,平移和放大“地图”(从现在开始应该这样称呼它)。 但是,如果触摸事件在任何UI元素上,则应由该UI元素而不是地图处理。

我认为一个这样的例子是Google的Maps android应用程序。

我尝试了几种解决方案:

  • 鼠标事件 – 但它将所有触摸组合成一个单独的事件

  • Input.touches – 但我不知道如何找出是否应该由另一个UI元素处理触摸(我想尽可能不使用“if”来检查触摸是否在任何其他UI元素上,因为这可能certificate是真正的性能问题)

我寻求一种方法来处理不在Unity Engine中的UI元素上启动的触摸…但是如果触摸事件在任何UI元素上,它将由该UI元素而不是地图处理。

IsPointerOverGameObject函数用于简化此操作。 如果返回false,则进行平移,旋转。 如果返回true,则鼠标位于任何UI元素上。 使用它比使用由每个UI元素修改的布尔变量更好更容易。 使用OnPointerClick检测UI上的事件(地图)。 有关更多信息,请参阅此

 void Update() { checkTouchOnScreen(); } void checkTouchOnScreen() { #if UNITY_IOS || UNITY_ANDROID || UNITY_TVOS if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) { //Make sure finger is NOT over a UI element if (!EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) { OnSCreenTouched(); } } #else // Check if the left mouse button was clicked if (Input.GetMouseButtonDown(0)) { //Make sure finger is NOT over a UI element if (!EventSystem.current.IsPointerOverGameObject()) { OnSCreenTouched(); } } #endif } void OnSCreenTouched() { Debug.Log("Touched on the Screen where there is no UI"); //Rotate/Pan/Zoom the camera here } 

我想尽可能不使用“if”来检查触摸是否在任何其他UI元素上,因为这可能是一个真正的性能问题

没有if语句,没有其他方法可以做到这一点。 即使是上面简单的答案也需要它。 它不会影响性能。