我寻求一种方法来处理不在Unity Engine中的UI元素上启动的触摸。
这样做的目的是旋转,平移和放大地图" (从现在开始应该这样称呼)。但如果触摸事件在任何UI元素上,则应由该UI元素而不是地图处理。
我认为其中一个例子就是谷歌的地图安卓应用程序。
我尝试了几种解决方案:
鼠标事件 - 但这会将所有触摸合并为一个
Input.touches - 但我不知道如何找出是否应该由另一个UI元素处理触摸(我希望尽可能不使用"如果" s要检查如果触摸是在任何其他UI元素上,因为这可能是一个真正的性能问题)
答案 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
语句,没有其他方法可以做到这一点。即使是上面简单的答案也需要它。 不会影响性能。