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

Unity中Start()在编辑器正常但打包后第二个if不执行问题求助

问题描述

我开发了一套基于网格的移动系统,在Start()方法中通过双层循环遍历每个网格Tile:

  • 第一个if通过射线检测判断是否被Obstacle占据
  • 第二个if通过射线检测获取地形高度赋值给attitude

代码如下:

void Start()
{
    WalkGrid = new WalkGrid(width, height, referenceObject1, referenceObject2);

    tileSize = Math.Abs(referenceObject1.transform.position.x - referenceObject2.transform.position.x);

    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
        {
            if (Physics.Raycast(WalkGrid.gridStart + new Vector3(i * tileSize, 0, j * tileSize), Vector3.up, out RaycastHit hit2, tileSize * 10) && hit2.collider.CompareTag("Obstacle"))
            {
                WalkGrid.gridArray[i, j].isOccupied = true;
            }

            if (Physics.Raycast(WalkGrid.gridStart + new Vector3(i * tileSize, 9, j * tileSize), Vector3.down * 10, out RaycastHit hit, 10))
            {
                WalkGrid.gridArray[i, j].attitude = hit.point.y;
            }
        }
    }
}

该代码在Unity编辑器中运行完全正常,但打包后第二个if语句完全不执行。已尝试以下方案但均未解决:

  • 调整脚本执行顺序
  • 将两个if拆分到不同循环中
  • 改用Awake方法替代Start(效果更差)
排查与解决建议
  • 检查地形碰撞体的打包有效性:确保地形的TerrainCollider组件处于启用状态,且未被排除在打包资源之外。同时确认地形所在Layer属于射线检测的默认层范围(当前代码未指定layerMask,默认检测所有层,若曾修改过全局射线检测规则,需确保地形层在允许范围内)。
  • 修正射线参数的冗余设置:第二个射线的方向写为Vector3.down * 10,方向向量只需单位向量即可,Vector3.down本身就是标准单位向量,乘以10属于冗余操作,建议改为Vector3.down避免潜在的参数混淆。同时验证射线起点的y值(当前为9)是否在打包后地形的上方足够高度,防止因场景坐标偏移导致射线从地形下方发射。
  • 添加日志定位问题:在第二个if的内外添加日志输出,打包后通过Unity日志工具查看具体执行情况,确认是射线未命中还是赋值逻辑异常。示例代码如下:
    Vector3 rayStart = WalkGrid.gridStart + new Vector3(i * tileSize, 9, j * tileSize);
    Debug.Log($"Grid [{i},{j}] ray start: {rayStart}");
    if (Physics.Raycast(rayStart, Vector3.down, out RaycastHit hit, 10))
    {
        Debug.Log($"Hit terrain at y: {hit.point.y}, collider: {hit.collider.name}");
        WalkGrid.gridArray[i, j].attitude = hit.point.y;
    }
    else
    {
        Debug.Log($"Grid [{i},{j}] ray did not hit any object!");
    }
    
  • 排查地形LOD与烘焙设置:若地形启用了LOD或烘焙了导航网格,打包后可能因碰撞体简化导致射线无法命中。尝试关闭地形LOD功能,重新烘焙地形碰撞体后再打包测试。
  • 验证网格起点的正确性:打包后输出WalkGrid.gridStart的坐标值,对比编辑器中的数值,确认referenceObject1和referenceObject2在打包后的位置未发生偏移,避免因网格起点错误导致射线发射位置偏离地形。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:05:08