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

如何通过Unity脚本修改特殊Shader材质中的纹理?

解决Unity Shader Graph材质纹理运行时切换问题

问题分析

你直接通过DefaultMat.Skin赋值是错误的——Unity材质的Shader属性不能直接用这种“类成员”方式访问,必须使用Material.SetTexture方法,且要对应Shader Graph中纹理属性的引用名称(不是Inspector里的显示名称)。

解决步骤

  1. 确认Shader Graph中的属性引用名
    打开你的Shader Graph,找到控制皮肤纹理的Texture2D属性,查看它的Reference字段(比如可能是_SkinTexture,这是Shader内部识别的键名,而非Inspector里显示的“Skin”)。

  2. 修正切换纹理的脚本
    替换你原来的代码,改用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]);
        }
    }
    
  3. 绑定按钮事件

    • 在Unity编辑器中,给按钮的OnClick事件添加该脚本的ChangeSkin方法
    • 传入对应纹理的索引(比如第一个纹理传0,第二个传1)

注意事项

  • 不要直接修改sharedMaterial,否则场景中所有使用该材质的物体都会同步改变纹理;使用material会自动创建材质实例,仅影响当前物体
  • 确保skinTextures数组在Inspector中已正确赋值,避免索引越界
  • 务必将SkinTextureProperty的值替换为你Shader Graph中纹理属性的实际引用名称

内容的提问来源于stack exchange,提问作者Philip John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:12:07