试图在列表中按距离获取GameObject

时间:2017-12-01 01:49:27

标签: c# unity3d

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_PC之间的距离存储在变量m_target中。 Aaaand,这就是我现在陷入困境的地方。

首先我认为我在这里使用List是错误的并且使用Dictionary来实现该距离将成为每个GameObject的TValue,带有此碰撞器发现的标签,但是后来我不确定是走向正确的方向。后来,我想通过另一个优先级来添加另一个因素,例如GameObject A是垃圾NPC而B是老板NPC,但我认为可以等待。我确实试图吸收IComparable和IComparer的想法,这是我所需要的,但并不是真的自己去那里。

//我已经尝试将List替换为将GameObject作为TKey并浮动(距离)作为TValue的List,但是我遇到了如何将游戏对象取出为m_target根据距离的TValue。

1 个答案:

答案 0 :(得分: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))
);

本质上是一个lambda函数,它比较列表中的两个对象并返回一个比较值(1,0或-1),用于按升序对列表进行排序(y.CompareTo(x)将排序按降序排列)。

有各种LINQ操作,例如&#34;找到符合此标准的任何项目&#34;并提供一个lambda表达式来评估该标准,比如说......

找到超过玩家超过5个单位的所有敌人

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