2016-09-15 9 views
0

私のゲームでGameObjectsが発生していて、それらのオブジェクトが配列に保存されています。 この配列は、プレーヤーからの距離によってソートされます。boolがfalseの配列の最初の項目を取得します

プレイヤーがターゲット(オブジェクトの1つ)を取得している場合、そのオブジェクトのブール値 "Claimed"を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; 
} 

関数の第二法則は、イムが問題「=>主張」であることが、問題がである場合、私は本当に知らないのLINQの新しいすべてのIMなどを疑って、機能していません。

コンソールログに何らかのエラーが発生することはありません。

+0

'関数の第2のルールは機能していません。より具体的にする必要があります。エラーが発生しますか?間違ったアイテムが返されますか?それはコンパイルされていませんか? 'ClosestPieceOfFood.GetComponent ().Claimed == false'は' food => food.Claimed == false'ではないはずですか? "f =>!f.Claimed' – DGibbs

+0

var firstnontrue = Allfood.where(f => f.Claimed == false).firstordefault() – loneshark99

答えて

7

ラムダは関数を書くための単なる手短な方法です。 Firstの場合、配列の各項目に渡されるlambaを受け取り、boolを返し、ラムダからtrueという結果になる最初の項目を停止して返します。だから私はあなたが実際に好きなものをしたいと思う。

ClosestPieceOfFood = AllFood.First(Food => Food.GetComponent<Food>().Claimed == false); 

それとも個人的に私はあなたにも何の引き取り手のない食べ物が存在しない場合にはFirstOrDefaultを使用して検討する必要があります

ClosestPieceOfFood = AllFood.First(Food => !Food.GetComponent<Food>().Claimed); 

を好むだろう。その場合、Firstとして例外をスローする場合は、nullが返されます。 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; 
+0

あなたは基本的に' ClosestPieceOfFood.GetComponent () 'コードの一部を投げ捨てました。 .. – Fabjan

+0

@Fabjanはい、それはlambaで意味をなさないので、はい。今では 'Food => Food.GetComponent ().Claimed == false'にする必要があるかもしれませんが、それが本当かどうかは分かりません。 – juharr

+0

'ClosestPieceOfFood == null'が動作するかどうかのチェックを追加すると、ありがとう! – Simon

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; 
} 

あなたのコードは少し奇妙に見えたし、コンテキストのうち、これは乱暴に間違っている可能性があります。

しかし、ラムダの仕組みとちょっと混乱していると思います。 また、Linqメソッドを連鎖させることができるので、複数の列挙を強制しないようにするのに便利です。

関連する問題