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

如何从主菜单设置场景修改其他场景中物体的材质/颜色

Unity跨场景Toggle控制物体颜色/材质实现方案

一、全局状态持久化(解决跨场景生效问题)

首先需要一个全局状态管理的单例对象,用来保存Toggle的状态,并且在场景切换时不被销毁:

创建一个名为GlobalSettings的脚本,代码如下:

using UnityEngine;
using System;

public class GlobalSettings : MonoBehaviour
{
    public static GlobalSettings Instance { get; private set; }
    
    public bool IsColorToggleEnabled { 
        get => _isColorToggleEnabled;
        set
        {
            _isColorToggleEnabled = value;
            OnToggleStateChanged?.Invoke(value);
        }
    }

    private bool _isColorToggleEnabled;
    public event Action<bool> OnToggleStateChanged;

    private void Awake()
    {
        if (Instance != null && Instance != this)
        {
            Destroy(gameObject);
        }
        else
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
    }
}

将这个脚本挂载到主菜单场景的一个空GameObject上(命名为GlobalManager即可),这样场景切换时该对象会被保留,状态也能持续生效。

二、主菜单Toggle的逻辑脚本

给主菜单的Toggle组件挂载一个控制脚本,监听其状态变化并同步到全局状态:

创建ColorToggleController脚本:

using UnityEngine;
using UnityEngine.UI;

public class ColorToggleController : MonoBehaviour
{
    private Toggle _toggle;

    private void Awake()
    {
        _toggle = GetComponent<Toggle>();
        // 初始化Toggle状态为全局保存的状态
        _toggle.isOn = GlobalSettings.Instance.IsColorToggleEnabled;
    }

    private void OnEnable()
    {
        _toggle.onValueChanged.AddListener(OnToggleValueChanged);
    }

    private void OnDisable()
    {
        _toggle.onValueChanged.RemoveListener(OnToggleValueChanged);
    }

    private void OnToggleValueChanged(bool isEnabled)
    {
        GlobalSettings.Instance.IsColorToggleEnabled = isEnabled;
    }
}

把这个脚本拖到你的Toggle物体上,Toggle的状态变化会自动同步到全局设置中。

三、目标场景物体的颜色/材质控制

在需要修改的目标场景物体上挂载脚本,读取全局状态并应用对应的颜色或材质:

创建ObjectColorController脚本:

using UnityEngine;

public class ObjectColorController : MonoBehaviour
{
    // 可在Inspector面板设置切换前后的材质
    public Material defaultMaterial;
    public Material enabledMaterial;
    // 也可以直接设置颜色(二选一即可)
    public Color defaultColor = Color.white;
    public Color enabledColor = Color.red;

    private Renderer _renderer;

    private void Awake()
    {
        _renderer = GetComponent<Renderer>();
        // 初始化时应用当前全局状态
        ApplyToggleState(GlobalSettings.Instance.IsColorToggleEnabled);
    }

    private void OnEnable()
    {
        // 订阅全局状态变化事件,实现实时更新
        GlobalSettings.Instance.OnToggleStateChanged += ApplyToggleState;
    }

    private void OnDisable()
    {
        GlobalSettings.Instance.OnToggleStateChanged -= ApplyToggleState;
    }

    private void ApplyToggleState(bool isEnabled)
    {
        if (_renderer == null) return;
        
        // 方式1:切换材质
        if (enabledMaterial != null && defaultMaterial != null)
        {
            _renderer.material = isEnabled ? enabledMaterial : defaultMaterial;
        }
        
        // 方式2:修改材质颜色(注释掉方式1即可用这个)
        // _renderer.material.color = isEnabled ? enabledColor : defaultColor;
    }
}

将这个脚本挂载到目标场景的物体上,在Inspector面板中设置好对应的材质或颜色,物体就会根据全局Toggle的状态自动切换显示效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:39:14