Unity / Поиск закрывает объект из списка по тегу - PullRequest
0 голосов
/ 21 февраля 2019

У меня проблема с поиском ближайшего объекта в моем списке.Есть три типа с тегами (еда, камень и дерево).Я порождаю их в начале, по одному для каждого типа, если я нашел какие-то Ресурсы, они больше не скрываются, и я добавляю их в Список, чтобы Рабочий шел к ним и собирал их.

Так ПозжеВ Игре для примера я нашел 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");

        }
    }

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Использование Linq Где и этот полезный метод расширения MinBy

using System;
using System.Collections.Generic;
using System.Linq;

public static class Linqextensions
{
    public static T MinBy<T, R>(this IEnumerable<T> en, Func<T, R> evaluate) where R : IComparable<R>
    {
        return en.Select(t => new Tuple<T, R>(t, evaluate(t)))
            .Aggregate((max, next) => next.Item2.CompareTo(max.Item2) < 0 ? next : max).Item1;
    }
}

(просто скопируйте этот код где-то в ваш проект), вы можете сделать это в одном"линия

var closestItem = gameController.discoveredRessources
    // this is a filter only selecting the ones with tag = "Food"
    .Where(obj => obj.CompareTag("Food"))
    // this returns you the item from the list with the lowest distance
    .MinBy(obj => Vector3.Distance(obj.transform.position, transform.position));
0 голосов
/ 21 февраля 2019

Перво-наперво - не используйте 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]

Также вы можете хранить всю еду / камни / древесину в отдельных списках, когда найдете ее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...