Main摄像机和画布放置
Physycs.raycaster
Main摄像机和画布放置
Physycs.raycaster
1 使用代码创建GameObject的时候,自带的是trasforn组件,所以要是在UI中使用的话,就需要添加RectTransform了
实现思路:
1 创建一个列表来保存所有的顶点
2 通过鼠标点击的纵坐标来选取有效的顶点,并获得这两个顶点的连线
3 通过将鼠标点击的纵坐标带入到连线中,求得此纵坐标在连线上得横坐标
4 比较两个横坐标,如果鼠标点击点得横坐标大于连线得横坐标得话,那么就证明了鼠标没有点击到了有效的区域。
整体思路:
获取点击点的位置,然后向右发射射线,如果与图形的顶点之间的连线有奇数个交点的话,那么就表明点击到了图片。
实现一个形状的图片,一般是使用UGUI遮罩的方式
缺点:
1 耗费较多性能
2 锯齿感明显
3D物体对鼠标左键的响应需要过滤掉UI的情况,具体实现就是通过获取UI检测射线是否检测到UI,只有未检测到UI的时候,才3D物体才可以做出反应
private bool IsUI()
{
PointerEventData data = new PointerEventData(EventSystem.current);
data.pressPosition = Input.mousePosition;
data.position = Input.mousePosition;
List<RaycastResult> results = new List<RaycastResult>();
_raycaster.Raycast(data,results);
return results.Count > 0;
}
当想要UI和3D物体同时响应时,利用ExecuteEvents可以实现。
public void ExecuteAll(PointerEventData eventData)
{
List<RaycastResult> results = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventData,results);
foreach (var result in results)
{
if (result.gameObject != this.gameObject)
{
ExecuteEvents.Execute(result.gameObject,eventData,ExecuteEvents.pointerClickHandler);
}
}
}
Click接口UI和3D物体都可以继承这个接口
需要在Camera上添加Physical Raycaster组件就可以了,这样就实现只响应UI的需求
UI和物体之间的相应问题
1 UI响应 3D物体不响应
2 同时响应
3 在某些特定情况下,过滤到某些响应
三角面片 顺时针为正向