如何用FirstOrDefault与Lambda表达式简化Unity中的GameObject查找函数?
使用FirstOrDefault与Lambda简化Unity中查找特定GameObject的逻辑
嘿,这个需求用Linq的FirstOrDefault配合Lambda表达式确实能把代码简化不少!先给你对比下传统遍历写法和优化后的版本,一看就懂:
传统遍历写法(参考)
假设你原来的代码大概是这样的:
public Vector3 FindClosestLadderPosition(List<GameObject> ladderObjects) { foreach (var ladder in ladderObjects) { // 假设isClosestLadder是挂载在GameObject上的某个组件的字段 LadderComponent ladderComp = ladder.GetComponent<LadderComponent>(); if (ladderComp != null && ladderComp.isClosestLadder) { return ladder.transform.position; } } // 未找到时返回默认位置,比如Vector3.zero return Vector3.zero; }
简化后的写法(Linq + Lambda)
首先要记得在脚本顶部引入Linq命名空间:using System.Linq;,然后就可以用一行Lambda配合FirstOrDefault完成查找:
using System.Linq; public Vector3 FindClosestLadderPosition(List<GameObject> ladderObjects) { // 找到第一个满足条件的梯子对象 var targetLadder = ladderObjects.FirstOrDefault(ladder => ladder.TryGetComponent(out LadderComponent comp) && comp.isClosestLadder); // 空条件运算符+空合并运算符处理结果 return targetLadder?.transform.position ?? Vector3.zero; }
细节说明:
FirstOrDefault的作用:遍历集合时返回第一个符合Lambda条件的元素,如果没有匹配项,返回该类型的默认值(GameObject的默认值是null)。TryGetComponent替代GetComponent:比直接用GetComponent更高效,不需要额外的空引用检查,直接通过out参数获取组件,同时返回布尔值判断是否获取成功。- 空运算符简化判断:
targetLadder?.transform.position只有当targetLadder不为null时才会访问位置,否则返回null;?? Vector3.zero则是当左侧为null时返回默认的零向量。
如果你的isClosestLadder是GameObject自身的字段(而非组件上的),那Lambda可以更简洁:
var targetLadder = ladderObjects.FirstOrDefault(ladder => ladder.isClosestLadder);
内容的提问来源于stack exchange,提问作者Sean Carey
相关产品推荐
相关产品推荐

