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

Unity中调用SetActive仅单个按钮生效,多按钮同脚本激活异常

解决Unity多按钮调用同一脚本仅单个激活的问题

问题出在你使用的static AbilityManager main单例变量上:static变量是全局唯一的,三个挂载了该脚本的按钮实例在Awake时都会执行main = this,最终main只会指向最后(或最先,取决于Unity对象唤醒顺序)完成赋值的那个实例。调用AbilityManager.main.SelectAbility()时,只会触发这个单一实例的方法,因此只有对应按钮被激活。

以下是两种可行的解决方案:

方案一:用静态集合管理所有实例

修改AbilityManager脚本,通过静态集合存储所有按钮实例,实现批量激活:

using System.Collections.Generic;
using UnityEngine;

public class AbilityManager : MonoBehaviour
{
    public GameObject abilityButton;
    private static List<AbilityManager> _allInstances = new List<AbilityManager>();

    private void Awake()
    {
        _allInstances.Add(this);
        abilityButton.SetActive(false);
    }

    private void OnDestroy()
    {
        _allInstances.Remove(this);
    }

    // 静态方法,遍历所有实例激活按钮
    public static void ActivateAllAbilityButtons()
    {
        foreach (var manager in _allInstances)
        {
            manager.abilityButton.SetActive(true);
        }
    }
}

调用脚本修改为:

AbilityManager.ActivateAllAbilityButtons();

方案二:使用集中式UI管理器

单独创建一个全局管理器脚本,统一控制所有按钮,结构更清晰:

using System.Collections.Generic;
using UnityEngine;

public class AbilityUIManager : MonoBehaviour
{
    public static AbilityUIManager main;
    // 在Inspector面板中拖入所有需要控制的按钮对象
    public List<GameObject> abilityButtons;

    private void Awake()
    {
        main = this;
        // 初始化所有按钮为非激活状态
        foreach (var btn in abilityButtons)
        {
            btn.SetActive(false);
        }
    }

    public void SelectAllAbilities()
    {
        foreach (var btn in abilityButtons)
        {
            btn.SetActive(true);
        }
    }
}

调用脚本修改为:

AbilityUIManager.main.SelectAllAbilities();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:12:08