我的游戏中有GameObjects产生,这些对象被保存在一个数组中。 该数组按距离玩家的距离排序。
如果玩家已经获得了他的目标(其中一个对象),那么该对象就是他的布尔值"声明"需要设置为true,以便其他玩家不再能够获得该对象。
相反,他们需要获取该数组的第一项,其中布尔值为#34; Claimed"是假的。
public void SearchFood()
{
AllFood = GameObject
.FindGameObjectsWithTag("Food")
.OrderBy(x => Vector3.Distance(this.transform.position, x.transform.position))
.ToArray();
ClosestPieceOfFood = AllFood
.First(Claimed => ClosestPieceOfFood.GetComponent<Food>().Claimed == false);
ClosestPieceOfFood.GetComponent<Food>().Claimed = true;
}
该功能的第二条规则不起作用,我怀疑问题出现在&#34; Claimed =&gt;&#34;但是作为林奇的新手,我真的不知道问题出在哪里。
我的控制台日志中没有任何错误,无论是什么情况。
答案 0 :(得分:7)
lambda只是编写函数的简便方法。在First
的情况下,它需要在数组的每个项目中传递一个lamba并返回bool
,它将停止并返回从lambda导致true
的第一个项目。所以我觉得你真的想要这样的东西。
ClosestPieceOfFood = AllFood.First(Food => Food.GetComponent<Food>().Claimed == false);
或者我个人更喜欢
ClosestPieceOfFood = AllFood.First(Food => !Food.GetComponent<Food>().Claimed);
如果没有无人认领的食物,您可能还需要考虑使用FirstOrDefault
。在这种情况下,这将返回null
,因为First
会抛出异常。然后,您需要检查ClosestPieceOfFood
是否为null
并正确处理该案例。
此外,您可以组合创建数组的代码并找到第一个无人认领的食物,并跳过创建数组。
ClosestPieceOfFood = GameObject
.FindGameObjectsWithTag("Food")
.OrderBy(x => Vector3.Distance(this.transform.position, x.transform.position))
.Select(x => x.GetComponent<Food>())
.FirstOrDefault(Food => !Food.Claimed);
if(ClosestPieceOfFood != null)
ClosestPieceOfFood.Claimed = true;
答案 1 :(得分:2)
public void SearchFood()
{
var food = GameObject.FindGameObjectsWithTag("Food")
.OrderBy(x => Vector3.Distance(this.transform.position, x.transform.position)
.First(x => x.GetComponent<Food>().Claimed == false);
food.GetComponent<Food>.Claimed = true;
}
你的代码看起来有点奇怪而且脱离了上下文,所以这可能是非常错误的。
但我觉得你对lambdas的工作方式感到有些困惑。 你也可以链接Linq方法,这样就可以方便地强制执行多次枚举。