处理功能未在用户界面

时间:2017-09-11 20:50:10

标签: c# unity3d touch

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

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

我认为其中一个例子就是谷歌的地图安卓应用程序。

我尝试了几种解决方案:

  • 鼠标事件 - 但这会将所有触摸合并为一个

  • Input.touches - 但我不知道如何找出是否应该由另一个UI元素处理触摸(我希望尽可能不使用"如果" s要检查如果触摸是在任何其他UI元素上,因为这可能是一个真正的性能问题)

1 个答案:

答案 0 :(得分:2)

  

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

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

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语句,没有其他方法可以做到这一点。即使是上面简单的答案也需要它。 会影响性能。