Unity3d Unity/Search按标记关闭列表中的对象

Unity3d Unity/Search按标记关闭列表中的对象,unity3d,Unity3d,在列表中查找最近的对象时遇到问题。 有三种类型的标签(食物、石头和木头)。 我从一开始就产生了它们,每种类型都有一些,如果我找到了一些资源,它们就不再隐藏了,我会将它们添加到一个列表中,让工作人员找到并收获它们 所以在游戏的后面,比如 我发现了3个石头资源,然后工人每次都应该先收获最近的一个。。。。 但是我不知道如何迭代抛出一个循环来搜索标签,以及如何得到最近标签的位置 下面是我编写的方法的一些代码: void FindNearestFoodRessource() { f

在列表中查找最近的对象时遇到问题。 有三种类型的标签(食物、石头和木头)。 我从一开始就产生了它们,每种类型都有一些,如果我找到了一些资源,它们就不再隐藏了,我会将它们添加到一个列表中,让工作人员找到并收获它们

所以在游戏的后面,比如 我发现了3个石头资源,然后工人每次都应该先收获最近的一个。。。。 但是我不知道如何迭代抛出一个循环来搜索标签,以及如何得到最近标签的位置

下面是我编写的方法的一些代码:

void FindNearestFoodRessource()
    {
        for (int i = 0; i < gameController.discoveredRessources.Count; i++)
        {
            //float dist = Vector3.Distance(gameController.discoveredRessources[i].transform.position, transform.position);
            GameObject nearestFoodRessource = GameObject.FindGameObjectWithTag("Food");

        }
    }
void FindNearestFoodRessource()
{
对于(int i=0;i
第一件事-不要在频繁调用的方法中使用FindGameObject****它非常昂贵

关于您的问题-只需检查所有资源的标签和距离:

float minDist = Vector3.Distance(gameController.discoveredRessources[0].transform.position, transform.position);
int minDistIndex = 0;
for (int i = 1; i < gameController.discoveredRessources.Count; i++)
{
    if (gameController.discoveredRessources[i].gameObject.CompareTag("Food"))
    {
        float dist = Vector3.Distance(gameController.discoveredRessources[i].transform.position, transform.position);
        if (dist < minDist)
        {
            minDist = dist;
            minDistIndex = i;
        }
    }
}
//Now you can move to gameController.discoveredRessources[minDistIndex]
float minDist=Vector3.距离(gameController.discoveredresources[0].transform.position,transform.position);
int minDistIndex=0;
对于(int i=1;i
此外,当您发现使用和此有用的扩展方法时,也可以将所有食物/石头/木材存储在单独的列表中

使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共静态类Linqextensions
{
公共静态T MinBy(此IEnumerable en,Func evaluate),其中R:i可比较
{
返回en.Select(t=>newtuple(t,evaluate(t)))
.Aggregate((最大,下一个)=>next.Item2.CompareTo(最大项2)<0?下一个:最大)。Item1;
}
}
(只需将代码复制到您的项目中)您可以在“一”行中完成

var closestItem=gameController.discoveredResources
//这是一个仅选择带有tag=“Food”的过滤器
.Where(obj=>obj.CompareTag(“食品”))
//这将返回列表中距离最小的项
.MinBy(obj=>Vector3.Distance(obj.transform.position,transform.position));