Unity IsPointerOverGameObject 问题

Dan*_*nny 2 c# unity-game-engine

我知道这是一个常见问题,但没有一个有效。可能是按钮设置错误。我有一个没有图像的面板,在左上角的设置按钮内,单击后会打开另一个场景。我尝试使用这 3 种方法,但没有一个有效。它始终将其检测为游戏对象。

boolisGameStarted正在检查玩家是否应该移动。请引导我完成

试过

if (Swipe.Instance.Tap && !isGameStarted)
{
    if (EventSystem.current.IsPointerOverGameObject() )
    { 
        isGameStarted = false;
    }
    else
    {
          isGameStarted = true;
          motor.StartRunning();
          gameCanvas.SetTrigger("Show");
    }
}
Run Code Online (Sandbox Code Playgroud)

还尝试使用触发器,但它通过用户界面。

这是原始代码。

if (Swipe.Instance.Tap && !isGameStarted)
{ 
    isGameStarted = true;
    motor.StartRunning();
    gameCanvas.SetTrigger("Show");
}
Run Code Online (Sandbox Code Playgroud)

一旦你点击屏幕,玩家就开始移动。如果单击设置按钮,我不需要它来移动或开始游戏。

小智 6

我遇到了同样的问题,直到我发现 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

private void OnMouseDown()
{
      if (!MouseOverUILayerObject.IsPointerOverUIObject())
            HandleClick();
}
Run Code Online (Sandbox Code Playgroud)