Sim*_*mon 0 c# linq unity-game-engine
我在游戏中生成了GameObjects,这些对象被保存在一个数组中.该数组按距离玩家的距离排序.
如果玩家已经获得了他的目标(其中一个对象),则该对象的布尔"已声明"需要设置为true,以便其他玩家无法再获得该对象.
相反,他们需要获取该数组的第一项,其中布尔"Claimed"为false.
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;
}
Run Code Online (Sandbox Code Playgroud)
该功能的第二个规则不起作用,我怀疑问题是在"Claimed =>"但是因为我是林奇的新手,我真的不知道问题出在哪里.
我的控制台日志中没有任何错误,无论是什么情况.
lambda只是编写函数的简便方法.如果First它需要在数组的每个项目中传递一个lamba并返回a bool,它将停止并返回true从lambda 导致的第一个项目.所以我觉得你其实想要的东西.
ClosestPieceOfFood = AllFood.First(Food => Food.GetComponent<Food>().Claimed == false);
Run Code Online (Sandbox Code Playgroud)
或者我个人更喜欢
ClosestPieceOfFood = AllFood.First(Food => !Food.GetComponent<Food>().Claimed);
Run Code Online (Sandbox Code Playgroud)
如果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;
Run Code Online (Sandbox Code Playgroud)