You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中为正交相机创建BoxCollider2D时数值计算异常咨询

问题根源
  1. 整数除法截断错误
    Screen.height与Screen.width均为int类型,直接执行除法会默认做整数运算,当窗口宽度大于高度时,Screen.height / Screen.width的结果会被直接截断为0,这是halfWidth固定为0的核心原因。
  2. 宽高比计算逻辑颠倒
    正交相机视口半宽的正确计算公式为 正交尺寸 * (屏幕宽度 / 屏幕高度),代码中颠倒了宽高的位置,即使修复整数除法问题也会得到错误的碰撞盒宽度。
  3. halfHeight固定为11属于预期现象
    正交相机的orthographicSize参数本身是固定值,代表视口垂直方向半高的世界单位长度,不会随Game窗口尺寸变化,你项目中主相机的正交尺寸默认设置为11,因此该值固定不变不是异常。
  4. 相机引用不统一
    代码开头已经获取了当前挂载物体的相机组件,但后续计算全部调用Camera.main,如果当前脚本挂载的相机没有设置「主相机」标签,会读取到其他相机的参数导致尺寸错误。
  5. 无动态适配逻辑
    仅在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:48:00