获取bool为false的数组中的第一项

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 =>"但是因为我是林奇的新手,我真的不知道问题出在哪里.

我的控制台日志中没有任何错误,无论是什么情况.

juh*_*arr 7

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会抛出异常.然后,你需要检查,如果ClosestPieceOfFoodnull,妥善地处理这种情况.

您还可以组合创建数组的代码并找到第一个无人认领的食物,并跳过创建数组.

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)