Почему Random.Диапазон перекрывает позиции кнопок из списка в Unity?

#c# #unity3d #random #position

#c# #unity3d #Случайный #позиция

Вопрос:

У меня есть список кнопок пользовательского интерфейса и 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;
    }
}
 

Ответ №1:

Попробуйте этот код, не уверен, где ваш Random.Функция Range() происходит из, но есть встроенный Random, 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;
    }
}
 

Комментарии:

1. Нужно ли мне использовать какое-либо конкретное пространство имен для использования random.next, потому что под ним отображается красная строка

2. что говорит лампочка? должно быть в вашем проекте по умолчанию (отредактировал ответ)

3. Random не содержит определения для Next

4. @DenisSchaf : Unity3d имеет свой собственный Random класс.

5. @Cid хорошо, я понял, но почему значение по умолчанию не работает? @Sarita добавьте System. перед случайным

Ответ №2:

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

 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 amp;amp; 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;
    }
}
 

Комментарии:

1. Так это происходит потому, что я перетасовываю оба списка? Я вношу изменения, как вы сказали. то есть вы имеете Shuffle в виду, что должны возвращать ~ max ~ значение?

2. Я изменил обе функции. Теперь только элементы списка позиций рандомизированы, а элементы списка кнопок ответов расположены в обычном порядке 0-4. но на экране не появляется ни одной кнопки.

3.Да, Random.Range может вернуть максимальное значение, учитывая документацию

4. Ах, возможно, я что-то забыл и убрал слишком много вещей

5. могу ли я, возможно, сохранить только ShuffleAnswersList() функцию и удалить Shuffle() ? Но тогда как мне удалить повторяющийся случайный индекс? Пожалуйста