2017-12-01 12 views
2
private GameObject m_PC; 
private GameObject m_target; 

private List<GameObject> m_targetList = new List<GameObject>(); 

private void Awake() 
{ 
    m_PC = GameObject.Find("PlayerCharacter"); 
} 

private void GetInitialTarget() 
{ 
    if (m_targetList.Count >= 2) 
    { 
     foreach (GameObject item in m_targetList) 
     { 
      float dist = Vector3.Distance(m_PC.transform.position, item.transform.position); 

      Debug.Log(item + " : " + dist); 
     } 

     m_targetList.Sort(); 
    } 
    else if (m_targetList.Count == 1) 
    { 
     m_target = m_targetList[0]; 
    } 
} 

private void OnTriggerEnter(Collider other) 
{ 
    if (other.gameObject.tag == "Check") 
    { 
     GameObject targetGO = other.transform.gameObject; 

     m_targetList.Add(targetGO); 
    } 
} 

ここで私は、このオブジェクトが持っているColliderの中にあるタグを持つGameObjectsをすべて集めようとしています。私が次にやりたかったのは、要因によって収集された各項目を比較することでした。変数m_targetに格納するm_PCとの間の距離。 Aaaand、それは私が現時点で立ち往生している場所です。リスト内の距離でGameObjectを取得しようとしています

最初に私はここでリストを使用して辞書を使用して、その距離を達成するのが間違っていると思ったが、このコライダーが見つけたタグを持つ各ゲームオブジェクトのTValueになるだろうが、方向。後でGameObject AがゴミNPC、BがボスNPCのような別の優先順位付けによって別の要素を追加したいと思っていましたが、それは待つことができると思います。私はIComparableとIComparerを吸収しようとしましたが、それは私が必要としていたものだと思っていました。

//私はTKeyとしてGameObjectを持っているDictionaryにListを置き換えようとしましたが、TValueとして浮動(距離)しましたが、そこにはGameObjectをm_targetのために取得する方法が残っています。

答えて

2

Linqここには素晴らしいです。本質的

m_targetList.Sort(
    (x, y) => Vector3.Distance(m_PC.transform.position, x.transform.position) 
       .CompareTo(Vector3.Distance(m_PC.transform.position, y.transform.position)) 
); 

何本であること(y.CompareTo(x)ソートう昇順でリストをソートするために使用されるラムダリストに2つのオブジェクトを比較して比較値を返す関数(1、0、-1)であります降順で)。例えば、「私は、この基準に一致する項目を見つける」とその基準に評価されるラムダ式を提供としてLINQ操作のすべての種類は、あります

、と言う...

は私よりもあるすべての敵を探しますプレーヤーの5ユニット上に

m_targetList.FindAll(x => Vector3.Distance(m_PC.transform.position, x.transform.position).y > 5) 
+0

ありがとう!ラムダ式はまったく新しいものなので、どのように実際に何をするのか知るためには掘り下げなければならないでしょうが、あなたのサンプルコード行は今のところうまくいっているようです!乾杯! –

+0

フォローアップの質問:距離による並べ替えが良いようになったので、浮動小数点型の文字列やタグよりもあいまいな別の比較要素を追加するにはどうすればよいですか? –

+0

@ Ho-JeongLeeラムダの外で比較するのと同じ方法です。 2つのオブジェクトを比較してソート順を返す関数を書くことができれば、ラムダとして書くことができます。 – Draco18s

関連する問題