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
相关产品推荐
相关产品推荐

