Unity按钮On Click绑定预制体方法报错的解决方案
Unity 批量主题切换按钮报错解决方案
问题根因
直接绑定预制体资源弹出Animation is not playing an AnimatorController警告的核心原因:
- 你拖到OnClick事件里的是项目资源库中的预制体文件本体,不是场景里实际运行的预制体实例。预制体资源本身没有进入运行时状态,身上挂载的Animator组件未初始化控制器,调用方法时自然报错,同时也不会对场景里的实际对象产生任何效果。
- 逐个拖拽场景实例绑定的方式在对象数量多时完全没有可维护性,不需要这么做。
推荐方案:全局主题管理器(仅需配置1次,无需逐个绑定对象)
实现逻辑:所有挂载ObjectTheme脚本的对象在启动时自动向管理器注册,按钮点击时只需要调用管理器的统一切换方法,由管理器遍历所有已注册对象完成主题更新,全流程不需要手动拖拽任何场景对象到按钮事件。
- 首先新建
ThemeManager.cs脚本作为全局主题管理类,代码如下:
using System.Collections.Generic; using UnityEngine; public class ThemeManager : MonoBehaviour { public static ThemeManager Instance { get; private set; } private readonly List<ObjectTheme> _themeTargets = new List<ObjectTheme>(); public bool CurrentDarkMode { get; private set; } = false; void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; DontDestroyOnLoad(gameObject); } public void RegisterTarget(ObjectTheme target) { if (!_themeTargets.Contains(target)) { _themeTargets.Add(target); target.ApplyTheme(CurrentDarkMode); } } // 按钮唯一需要绑定的方法 public void ToggleTheme() { CurrentDarkMode = !CurrentDarkMode; foreach (var target in _themeTargets) { if (target != null) target.ApplyTheme(CurrentDarkMode); } } void OnSceneLoaded() { _themeTargets.RemoveAll(t => t == null); } }
- 修改原有的
ObjectTheme.cs脚本,适配管理器逻辑:
using UnityEngine; public class ObjectTheme : MonoBehaviour { private Animator _animator; void Start() { _animator = GetComponent<Animator>(); // 启动时自动注册到全局管理器,无需手动操作 ThemeManager.Instance.RegisterTarget(this); } public void ApplyTheme(bool isDarkMode) { if (_animator == null) _animator = GetComponent<Animator>(); _animator.SetBool("DarkMode", isDarkMode); } }
- 配置步骤:
- 在初始场景新建空游戏对象,挂载
ThemeManager脚本 - 选中主题切换按钮,在OnClick事件列表中拖拽上述挂载了ThemeManager的空对象,选择
ThemeManager.ToggleTheme方法 - 后续不管场景里新增多少个挂载
ObjectTheme的对象,都会在启动时自动被管理器识别,点击按钮即可同步触发所有对象的主题切换动画,完全不需要逐个绑定。
额外说明
- 原脚本中先调用
GetBool判断再SetBool的逻辑是多余的,SetBool可以直接赋值,不需要提前判断当前值。 - 不要将资源面板中的预制体本体直接绑定给任何UI运行时事件,所有事件绑定的目标必须是场景内存在的运行时对象,否则都会出现调用异常。
内容的提问来源于stack exchange,提问作者Jonatan Zelič
相关产品推荐
相关产品推荐

