2016-09-19 3 views
0

Мой код прямо сейчас:Заказав список по размеру с помощью Linq

public GameObject[] Farms; 

Farms = GameObject.FindGameObjectsWithTag("Farm").OrderBy(x => Vector2.Distance(this.transform.position, x.transform.position)) 
                .ThenBy(x => x.transform.parent.gameObject.GetComponent<FoodSpawn>().FoodList.Count) 
                .ToArray(); 

Что у меня есть:
Так моя сцена имеет прямоугольник пол. Куб слева, куб справа и AI (игрок) посередине.
Каждый куб заполнен 7 кусками пищи (детские кубики). Кубики имеют бирку Farm.
Список FoodList - это список GameObject, который в скрипте, прикрепленном к каждому кубу, содержит список каждого куска пищи в кубе.

Что я хочу достичь:
Игрок должен решить, какой куб заполнен продуктами, которые он хочет отправиться.
Но ему нужно взять расстояние до куба и количество пищи в расчете.
Таким образом, игроку необходимо заказать список таким образом, чтобы ближайшая ферма & ферма с наибольшим количеством продуктов питания - это первый элемент списка.

Теперь список правильно упорядочен по расстоянию, поэтому ближайший куб является первым элементом, но он пропускает строку .ThenBy (или им что-то не так).

+1

Что вы вводите? Каков ваш результат? Что вы ожидали вместо этого? Укажите [MCVE]. – nvoigt

+5

Ваш код заказывает сначала на расстоянии. Но ТОЛЬКО, когда расстояния равны, он будет сортировать по количеству пищи. – Johan

+0

Взгляните на то, что Йохан, спасибо, не знал этого. – Simon

ответ

0

Как @Johan упомянул в комментариях, что ThenBy работает только в том случае, если существует связь между двумя объектами в пункте OrderBy. В вашем случае, поскольку вы хотите рассмотреть оба параметра, расстояние AND количество продуктов питания. Вы должны сделать немного математики здесь. В зависимости от приоритета, который каждый параметр вы можете использовать что-то вроде:

OrderBy(x => (distanceForX * priorityOfDistance) + (foodCountForX * priorityOfFoodCount)) 

И вместо

transform.parent.gameObject.GetComponent<FoodSpawn>(); 

вы можете использовать

GetComponentInParent<FoodSpawn>(); 
+0

Не могли бы вы объяснить больше, что вы имеете в виду с приоритетной частью? Я предполагаю, что вы имеете в виду расстояние DistanceForX между кубом и игроком. И с 'foodCountForX' количество пищи в каждом списке? – Simon

+0

Да. вы меня поняли. рассчитать расстояние и количество продуктов питания одинаково. Я предоставил psuedocode. –

+0

Извините, я до сих пор не понимаю, что вы имеете в виду с 'priorityOfDistance' и' priorityOfFoodCount' – Simon

0

Так что я решил сначала сделать это отсортировать список Фермы на расстоянии.
Я также дал Фермам bool, который проверяет, содержит ли ферма пищу или нет.
Затем игрок решает отправиться в ближайшую ферму, на которой есть HasFood bool.

Farms = GameObject.FindGameObjectsWithTag("Farm").OrderBy(x => (Vector2.Distance(this.transform.position, x.transform.position))) 
               .ToArray(); 

ClosestFarm = Farms.First(x => x.GetComponentInParent<FoodSpawn>().HasFood == true); 
Смежные вопросы