Почему Random.Range перекрывает позиции кнопок из списка в Unity? - PullRequest
1 голос
/ 15 апреля 2019

У меня есть список кнопок пользовательского интерфейса и Vector2 для позиций. Я использую random.range для случайного размещения кнопок при каждой их загрузке. Но он никогда не показывает все 5 кнопок в разных положениях. вместо этого перекрывая некоторые из них. Может кто-нибудь помочь мне с этим?

[SerializeField] List<Button> answersButtons = new List<Button>();
[SerializeField] List<Vector2> positions = new List<Vector2>();

void ShuffleAnswersList()
{             

    for (int i = 0; i < answersButtons.Count; i++)
    {              
       Vector2 tempPosition = 
       answersButtons[i].GetComponent<RectTransform>().position;

       int randomIndex = Random.Range(0, positions.Count);

       answersButtons[i].transform.position = positions[randomIndex];
       answersButtons[randomIndex].GetComponent<RectTransform>().position 
       = tempPosition;

       Debug.Log(randomIndex);          
    }      

}

// shuffle positions
public void Shuffle()
{
    for (int i = 0; i < positions.Count; i++)
    {
        int rnd = Random.Range(0, positions.Count);
        Vector2 tempGO = positions[rnd];
        positions[rnd] = positions[i];
        positions[i] = tempGO;
    }
}

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Когда вы делаете это:

int randomIndex = Random.Range(0, positions.Count);

answersButtons[i].transform.position = positions[randomIndex];

Вы можете получить одно и то же значение, когда вы меняете, поэтому некоторые кнопки перекрываются.

Вы хотите либо:

  • Перемешать список позиций (что вы сделали) и сохранить тот же порядок для списка ответов

  • Перемешать список ответов и сохранить тот же порядок для позиции

Попробуйте вместо этого:

void ShuffleAnswersList()
{             
    //  Notice this v--------------------v to avoid out of range exception
    for (int i = 0; i < positions.Count && i < answersButtons.Count; i++)
    {
// always use i ------V---------------------------------V
       answersButtons[i].transform.position = positions[i];
    }
}

Конечно, сначала обязательно вызовите свой метод Shuffle. Этот метод должен быть исправлен, Random.Range(min, max) может вернуть max (и обеспечить исключение вне диапазона)

// shuffle positions
public void Shuffle()
{
    for (int i = 0; i < positions.Count; i++)
    {
// notice this -------------------------------------V
        int rnd = Random.Range(0, positions.Count - 1);
        Vector2 tempGO = positions[rnd];
        positions[rnd] = positions[i];
        positions[i] = tempGO;
    }
}
0 голосов
/ 15 апреля 2019

Попробуйте этот код, не зная, откуда взялась ваша функция Random.Range (), но в System есть встроенный Random, который вы можете использовать для получения случайных целых чисел.В этом примере случайное значение объявляется впереди, а функция Next () используется для получения случайного числа:

void Shuffle()
{
    System.Random random = new System.Random();
    for (int i = 0; i < positions.Count; i++)
    {
        int rnd = random.Next(0, positions.Count);
        Vector2 tempGO = positions[rnd];
        positions[rnd] = positions[i];
        positions[i] = tempGO;
    }
}
...