场景设置:
对应相机上挂载 Physics Raycaster(非必要) 组件:
方法一:OnMouseDown
1.给 UI 加上碰撞体:
2.在 CubeClick 脚本实现 OnMouseDown 函数的:
方法二: IPointerClickHandler
如果 3D 物体被 UI 遮挡,可以通过 UI 上的控件向下传递事件的方式,实现事件的响应:
UI 物体上实现方法:
public class UIClick : MonoBehaviour, IPointerClickHandler
{
public void OnPointerClick(PointerEventData eventData)
{
List<RaycastResult> raycastResults = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventData, raycastResults);
foreach (var raycastResult in raycastResults)
{
if (raycastResult.gameObject != gameObject)
{
ExecuteEvents.Execute(raycastResult.gameObject, eventData, ExecuteEvents.pointerClickHandler);
}
}
Debug.Log("ui click");
}
}
3D 物体上实现方法:
public class CubeClick : MonoBehaviour, IPointerClickHandler
{
private void OnMouseDown()
{
Debug.Log(nameof(OnMouseDown));
}
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("Cube Click");
}
}
问题:给子组件添加 Canvas 组件后,点击事件不响应?
- 可能原因一:子Canvas上需要有 Graphic Raycaster 组件,以确保可以接收输入事件。
- 可能原因二:UI被反转了180度。
解决: