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

如何实时切换Shader?运行时切换Shader不生效及代码疑问

解决Unity中GameObject切换Shader不生效的问题 & 材质数组设置指南

首先咱们得明确:Unity里Shader是依附在Material(材质)上的,所以切换Shader本质上有两种常用思路——要么切换绑定了不同Shader的材质,要么直接修改当前材质的Shader属性。针对你的问题,我分点给你讲清楚:

一、你提供的材质数组代码怎么设置?

这段代码是通过切换不同材质来间接实现Shader切换,设置步骤很直观:

  1. 把脚本挂到需要切换Shader的GameObject上
  2. 打开Unity Inspector面板,找到脚本的materials数组:
    • 调整数组长度为你需要切换的Shader数量(比如要2个Shader就设为2)
    • 逐个点击数组的空白槽位,选择已经绑定了目标Shader的材质(没有现成材质的话,右键Project窗口→Create→Material,然后在材质面板的Shader下拉菜单里选你要的Shader即可)
  3. 运行游戏后,点击GameObject就能切换材质,对应的Shader也会跟着切换

如果想换成现在Unity更常用的C#版本,代码可以改成这样:

using UnityEngine;

public class ShaderSwitcher : MonoBehaviour
{
    public Material[] materials;
    private int currentIndex = 0;

    void OnMouseDown()
    {
        currentIndex = (currentIndex + 1) % materials.Length;
        GetComponent<Renderer>().material = materials[currentIndex];
    }
}

二、直接在同一个材质上切换Shader(无需多材质数组)

如果你不想创建多个材质,只想在当前材质上切换Shader,可以用下面的代码,逻辑更直接:

using UnityEngine;

public class ShaderSwitcher : MonoBehaviour
{
    public Shader targetShader1; // 在Inspector里拖入第一个Shader
    public Shader targetShader2; // 拖入第二个Shader
    private Renderer _renderer;
    private int currentShaderType = 0;

    void Start()
    {
        _renderer = GetComponent<Renderer>();
        // 可选:启动时默认用第一个Shader
        if (targetShader1 != null)
        {
            _renderer.material.shader = targetShader1;
        }
    }

    void OnMouseDown()
    {
        if (currentShaderType == 0)
        {
            if (targetShader2 != null)
            {
                _renderer.material.shader = targetShader2;
                currentShaderType = 1;
            }
        }
        else
        {
            if (targetShader1 != null)
            {
                _renderer.material.shader = targetShader1;
                currentShaderType = 0;
            }
        }
    }
}

三、你之前切换Shader不生效的常见原因

大概率是这几个问题:

  • Shader引用错误:你赋值的Shader可能没导入项目,或者没在Inspector里正确拖入脚本变量
  • 误用共享材质:如果修改的是_renderer.sharedMaterial.shader,会影响所有用这个材质的物体;建议用material属性(会创建当前物体的材质实例,只影响当前GameObject)
  • Shader本身异常:比如Shader编译报错、不兼容当前运行平台,或者Shader的关键参数为空导致渲染异常
  • Renderer状态问题:检查GameObject的Renderer组件是否被禁用,或者物体层设置导致渲染被遮挡

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:13:53