如何重构按钮函数?用单一函数替代多组仅数组来源不同的按钮方法
代码重构:合并重复的按钮选择函数
针对你这种多个按钮函数仅获取不同数组的情况,有三种简单的重构方案,都能只用一个函数实现需求:
方案1:通过索引传递(适合有序的数组)
先把Manager里分散的数组统一放到一个集合里,再通过索引来获取对应数组:
修改Manager代码
public class Manager : MonoBehaviour { public static Manager singleton; // 把arrayOne到arrayTen统一存到List中 public List<GameObject[]> allArrays = new List<GameObject[]>(); void Awake() { singleton = this; // 按顺序添加所有数组 allArrays.Add(arrayOne); allArrays.Add(arrayTwo); allArrays.Add(arrayThree); // ... 一直加到arrayTen } // 保留原来的数组变量,兼容旧逻辑 public GameObject[] arrayOne; public GameObject[] arrayTwo; // ... public GameObject[] arrayTen; }
重构按钮函数
public void OnSelect(int arrayIndex) { // 先做边界校验,避免索引越界 if (arrayIndex < 0 || arrayIndex >= Manager.singleton.allArrays.Count) { Debug.LogError("无效的数组索引"); return; } GameObject[] typeor = Manager.singleton.allArrays[arrayIndex]; dosomething(); }
之后在Unity Inspector里给每个按钮绑定OnSelect函数,传入对应的索引(比如第一个按钮传0对应arrayOne,第二个传1对应arrayTwo,以此类推)。
方案2:通过字符串标识传递(可读性更强)
如果觉得索引不够直观,可以用字典存数组,通过字符串key来获取:
修改Manager代码
public class Manager : MonoBehaviour { public static Manager singleton; public Dictionary<string, GameObject[]> arrayDict = new Dictionary<string, GameObject[]>(); void Awake() { singleton = this; // 给每个数组设置唯一标识 arrayDict.Add("One", arrayOne); arrayDict.Add("Two", arrayTwo); // ... 一直加到"Ten"对应arrayTen } public GameObject[] arrayOne; public GameObject[] arrayTwo; // ... public GameObject[] arrayTen; }
重构按钮函数
public void OnSelect(string arrayKey) { // 尝试获取数组,避免找不到key报错 if (!Manager.singleton.arrayDict.TryGetValue(arrayKey, out GameObject[] typeor)) { Debug.LogError($"找不到标识为{arrayKey}的数组"); return; } dosomething(); }
绑定按钮时传入对应的字符串(比如第一个按钮传"One")即可。
方案3:直接传递数组引用(最快捷)
这种方式不需要修改Manager的任何代码,直接把数组作为参数传给函数:
重构按钮函数
public void OnSelect(GameObject[] targetArray) { if (targetArray == null) { Debug.LogError("目标数组为空"); return; } GameObject[] typeor = targetArray; dosomething(); }
之后在Unity Inspector里给每个按钮绑定OnSelect函数,直接把Manager.singleton的arrayOne、arrayTwo等数组变量拖到参数输入框里就行,一步到位。
内容的提问来源于stack exchange,提问作者jasmine zhao
相关产品推荐
相关产品推荐

