Unity中SetTexture()无法设置纹理问题求助
Unity动态设置纹理无效果的排查解决方法
你遇到的_renderer.material.SetTexture("_MainTex", _textureToSet)无效果但无报错的问题,可从以下几个方向逐一排查:
1. 核对材质纹理属性名
打开_materialToSet对应的Shader,确认主纹理的属性名是否为_MainTex:
- URP/HDRP的默认Lit Shader主纹理属性名为
_BaseMap,而非_MainTex; - 快速验证:在Material Inspector中,将鼠标悬停在主纹理输入框上,Tooltip会显示准确的属性名称,必须与代码中的字符串完全一致。
2. 检查纹理导入设置
纹理类型错误确实会导致不显示:
- 将纹理类型设为Texture 2D,纹理形状选择2D;
- 避免误勾选特殊选项(比如将普通纹理设为Normal Map);
- 选中纹理文件后,点击Inspector面板的Apply按钮确认设置生效。
3. 确认纹理引用是否正确
- 在Unity编辑器的脚本组件面板中,检查
_textureToSet是否已正确拖入texture.png文件,排查空引用问题; - 可在代码中添加调试语句验证:
Debug.Log(_textureToSet == null ? "纹理为空" : $"当前引用纹理:{_textureToSet.name}");
4. 排查材质实例问题
- 使用
_renderer.material会创建原材质的实例副本,若有其他代码修改该实例,可能干扰纹理设置; - 可临时改用共享材质测试(注意:此操作会修改原材质文件):
如果此方式有效,说明实例化后的材质存在其他干扰项,需检查原材质的特殊设置。_renderer.sharedMaterial.SetTexture("_MainTex", _textureToSet);
5. 验证Shader兼容性
- 确保材质Shader与项目渲染管线匹配(比如URP项目不要使用内置Standard Shader);
- 检查Quad的渲染顺序、相机可见性,排除被遮挡或裁切的可能。
调试代码参考
可修改代码增加调试信息,快速定位问题:
private Renderer _renderer; [SerializeField] Material _materialToSet; [SerializeField] Texture _textureToSet; void Start() { _renderer = GetComponent<Renderer>(); if (_renderer == null || _materialToSet == null || _textureToSet == null) { Debug.LogError("组件或资源未正确赋值"); return; } _renderer.material = _materialToSet; // 打印材质所有纹理属性名,确认目标属性存在 var shader = _materialToSet.shader; for (int i = 0; i < shader.GetPropertyCount(); i++) { if (shader.GetPropertyType(i) == ShaderPropertyType.Texture) { Debug.Log($"纹理属性名:{shader.GetPropertyName(i)}"); } } _renderer.material.SetTexture("_MainTex", _textureToSet); // 验证设置结果 var currentTex = _renderer.material.GetTexture("_MainTex"); Debug.Log($"设置后主纹理:{currentTex?.name ?? "空"}"); }
内容的提问来源于stack exchange,提问作者Andrey Radostny
相关产品推荐
相关产品推荐

