如何使对象单击鼠标而不是单击位于单击按钮后面的对象?

时间:2019-06-17 17:17:39

标签: unity3d

我使用此代码来获取鼠标单击的对象

void Update() {
  if (Input.GetMouseButtonUp(0)) {
    RaycastHit hit;
    Ray ray = camera.ScreenPointToRay(Input.mousePosition);
    if (Physics.Raycast(ray, out hit)) {
      Transform objectHit = hit.transform;
    }
  }
}

即使我单击按钮并且不想单击按钮后面的对象,此代码也有效。如何避免呢?

3 个答案:

答案 0 :(得分:1)

Unity中有一个简单的解决方案。您需要使用此函数,如果鼠标指针悬停在UI元素(如按钮)上,它将返回true。

EventSystem.current.IsPointerOverGameObject()

赞:

void Update()
{
    if (Input.GetMouseButtonUp(0) && !EventSystem.current.IsPointerOverGameObject())
    {
        // UI wasn't clicked
        ...
    }
}

答案 1 :(得分:1)

您可以改为在要单击的目标对象上实现IPointerDownHandlerIPointerUpHandler接口

public class Interactable3D : MonoBehaviour, IPointerUpHandler
{
    public void OnPointerDown(PointerEventData pointerEventData)
    {
        Debug.Log(name + "Game Object Click in Progress");
    }

    public void OnPointerUp(PointerEventData pointerEventData)
    {
        // Whatever should happen
    }
}
  

使用IPointerUpHandler接口使用OnPointerUp回调处理向上的指针输入。确保场景中存在EventSystem,以允许单击检测。对于非UI GameObjects的点击检测,请确保将PhysicsRaycaster附加到Camera

当然,仍然需要附加Collider

答案 2 :(得分:0)

您可以使用“图层蒙版”,可以将不想单击的游戏对象分配给忽略raycast图层。

您可以在此处了解更多信息:Unity Documentation - LayerMask