Использовать Array.Sort только для сортировки элементов, а не номеров индексов? - PullRequest
0 голосов
/ 11 декабря 2018

Сначала быстрое сокращение моего кода ..

здесь у меня есть два массива, GameObject и массив с плавающей точкой ..

public class PlaceManager : MonoBehaviour
{
private GameObject[] playerList;
private float[] distanceValue;

При запуске я вызываю FindAllPlayersФункция и при обновлении я вызываю две функции.

void Start()
{
    FindAllPlayers();
}
void Update()
{
    FindPlayerXValues();
    DeterminePlace();
}

Функция FindAllPlayers состоит в том, чтобы найти все объекты с тегом «Player» и назначить индексный номер игроку (позже он будет заказан игроками.слот для многопользовательской игры, например, player1, player2 и т. д.).

public void FindAllPlayers()
{
    if (playerList == null)
    {
        playerList = GameObject.FindGameObjectsWithTag("Player");
        for (int i = 0; i < playerList.Length; i++)
        {
            playerList[i].GetComponent<CharacterStats>().playerNumber = i;
        }
    }
}

Цель FindPlayerXValues ​​- заполнить массив distanceValue позицией X всех игроков и назначить их по порядку в порядкеони были заполнены в массиве playerList.(Это также делает playerList [1] == distanceValue [1]!)

public void FindPlayerXValues()
{
    if (playerList != null)
    {
        distanceValue = new float[] { playerList[0].transform.position.x * -1,
        playerList[1].transform.position.x * -1,
        playerList[2].transform.position.x * -1,
        playerList[3].transform.position.x * -1,
        playerList[4].transform.position.x * -1};
    }
}

И функция DeterminePlace сначала сортирует массив distanceValue.Далее он обновляет позицию.

Мой план состоит в том, чтобы он захватывал переменную myPosition из связанного элемента массива playerList, а затем назначал порядковый номер, где находится связанный элемент distanceValue после сортировки.

    public void DeterminePlace()
    {
        Array.Sort(distanceValue);
        for (int i = 0; i < distanceValue.Length; i++)
        {

            playerList[i].GetComponent<CharacterStats>().myPosition = Array.IndexOf(distanceValue, distanceValue[i]); 
        }
    }
}

По состоянию напрямо сейчас переменная игроков myPosition остается неизменной независимо от того, где расположен элемент distanceValue.Вот как я ожидал, что это сработает.

[0]=distanceValue[0] = 1st Place --> [0]=distanceValue[3] = 1st Place
[1]=distanceValue[1] = 2nd Place --> [1]=distanceValue[0] = 2nd Place
[2]=distanceValue[2] = 3rd Place --> [2]=distanceValue[1] = 3rd Place
[3]=distanceValue[3] = 4th Place --> [3]=distanceValue[2] = 4th Place
[4]=distanceValue[4] = 5th Place --> [4]=distanceValue[4] = 5th Place

Это то, что кажется реальностью ...

[0]=distanceValue[0] = 1st Place --> [3]=distanceValue[3] = 4th Place
[1]=distanceValue[1] = 2nd Place --> [0]=distanceValue[0] = 1st Place
[2]=distanceValue[2] = 3rd Place --> [1]=distanceValue[1] = 2nd Place
[3]=distanceValue[3] = 4th Place --> [2]=distanceValue[2] = 3rd Place
[4]=distanceValue[4] = 5th Place --> [4]=distanceValue[4] = 5th Place

Что я могу реализовать в своем коде, чтобы получить что-то ближе кпервый результат?

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 11 декабря 2018

Я подозреваю, что проблема в этой строке:

playerList[i].GetComponent<CharacterStats>().myPosition = Array.IndexOf(distanceValue, distanceValue[i]);

Это просматривает массив distanceValue для индекса значения в индексе i того же самого массива .... т.е.это всегда просто возвращает i.

Возможно, вы имели в виду:

playerList[i].GetComponent<CharacterStats>().myPosition = Array.IndexOf(distanceValue, playerList[i].transform.position.x * -1);

, который должен для каждого игрока найти свою позицию X в отсортированном массиве расстояний и, следовательно, их рейтинг.

...