Unity IsPointerOverGameObject问题

时间:2019-07-12 16:21:28

标签: c# unity3d

我知道这是一个普遍的问题,但是没有一个起作用。也许按钮设置错误。我有一个没有图像的面板,并且在单击左上角的设置按钮中会打开另一个场景。我尝试使用这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");
}

点击屏幕后,播放器便开始移动。如果单击设置按钮,则不需要移动或开始游戏。

2 个答案:

答案 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();
}