如何找到哪个对象是EventSystem.current.IsPointerOverGameObject检测?

时间:2016-08-25 16:15:22

标签: c# unity3d

我在脚本中使用EventSystem.current.IsPointerOverGameObject并且Unity返回True,即使我发誓指针下面没有UI / EventSystem对象。

如何找到有关EventSystem正在检测的对象的信息?

3 个答案:

答案 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编辑器输出,我认为某些功能已经存在,并且应该有使用它的方法。在深入了解前面提到的EventSystemIsPointerOverGameObject的{​​{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;
    }
}