有时候可能会遇到需要用UGUI或者FGUI上的UI元素与相机里面的元素进行碰撞的需求 这里的做法只限于进行单个物体和屏幕上的元素进行碰撞检测,不适用于多个3d对象与UI元素进行碰撞检测
首先先在UI上面绑几个空节点,做好自适应之后,先求出3d物体坐标转换为屏幕坐标之后的Z轴的值 然后用此方法求出转换成3d节点里面的坐标位置,因为获得了z轴,因此从ui元素坐标点转换为3d世界坐标之后
Vector3 ReturnPos(Vector3 aim) {
Vector3 vec = Vector3.zero;
Vector3 pos = Camera.main.WorldToScreenPoint(你所需要转换的3d物体的坐标);
Vector3 mousePos = new Vector3(aim.x, aim.y, pos.z);
vec = Camera.main.ScreenToWorldPoint(mousePos);
return vec;
}
转换完之后,在对应的位置生成gameobject,手动添加一下boxCollide,并且设置size为2d场景里面的宽高即可,
private void DrawLine()
{
Vector3 boundPos1 = ReturnPos(pos1.position);
Vector3 boundPos2 = ReturnPos(pos4.position);
Debug.Log("posCheck = " + boundPos1 + "=====" + boundPos2);
float height = Mathf.Abs(boundPos2.y - boundPos1.y);
float width = Mathf.Abs(boundPos2.x - boundPos1.x);
float posX = (boundPos2.x + boundPos1.x) / 2;
float posY = (boundPos2.y + boundPos1.y) / 2;
objScreenCollider.transform.position = new Vector3(posX, posY, boundPos1.z);
objScreenCollider.GetComponent<BoxCollider>().size = new Vector3(width, height, 1);
}
这个gameobject可以自己提前创建预制,并且添加上包围盒,然后在预制上绑定脚本,脚本时间里面可以挂在触碰之后的逻辑。 最终结果
|