如何从主菜单设置场景修改其他场景中物体的材质/颜色
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
相关产品推荐
相关产品推荐

