Unity应用自定义Unlit Shader后GameObject不可见问题求助
问题排查与解决方案
针对你跟随Freya Holmer教程编写的Unlit Shader应用后物体不可见的问题,结合Unity 2022.3.63f3版本,可从以下方向排查修复:
1. 透明渲染类型的配置冲突
你的Shader设置了Tags { "RenderType"="Transparent" },但Pass中未配置混合模式。Unity会按透明物体逻辑(渲染队列3000)处理该材质,但缺乏混合设置时,深度测试会导致物体被后续渲染的内容遮挡,甚至被自身几何体剔除。
修复方案:
- 若不需要透明效果,直接将RenderType改为
Opaque:Tags { "RenderType"="Opaque" } - 若需支持透明,在Pass块内添加标准透明混合模式:
Pass { Cull Off Blend SrcAlpha OneMinusSrcAlpha // 启用透明混合 CGPROGRAM // ... 原有代码
2. 渲染队列与深度设置验证
- 打开材质检查器,确认Render Queue:
- 使用
Opaque时,队列应为Geometry(2000); - 使用
Transparent时,队列应为Transparent(3000)。
- 使用
- 若物体仍不可见,可临时在Pass中添加
ZWrite On(透明物体默认关闭ZWrite)排查,但此设置可能导致透明物体间遮挡异常,仅用于测试。
3. 场景与对象基础检查
- 确认相机的Near/Far Plane范围包含该物体,且物体处于相机视野内;
- 检查Renderer组件是否被禁用,或材质是否正确赋值到对象上;
- 验证模型本身是否包含有效顶点数据(避免是空模型或损坏模型)。
修改后的完整Shader示例(不透明版本)
Shader "Unlit/TestShader" { Properties { _Value ("Value", Float) = 1.0 } SubShader { Tags { "RenderType"="Opaque" } Pass { Cull Off CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" float _Value; struct MeshData { float4 vertex : POSITION; }; struct Interpolators { float4 vertex : SV_POSITION; }; Interpolators vert (MeshData v) { Interpolators o; o.vertex = UnityObjectToClipPos(v.vertex); return o; } float4 frag (Interpolators i) : SV_Target { return float4(1, 0, 0, 1); } ENDCG } } }
内容的提问来源于stack exchange,提问作者Caleb Hamilton-Keene
相关产品推荐
相关产品推荐

