如何无需重复编写代码对Unity数组元素调用同一函数?
当然有更简洁的方案!
你现在的写法重复代码太多,不仅写起来麻烦,后续维护也容易出错,下面给你几种Unity中常用的优化方式:
方案1:使用for循环处理批量元素
先单独处理特殊的索引0,再通过循环遍历剩下的元素统一设置状态:
public GameObject[] LockPIButton; // 在需要执行逻辑的位置调用 LockPIButton[0].SetActive(false); for (int i = 1; i < LockPIButton.Length; i++) { LockPIButton[i].SetActive(true); }
方案2:先统一设置再调整特殊项
如果特殊项只有少数几个,这种写法会更直观:
public GameObject[] LockPIButton; // 先把所有按钮设为true foreach (var button in LockPIButton) { button.SetActive(true); } // 再单独修改需要特殊处理的按钮 LockPIButton[0].SetActive(false);
方案3:封装成可复用方法
如果这类操作在项目中多次出现,把逻辑封装成方法可以大幅提升复用性和可维护性:
public GameObject[] LockPIButton; /// <summary> /// 设置按钮激活状态,排除指定索引的按钮 /// </summary> /// <param name="excludeIndex">需要特殊处理的按钮索引</param> /// <param name="defaultState">其他按钮的默认激活状态</param> private void SetButtonActivation(int excludeIndex, bool defaultState) { foreach (var button in LockPIButton) { button.SetActive(defaultState); } // 加个索引合法性判断,避免数组越界 if (excludeIndex >= 0 && excludeIndex < LockPIButton.Length) { LockPIButton[excludeIndex].SetActive(!defaultState); } } // 调用时只需一行代码 SetButtonActivation(0, true);
可选方案:用LINQ简化代码(需引用System.Linq)
如果项目允许使用LINQ,可以用更简洁的链式调用完成,但注意小量数据场景下使用,避免不必要的性能开销:
using System.Linq; // 记得在文件顶部添加引用 public GameObject[] LockPIButton; // 执行逻辑 LockPIButton[0].SetActive(false); LockPIButton.Skip(1).ToList().ForEach(btn => btn.SetActive(true));
小提醒:一定要确保数组中的每个
GameObject都已在Inspector中正确赋值,否则会触发空引用异常哦!
内容的提问来源于stack exchange,提问作者Reagaemane
相关产品推荐
相关产品推荐

