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

Unity中Texture2D遮罩绘制脚本编辑器正常打包后失效问题

问题:Unity打包后射线检测获取UV坐标始终为(0,0),编辑器正常

我写了一段Unity脚本,通过鼠标射线检测在材质遮罩上绘制来清除游戏物品污垢,编辑器里运行正常,但打包后完全失效。加了Debug.Log发现,编辑器里射线命中物体时能拿到正常UV坐标(比如UV: (0.49, 0.50)Pixels: (252, 257)),但打包后raycastHit.textureCoord始终是(0.00, 0.00),对应像素位置(0,0)。

核心代码片段:

if (Input.GetMouseButton(0))
{
    if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out RaycastHit raycastHit))
    {
        Vector2 textureCoord = raycastHit.textureCoord;

        int pixelX = (int)(textureCoord.x * dirtMaskTexture.width);
        int pixelY = (int)(textureCoord.y * dirtMaskTexture.height);

        Vector2Int paintPixelPosition = new Vector2Int(pixelX, pixelY);
        Debug.Log("UV: " + textureCoord + "; Pixels: " + paintPixelPosition);

        // 后续绘制逻辑...
        dirtMaskTexture.Apply();
    }
}

可能的原因及解决办法

  • 模型网格未启用Read/Write Enabled
    打包后Unity默认会优化网格,禁用读写权限,导致无法获取纹理坐标。解决步骤:

    1. 在Project窗口找到对应模型文件
    2. 勾选Import Settings里的Read/Write Enabled
    3. 点击Apply重新导入模型
  • 污垢遮罩纹理的读写权限未开启
    确保dirtMaskTexture的Import Settings中勾选了Read/Write Enabled,同时避免使用会破坏UV数据的极端压缩格式,选择合适的纹理压缩选项。

  • 碰撞体设置不匹配
    必须使用Mesh Collider并关联和渲染一致的网格,不能用Box/Capsule这类 primitive碰撞体(这类碰撞体无法返回精确纹理坐标)。如果用Mesh Collider,确保网格和渲染网格一致,非必要不要勾选Convex选项。

  • Camera.main获取失效
    打包后Camera.main可能因为标签或加载顺序问题找不到相机,建议直接引用场景中的相机组件:

    [SerializeField] private Camera gameCamera; // 在Inspector中拖入相机
    // 替换射线生成代码
    Physics.Raycast(gameCamera.ScreenPointToRay(Input.mousePosition), out RaycastHit raycastHit)
    
  • IL2CPP优化导致代码异常
    如果用IL2CPP作为脚本后端,过高的优化等级可能误删相关逻辑。降低优化等级试试:

    1. 打开Edit > Project Settings > Player
    2. 在Other Settings中找到Optimization Level,设置为Low
    3. 重新打包测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:35:29