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

Unity按钮On Click绑定预制体方法报错的解决方案

Unity 批量主题切换按钮报错解决方案

问题根因

直接绑定预制体资源弹出Animation is not playing an AnimatorController警告的核心原因:

  • 你拖到OnClick事件里的是项目资源库中的预制体文件本体,不是场景里实际运行的预制体实例。预制体资源本身没有进入运行时状态,身上挂载的Animator组件未初始化控制器,调用方法时自然报错,同时也不会对场景里的实际对象产生任何效果。
  • 逐个拖拽场景实例绑定的方式在对象数量多时完全没有可维护性,不需要这么做。

推荐方案:全局主题管理器(仅需配置1次,无需逐个绑定对象)

实现逻辑:所有挂载ObjectTheme脚本的对象在启动时自动向管理器注册,按钮点击时只需要调用管理器的统一切换方法,由管理器遍历所有已注册对象完成主题更新,全流程不需要手动拖拽任何场景对象到按钮事件。

  1. 首先新建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);
    }
}
  1. 修改原有的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);
    }
}
  1. 配置步骤:
  • 在初始场景新建空游戏对象,挂载ThemeManager脚本
  • 选中主题切换按钮,在OnClick事件列表中拖拽上述挂载了ThemeManager的空对象,选择ThemeManager.ToggleTheme方法
  • 后续不管场景里新增多少个挂载ObjectTheme的对象,都会在启动时自动被管理器识别,点击按钮即可同步触发所有对象的主题切换动画,完全不需要逐个绑定。

额外说明

  • 原脚本中先调用GetBool判断再SetBool的逻辑是多余的,SetBool可以直接赋值,不需要提前判断当前值。
  • 不要将资源面板中的预制体本体直接绑定给任何UI运行时事件,所有事件绑定的目标必须是场景内存在的运行时对象,否则都会出现调用异常。

内容的提问来源于stack exchange,提问作者Jonatan Zelič

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 06:06:26