[英]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.