【问题标题】:Trying to get the GameObject by distance in a List试图通过列表中的距离获取游戏对象
【发布时间】:2017-12-01 01:49:27
【问题描述】:
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 是错误的,但后来我不太确定我的方向是正确的.后来,我想通过另一个优先级来添加另一个因素,比如游戏对象 A 是垃圾 NPC,B 是老板 NPC,但我认为可以等待。我确实尝试吸收 IComparable 和 IComparer 认为这是我需要的,但我自己并没有真正做到。

// 我尝试将 List 替换为 Dictionary 以 GameObject 作为 TKey,float(distance) 作为 TValue,但是我卡住了如何根据距离的 TValue 为 m_target 取出 GameObject。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    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 操作,例如“为我找到任何符合此条件的项目”并提供一个根据该条件进行评估的 lambda 表达式,比如...

    找到所有高于玩家 5 个单位的敌人

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

    【讨论】:

    • 谢谢! Lambda 表达式是我完全陌生的东西,所以我必须深入了解它实际上是如何做的,但是你的示例代码行似乎现在就可以工作了!干杯!
    • 一个后续问题:既然按距离排序已经很好了,那么如何添加另一个比float之类的字符串或标签更模棱两可的比较因子?
    • @Ho-JeongLee 与在 lambda 之外进行比较的方式相同。只要能写出比较两个对象并返回排序顺序的函数,就可以写成lambda。
    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 2015-08-30
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多