如何通过Unity脚本修改特殊Shader材质中的纹理?
解决Unity Shader Graph材质纹理运行时切换问题
问题分析
你直接通过DefaultMat.Skin赋值是错误的——Unity材质的Shader属性不能直接用这种“类成员”方式访问,必须使用Material.SetTexture方法,且要对应Shader Graph中纹理属性的引用名称(不是Inspector里的显示名称)。
解决步骤
确认Shader Graph中的属性引用名
打开你的Shader Graph,找到控制皮肤纹理的Texture2D属性,查看它的Reference字段(比如可能是_SkinTexture,这是Shader内部识别的键名,而非Inspector里显示的“Skin”)。修正切换纹理的脚本
替换你原来的代码,改用SetTexture方法赋值:using UnityEngine; public class SkinSwitcher : MonoBehaviour { public Texture2D[] skinTextures; public MeshRenderer targetMeshRenderer; // 替换为你Shader Graph中纹理属性的实际引用名 private const string SkinTextureProperty = "_SkinTexture"; public void ChangeSkin(int index) { if (index < 0 || index >= skinTextures.Length) { Debug.LogError("无效的纹理索引"); return; } // 使用material而非sharedMaterial,避免影响其他共用该材质的物体 Material mat = targetMeshRenderer.material; mat.SetTexture(SkinTextureProperty, skinTextures[index]); } }绑定按钮事件
- 在Unity编辑器中,给按钮的
OnClick事件添加该脚本的ChangeSkin方法 - 传入对应纹理的索引(比如第一个纹理传0,第二个传1)
- 在Unity编辑器中,给按钮的
注意事项
- 不要直接修改
sharedMaterial,否则场景中所有使用该材质的物体都会同步改变纹理;使用material会自动创建材质实例,仅影响当前物体 - 确保
skinTextures数组在Inspector中已正确赋值,避免索引越界 - 务必将
SkinTextureProperty的值替换为你Shader Graph中纹理属性的实际引用名称
内容的提问来源于stack exchange,提问作者Philip John
相关产品推荐
相关产品推荐

