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)