Unity中如何获取高精度世界坐标系下Box Collider的中心与尺寸
搞定BoxCollider世界空间中心与尺寸的高精度获取问题
嘿,我来帮你解决这个精度问题,顺便先纠正你代码里的一个小错误——你计算世界空间尺寸的方式不对哦!TransformPoint()是用来转换点坐标的,而BoxCollider.size是本地空间的尺寸向量,直接这么用会得到一个偏移点,不是实际的世界尺寸。先把这个理顺,再解决精度显示的问题~
第一步:修正尺寸计算的错误
想要准确的世界空间尺寸,有两种靠谱的方式:
- 用
TransformVector()转换尺寸向量(它会自动考虑物体的缩放和旋转) - 直接获取Collider的世界空间
Bounds(更推荐,省心又准确)
第二步:输出高精度数值
Unity默认的print()或者Vector3.ToString()只会显示1-2位小数,但Vector3本身存储的是单精度浮点数(约6-7位有效数字),只是显示时被截断了。想要看到更多小数位,只需要用格式化字符串指定小数位数就行。
方法1:手动转换坐标+格式化输出
修改你的代码,把尺寸计算改成TransformVector(),然后用格式化字符串输出:
public GameObject Model; BoxCollider m_Collider; Vector3 Center; Vector3 Size; void Start() { m_Collider = Model.GetComponent<BoxCollider>(); // 转换中心坐标(这部分是对的) Center = transform.TransformPoint(m_Collider.center); // 修正尺寸计算:用TransformVector转换尺寸向量 Size = transform.TransformVector(m_Collider.size); // 用"F6"显示6位小数,你可以改成F8、F10按需调整精度 print($"Center: {Center.ToString("F6")}, Size: {Size.ToString("F6")}"); }
方法2:用Bounds直接获取(推荐)
Unity的BoxCollider自带bounds属性,直接给出世界空间下的边界信息,不用手动转换,结果更准确:
public GameObject Model; BoxCollider m_Collider; Vector3 WorldCenter; Vector3 WorldSize; void Start() { m_Collider = Model.GetComponent<BoxCollider>(); Bounds worldBounds = m_Collider.bounds; WorldCenter = worldBounds.center; WorldSize = worldBounds.size; // 这里用F8显示8位小数,满足高精度需求 print($"World Center: {WorldCenter.ToString("F8")}, World Size: {WorldSize.ToString("F8")}"); }
额外说明
- 如果是代码里用这些数值做计算,完全不用额外处理,
Vector3本身的精度足够,只是显示的时候需要格式化。 - 如果真的需要双精度(double)存储,可以把向量的三个分量拆出来存成double类型,不过一般Unity场景里用float就足够啦。
内容的提问来源于stack exchange,提问作者Joh
相关产品推荐
相关产品推荐

