我知道这是一个普遍的问题,但是没有一个起作用。也许按钮设置错误。我有一个没有图像的面板,并且在单击左上角的设置按钮中会打开另一个场景。我尝试使用这3种方法,但均无效果。它始终将其检测为游戏对象。
布尔isGameStarted
正在检查玩家是否应该移动。
请引导我完成
尝试过
if (Swipe.Instance.Tap && !isGameStarted)
{
if (EventSystem.current.IsPointerOverGameObject() )
{
isGameStarted = false;
}
else
{
isGameStarted = true;
motor.StartRunning();
gameCanvas.SetTrigger("Show");
}
}
也尝试使用触发器,但是它通过UI。
这是原始代码。
if (Swipe.Instance.Tap && !isGameStarted)
{
isGameStarted = true;
motor.StartRunning();
gameCanvas.SetTrigger("Show");
}
点击屏幕后,播放器便开始移动。如果单击设置按钮,则不需要移动或开始游戏。
答案 0 :(得分:0)
IsPointerOverGameObject
的重载采用参数
int pointerId
指针(触摸/鼠标)ID。
和
如果使用不带参数的
IsPointerOverGameObject()
,它将指向“鼠标左键”(pointerId =-1
);因此,当您使用
IsPointerOverGameObject
进行触摸时,应考虑将指标指标传递给它。
因此,在示例中
if (Swipe.Instance.Tap && !isGameStarted)
{
if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
{
isGameStarted = false;
return;
}
isGameStarted = true;
motor.StartRunning();
gameCanvas.SetTrigger("Show");
}
否则,如果您有多个可能的触摸,也可以对所有这些触摸进行检查
if (Swipe.Instance.Tap && !isGameStarted)
{
foreach(var touch in Input.touches)
{
if (EventSystem.current.IsPointerOverGameObject(touch.fingerId))
{
isGameStarted = false;
return;
}
}
isGameStarted = true;
motor.StartRunning();
gameCanvas.SetTrigger("Show");
}
还要查看此线程this thread
答案 1 :(得分:0)
我遇到了同样的问题,直到我发现IsPointerOverGameObject似乎对任何GameObject(可能是对撞机)而且不仅是UI对象都返回true。
因此,我编写了一个自定义静态类来仅检查UI对象。您需要将每个面板,图像,按钮等的层设置为UI才能起作用。
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public static class MouseOverUILayerObject
{
public static bool IsPointerOverUIObject()
{
PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
List<RaycastResult> results = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
for (int i = 0; i < results.Count; i++)
{
if (results[i].gameObject.layer == 5) //5 = UI layer
{
return true;
}
}
return false;
}
}
像这样使用它:
private void OnMouseDown()
{
if (!MouseOverUILayerObject.IsPointerOverUIObject())
HandleClick();
}