我使用此代码来获取鼠标单击的对象
void Update() {
if (Input.GetMouseButtonUp(0)) {
RaycastHit hit;
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit)) {
Transform objectHit = hit.transform;
}
}
}
即使我单击按钮并且不想单击按钮后面的对象,此代码也有效。如何避免呢?
答案 0 :(得分:1)
Unity中有一个简单的解决方案。您需要使用此函数,如果鼠标指针悬停在UI元素(如按钮)上,它将返回true。
EventSystem.current.IsPointerOverGameObject()
赞:
void Update()
{
if (Input.GetMouseButtonUp(0) && !EventSystem.current.IsPointerOverGameObject())
{
// UI wasn't clicked
...
}
}
答案 1 :(得分:1)
您可以改为在要单击的目标对象上实现IPointerDownHandler
和IPointerUpHandler
接口
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