我在脚本中使用EventSystem.current.IsPointerOverGameObject并且Unity返回True,即使我发誓指针下面没有UI / EventSystem对象。
如何找到有关EventSystem正在检测的对象的信息?
答案 0 :(得分:9)
在update()
:
if(Input.GetMouseButton(0))
{
PointerEventData pointer = new PointerEventData(EventSystem.current);
pointer.position = Input.mousePosition;
List<RaycastResult> raycastResults = new List<RaycastResult>();
EventSystem.current.RaycastAll(pointer, raycastResults);
if(raycastResults.Count > 0)
{
foreach(var go in raycastResults)
{
Debug.Log(go.gameObject.name,go.gameObject);
}
}
}
答案 1 :(得分:1)
通过实施EventSystem
并覆盖IPointerClickHandler
功能,您可以找到有关哪个GameObject OnPointerEnter
正在检测的更多信息。
如果这是一个UI组件,例如Image / RawImage等,你想要检测,这应该这样做:
using UnityEngine.EventSystems;
public class MouseEnterScript: MonoBehaviour, IPointerEnterHandler
{
public void OnPointerEnter(PointerEventData eventData)
{
Debug.Log("Name: " + eventData.pointerCurrentRaycast.gameObject.name);
}
}
如果这是带有碰撞器(3D)的网格,例如 Box Collider ,请将PhysicsRaycaster
添加到相机,然后使用此答案中的第一个代码来检测鼠标是哪个GameObject结束了。
void Start()
{
Camera.main.gameObject.AddComponent<PhysicsRaycaster>();
}
如果这是带有2D Collider的SpriteRenderer
,例如 Box Collider 2D ,请将Physics2DRaycaster
添加到相机,然后使用此答案中的第一个代码来检测哪个GameObject鼠标结束了
void Start()
{
Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
}
答案 2 :(得分:1)
我偶然发现了这个主题并且对所提供的解决方案并不满意,所以这是另一个要分享的实现:
public class StandaloneInputModuleV2 : StandaloneInputModule
{
public GameObject GameObjectUnderPointer(int pointerId)
{
var lastPointer = GetLastPointerEventData(pointerId);
if (lastPointer != null)
return lastPointer.pointerCurrentRaycast.gameObject;
return null;
}
public GameObject GameObjectUnderPointer()
{
return GameObjectUnderPointer(PointerInputModule.kMouseLeftId);
}
}
查看显示GameObjects名称的EventSystem编辑器输出,我认为某些功能已经存在,并且应该有使用它的方法。在深入了解前面提到的EventSystem
和IsPointerOverGameObject
的{{3}}之后(PointerInputModule
覆盖),我认为扩展默认{{1}会更容易}。
用法很简单,只需用EventSystem替换场景中添加的默认值,并在代码中引用:
StandaloneInputModule
...
private static StandaloneInputModuleV2 currentInput;
private StandaloneInputModuleV2 CurrentInput
{
get
{
if (currentInput == null)
{
currentInput = EventSystem.current.currentInputModule as StandaloneInputModuleV2;
if (currentInput == null)
{
Debug.LogError("Missing StandaloneInputModuleV2.");
// some error handling
}
}
return currentInput;
}
}