Unity中为正交相机创建BoxCollider2D时数值计算异常咨询
问题根源
- 整数除法截断错误
Screen.height与Screen.width均为int类型,直接执行除法会默认做整数运算,当窗口宽度大于高度时,Screen.height / Screen.width的结果会被直接截断为0,这是halfWidth固定为0的核心原因。 - 宽高比计算逻辑颠倒
正交相机视口半宽的正确计算公式为正交尺寸 * (屏幕宽度 / 屏幕高度),代码中颠倒了宽高的位置,即使修复整数除法问题也会得到错误的碰撞盒宽度。 - halfHeight固定为11属于预期现象
正交相机的orthographicSize参数本身是固定值,代表视口垂直方向半高的世界单位长度,不会随Game窗口尺寸变化,你项目中主相机的正交尺寸默认设置为11,因此该值固定不变不是异常。 - 相机引用不统一
代码开头已经获取了当前挂载物体的相机组件,但后续计算全部调用Camera.main,如果当前脚本挂载的相机没有设置「主相机」标签,会读取到其他相机的参数导致尺寸错误。 - 无动态适配逻辑
仅在Start生命周期执行一次尺寸计算,后续调整Game窗口大小不会触发更新,无法适配变化后的窗口比例。
修复后的完整代码
Camera cam; BoxCollider2D camCollider; float halfHeight, halfWidth; // 缓存上一次的窗口尺寸,避免每帧重复计算 Vector2 lastScreenSize; void Start() { cam = GetComponent<Camera>(); // 校验当前相机是否为正交模式 Debug.Assert(cam.orthographic, "当前相机不是正交模式,请调整Projection设置"); camCollider = GetComponent<BoxCollider2D>(); lastScreenSize = new Vector2(Screen.width, Screen.height); UpdateColliderSize(); } void LateUpdate() { // 窗口尺寸变化时才更新碰撞盒 if (Mathf.Abs(Screen.width - lastScreenSize.x) > 0.1f || Mathf.Abs(Screen.height - lastScreenSize.y) > 0.1f) { lastScreenSize = new Vector2(Screen.width, Screen.height); UpdateColliderSize(); } } void UpdateColliderSize() { halfHeight = cam.orthographicSize; // 先转float再做除法避免整数截断,宽高比为宽/高 halfWidth = cam.orthographicSize * (float)Screen.width / Screen.height; camCollider.size = new Vector2(halfWidth * 2, halfHeight * 2); }
注意事项
- 请将脚本直接挂载在需要适配的正交相机物体上
- 若不需要动态适配窗口变化,可删除
LateUpdate相关逻辑,仅保留Start中的计算,注意必须先将宽高转为float再做除法 - 若需要碰撞盒和视口完全对齐,无需额外调整偏移,当前计算的尺寸已经和正交相机的视口边界完全重合
内容的提问来源于stack exchange,提问作者user14847250
相关产品推荐
相关产品推荐

