繁体   English   中英

无法在UI上开始处理触摸

[英]Handle touches not started on the UI

我寻求一种方法来处理无法在Unity Engine中的UI元素上开始的触摸。

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

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

我尝试了几种解决方案:

  • 鼠标事件-但这将所有触动组合为一个

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM