C# 试图通过列表中的距离获取游戏对象 私人游戏对象m_PC; 私有游戏对象m_目标; 私有列表m_targetList=新列表(); 私人空间 { m_PC=GameObject.Find(“PlayerCharacter”); } 私有void GetInitialTarget() { 如果(m_targetList.Count>=2) { foreach(m_目标列表中的游戏对象项) { 浮点距离=矢量3.距离(m_PC.transform.position,item.transform.position); Debug.Log(项+“:”+dist); } m_targetList.Sort(); } else if(m_targetList.Count==1) { m_target=m_targetList[0]; } } 专用空对撞机(对撞机其他) { 如果(other.gameObject.tag==“检查”) { GameObject targetGO=other.transform.GameObject; m_targetList.Add(targetGO); } }

C# 试图通过列表中的距离获取游戏对象 私人游戏对象m_PC; 私有游戏对象m_目标; 私有列表m_targetList=新列表(); 私人空间 { m_PC=GameObject.Find(“PlayerCharacter”); } 私有void GetInitialTarget() { 如果(m_targetList.Count>=2) { foreach(m_目标列表中的游戏对象项) { 浮点距离=矢量3.距离(m_PC.transform.position,item.transform.position); Debug.Log(项+“:”+dist); } m_targetList.Sort(); } else if(m_targetList.Count==1) { m_target=m_targetList[0]; } } 专用空对撞机(对撞机其他) { 如果(other.gameObject.tag==“检查”) { GameObject targetGO=other.transform.GameObject; m_targetList.Add(targetGO); } },c#,unity3d,C#,Unity3d,在这里,我试图收集所有的游戏对象与标签内的碰撞器这个对象有。接下来我想做的是比较每一个项目收集的一个因素;m_PC与此处存储在变量m_target中的距离。而且,这正是我目前所处的困境 首先,我认为我在这里使用列表而不是使用字典是错误的,因为距离将成为这个对撞机找到的每个带有标记的游戏对象的TValue,但是我不确定我走的方向是正确的。后来,我想通过另一个优先级来增加另一个因素,比如游戏对象A是垃圾NPC,B是老板NPC,但我认为这可以等等。我确实试着去理解我的比较,我的比较者认为这正是我所需要

在这里,我试图收集所有的游戏对象与标签内的碰撞器这个对象有。接下来我想做的是比较每一个项目收集的一个因素;m_PC与此处存储在变量m_target中的距离。而且,这正是我目前所处的困境

首先,我认为我在这里使用列表而不是使用字典是错误的,因为距离将成为这个对撞机找到的每个带有标记的游戏对象的TValue,但是我不确定我走的方向是正确的。后来,我想通过另一个优先级来增加另一个因素,比如游戏对象A是垃圾NPC,B是老板NPC,但我认为这可以等等。我确实试着去理解我的比较,我的比较者认为这正是我所需要的,但我自己并没有真正做到这一点

//我尝试将列表替换为字典,将GameObject作为TKey,将float(distance)作为TValue,但我遇到了一个难题,即如何根据TValue of distance将GameObject取出,以便m_target拥有。

在这里很神奇

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);
    }
}
本质上这是一个lambda函数,它比较列表中的两个对象并返回一个比较值(1、0或-1),用于按升序对列表进行排序(
y.CompareTo(x)
将按降序排序)

有各种各样的LINQ操作,比如“查找任何符合此条件的项”,并提供一个lambda表达式,该表达式根据该条件进行计算,比如

找到所有比玩家高出5个单位以上的敌人

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表达式是我完全陌生的东西,所以我必须深入了解它实际上是如何工作的,但是您的示例代码行似乎到目前为止还可以工作!干杯接下来的一个问题是:既然按距离排序很好,我如何添加另一个比字符串或标记之类的浮点更模糊的比较因子?@Ho Jeongle,与在lambda之外进行比较的方式相同。只要您可以编写一个比较两个对象并返回排序顺序的函数,就可以将其编写为lambda。
m_targetList.FindAll(x => Vector3.Distance(m_PC.transform.position, x.transform.position).y > 5)