#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()
? Но тогда как мне удалить повторяющийся случайный индекс? Пожалуйста