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默认会优化网格,禁用读写权限,导致无法获取纹理坐标。解决步骤:- 在Project窗口找到对应模型文件
- 勾选Import Settings里的
Read/Write Enabled - 点击
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作为脚本后端,过高的优化等级可能误删相关逻辑。降低优化等级试试:- 打开
Edit > Project Settings > Player - 在
Other Settings中找到Optimization Level,设置为Low - 重新打包测试
- 打开
内容的提问来源于stack exchange,提问作者Keith Sinclair
相关产品推荐
相关产品推荐

