
Случайные значения в Unity позволяют разнообразить поведение объектов, создавать динамические эффекты и улучшать взаимодействие с игроком. Основной инструмент для этого – класс Random, который поддерживает генерацию чисел, векторов и цветов без сложной настройки.
Для чисел с плавающей точкой и целых значений Unity предоставляет метод Random.Range. Например, Random.Range(1, 10) возвращает целое число от 1 до 9, а Random.Range(0f, 1f) – число с плавающей точкой от 0 до 1. Это позволяет легко создавать вариативные движения объектов или случайные параметры оружия и способностей персонажей.
С помощью Random.value можно быстро получить число от 0 до 1 и использовать его для проверки вероятностей: например, чтобы с вероятностью 30% активировать событие, достаточно сравнить Random.value < 0.3f. Это упрощает настройку случайных событий без необходимости вручную управлять генератором.
Для более контролируемой последовательности событий полезен класс System.Random. Он позволяет задавать начальное значение генератора (seed) и воспроизводить одинаковую последовательность случайных чисел, что важно при тестировании или повторяемых симуляциях.
В Unity также удобно генерировать случайные позиции и вращения объектов. Использование Random.insideUnitSphere или Random.rotation позволяет быстро создавать случайные направления движения или разнообразить внешний вид сцены без сложных вычислений.
Генерация случайных чисел с помощью Random.Range

Метод Random.Range позволяет получать случайные числа в Unity с точным контролем диапазона. Для целых чисел верхняя граница исключается: Random.Range(1, 5) вернёт 1, 2, 3 или 4. Для чисел с плавающей точкой верхняя граница включается, например, Random.Range(0f, 1f) возвращает значение от 0 до 1 с точностью до нескольких знаков после запятой.
При работе с игровыми объектами целые значения удобно использовать для выбора индексов массива или количества элементов. Например, int enemyIndex = Random.Range(0, enemies.Length) безопасно выбирает случайного врага из списка без выхода за пределы.
Для генерации вероятностных событий применяют числа с плавающей точкой. Проверка if (Random.Range(0f, 1f) < 0.25f) запускает событие с вероятностью 25%, что упрощает настройку выпадения бонусов или критических ударов.
Если требуется повторяемость последовательности чисел, полезно использовать Random.InitState(seed). Это позволяет фиксировать генератор и воспроизводить одинаковые случайные значения для тестирования или демонстраций.
Метод легко комбинировать с арифметикой для создания нестандартных диапазонов. Например, float value = 2f + 0.5f * Random.Range(0, 5) создаёт числа 2.0, 2.5, 3.0, 3.5 и 4.0, что удобно для генерации шаговых изменений силы или скорости.
Создание случайного вектора для перемещения объектов

Для динамического перемещения объектов в Unity удобно использовать случайные векторы. Метод Random.insideUnitSphere возвращает точку внутри сферы радиусом 1, которую можно масштабировать под нужную величину движения: Vector3 direction = Random.insideUnitSphere * speed.
Если движение требуется только в плоскости XY или XZ, можно ограничить оси вручную. Например, Vector3 direction = new Vector3(Random.Range(-1f, 1f), 0, Random.Range(-1f, 1f)).normalized * speed создаёт равномерно распределённое направление на плоскости.
Для контроля длины вектора полезно использовать normalized, чтобы получить единичное направление, а затем умножить на желаемую скорость. Это предотвращает резкие скачки движения и позволяет задавать точную дальность перемещения.
Случайные векторы также подходят для генерации разброса при стрельбе или эффекта дрейфа объектов. Комбинация Random.Range для отдельных компонентов и нормализации вектора обеспечивает предсказуемость диапазона при сохранении случайности направления.
Для повторяемых сценариев или тестирования можно использовать Random.InitState(seed), что позволяет воспроизводить одну и ту же последовательность векторов и точно проверять поведение объектов при разных параметрах движения.
Использование Random.value для получения чисел от 0 до 1

Random.value возвращает число типа float в диапазоне от 0 до 1. Это удобно для проверки вероятностей, генерации плавных переходов и регулировки случайных параметров без задания конкретного диапазона.
Примеры применения:
- Вероятностные события: if (Random.value < 0.3f) срабатывает с вероятностью 30%.
- Плавная интерполяция: float t = Random.value можно использовать в Mathf.Lerp для случайного положения между двумя точками.
- Регулировка интенсивности эффектов: particle.startSize = baseSize * Random.value задаёт случайный размер частиц.
- Случайная прозрачность материалов: material.color.a = Random.value создаёт естественные вариации прозрачности.
Для создания чисел в другом диапазоне достаточно масштабировать значение: float randomNumber = Random.value * (max — min) + min. Это позволяет быстро получать числа между любыми пределами без использования Random.Range.
При тестировании и отладке можно комбинировать Random.value с Random.InitState(seed) для воспроизводимости последовательности случайных чисел, что удобно для повторяемых экспериментов и симуляций.
Случайный выбор элемента из массива или списка

Для выбора случайного элемента из массива или списка в Unity используют Random.Range для генерации индекса. Например, int index = Random.Range(0, items.Length) безопасно возвращает индекс в пределах массива.
После получения индекса элемент выбирается напрямую: var selectedItem = items[index]. Этот подход подходит как для массивов, так и для списков (List<T>), без необходимости дополнительной обработки.
Чтобы избежать повторов при нескольких случайных выборах, можно использовать одну из следующих стратегий:
- Создать копию массива и удалять выбранные элементы после каждой выборки.
- Перемешать массив с помощью Shuffle или алгоритма Фишера–Йетса и затем проходить по элементам по порядку.
- Использовать HashSet для отслеживания уже выбранных индексов и повторять выбор до получения нового.
Для контролируемого распределения вероятностей можно комбинировать случайный индекс с весами: суммировать веса элементов, генерировать случайное число до суммы и выбирать элемент, чей вес включает это число. Такой подход полезен для выпадения редких предметов или персонажей с разной вероятностью.
При тестировании можно фиксировать генератор через Random.InitState(seed), чтобы последовательность выбранных элементов была воспроизводимой, что важно для отладки логики выпадений и случайных событий.
Генерация случайного цвета для материалов

Для создания случайного цвета в Unity используется класс Color в сочетании с Random.value. Например, Color randomColor = new Color(Random.value, Random.value, Random.value) генерирует цвет с равномерным распределением красного, зелёного и синего каналов.
Чтобы добавить прозрачность, достаточно задать альфа-канал: randomColor.a = Random.Range(0.5f, 1f). Это удобно для частиц, UI-элементов или полупрозрачных объектов.
Для контроля оттенка и насыщенности можно использовать HSV-конвертацию: Color color = Color.HSVToRGB(Random.value, 0.7f, 1f). Здесь значение насыщенности фиксируется на 0.7, что предотвращает слишком бледные или слишком яркие цвета.
Случайные цвета можно применять к материалам напрямую: material.color = randomColor, а для множества объектов – генерировать массив случайных цветов и распределять их по объектам, чтобы получить разнообразие визуальных эффектов.
Для повторяемости генерации полезно использовать Random.InitState(seed), что позволяет воспроизводить одну и ту же последовательность цветов при тестировании или демонстрации сцен.
Создание случайного вращения объектов
Для генерации случайного вращения в Unity используют класс Quaternion в сочетании с методами из Random. Самый простой вариант – transform.rotation = Random.rotation, который задаёт случайное трёхмерное вращение вокруг всех осей с равномерным распределением.
Если нужно ограничить вращение одной или несколькими осями, создают отдельные углы с помощью Random.Range: float angleY = Random.Range(0f, 360f), затем формируют кватернион: Quaternion rotation = Quaternion.Euler(0f, angleY, 0f). Такой подход удобен для объектов, которые должны оставаться вертикальными.
Для постепенного вращения используют случайный вектор скорости: Vector3 angularVelocity = new Vector3(Random.Range(-30f, 30f), Random.Range(-90f, 90f), Random.Range(-30f, 30f)) и применяют его через Rigidbody.angularVelocity, что создаёт естественное движение с вариациями.
Для повторяемости вращений в тестах или симуляциях полезно использовать Random.InitState(seed), чтобы последовательность случайных кватернионов оставалась одинаковой при каждом запуске сцены.
Использование System.Random для управления последовательностью

Класс System.Random позволяет создавать воспроизводимые последовательности случайных чисел в Unity. В отличие от UnityEngine.Random, он использует отдельный генератор с возможностью задания начального значения (seed), что важно для тестирования и симуляций.
Создание генератора выполняется так: System.Random rng = new System.Random(seed);. После этого случайные числа получают через методы rng.Next() для целых значений и rng.NextDouble() для чисел с плавающей точкой от 0 до 1.
Пример использования для выбора элемента из массива:
int index = rng.Next(0, items.Length);
var selectedItem = items[index];
Для генерации чисел в диапазоне с шагом можно использовать формулу min + rng.Next(0, (max — min) / step) * step. Это позволяет точно контролировать шаг случайных значений.
Для наглядности можно представить разницу между UnityEngine.Random и System.Random в таблице:
| Особенность | UnityEngine.Random | System.Random |
|---|---|---|
| Начальное значение (seed) | Можно задать через Random.InitState(seed) | Передаётся при создании генератора: new Random(seed) |
| Тип возвращаемых значений | int, float, Vector3, Color, Quaternion | int, double |
| Воспроизводимость последовательности | Да, после InitState | Да, при использовании одного seed |
| Применение в игровых механиках | Легко для всех типов Unity-объектов | Удобно для логики и тестирования, менее удобно для векторов и цветов без дополнительных вычислений |
Использование System.Random рекомендуется, когда требуется точный контроль над случайностью, повторяемость и независимость от внутреннего генератора Unity.
Случайные события и проверки вероятности с помощью Random
Класс Random в Unity позволяет создавать вероятностные события и проверять условия с заданной вероятностью. Для этого чаще всего используют Random.value или Random.Range.
Примеры реализации случайных событий:
- Проверка вероятности выпадения предмета: if (Random.value < 0.2f) активирует событие с вероятностью 20%.
- Выбор варианта действия: int choice = Random.Range(0, 3) позволяет случайно выбрать одно из трёх действий.
- Случайный бонус или эффект: float effectStrength = Random.Range(0.5f, 1.5f) задаёт случайную силу эффекта в диапазоне.
Для последовательных проверок вероятности можно использовать цикл:
- Сгенерировать случайное число с помощью Random.value.
- Сравнить его с порогом для каждого события.
- Выполнить только одно событие, если требуется исключение повторов.
Для многократного использования вероятностей и тестирования удобно фиксировать генератор: Random.InitState(seed). Это позволяет воспроизводить одинаковую последовательность случайных событий и оценивать баланс механик.
Комбинируя случайные значения с условиями и весами, можно создавать сложные системы выпадений, критических эффектов и случайных решений без необходимости вручную рассчитывать вероятности для каждого случая.
Вопрос-ответ:
Как безопасно выбрать случайный элемент из списка без выхода за пределы?
Для безопасного выбора случайного элемента используют Random.Range, задавая диапазон от 0 до длины списка: int index = Random.Range(0, items.Count). После этого элемент извлекается через индекс: var selectedItem = items[index]. Такой способ гарантирует, что не будет ошибок доступа за пределами массива или списка. Если нужно несколько уникальных выборок, можно удалять уже выбранные элементы или использовать HashSet для отслеживания индексов.
Чем отличается Random.value от Random.Range и когда стоит применять каждый?
Random.value возвращает число с плавающей точкой от 0 до 1 и удобно использовать для проверки вероятностей, плавной интерполяции и масштабирования параметров. Random.Range позволяет задавать диапазон чисел, как целых, так и с плавающей точкой. Для выбора случайного индекса массива лучше применять Random.Range с типом int, а для генерации чисел с плавающей точкой или вероятностных проверок подойдут Random.value и Random.Range с float.
Как задать случайное вращение объекта только по одной оси?
Если требуется вращение только по одной оси, создайте случайный угол через Random.Range и сформируйте кватернион через Quaternion.Euler. Например, для оси Y: float angleY = Random.Range(0f, 360f); transform.rotation = Quaternion.Euler(0f, angleY, 0f);. Этот подход позволяет контролировать направление вращения и предотвращает нежелательные наклоны объекта.
Можно ли повторно использовать последовательность случайных чисел для тестирования механик?
Да, для воспроизводимой последовательности используют Random.InitState(seed) с фиксированным значением seed. После этого вызовы методов Random будут возвращать одну и ту же последовательность чисел. Для System.Random последовательность воспроизводится при создании генератора с указанным seed: System.Random rng = new System.Random(seed);. Это помогает точно проверять поведение объектов или системы выпадений без случайных отклонений.
Как сгенерировать случайный цвет с контролем насыщенности и яркости?
Для контроля оттенка, насыщенности и яркости удобнее использовать HSV. В Unity это реализуется через Color.HSVToRGB. Например, Color color = Color.HSVToRGB(Random.value, 0.7f, 1f); создаёт случайный оттенок при фиксированной насыщенности 0.7 и яркости 1.0. Альфа-канал можно задать отдельно: color.a = Random.Range(0.5f, 1f). Такой способ позволяет избегать слишком бледных или слишком ярких цветов и создавать гармоничные визуальные вариации.
Как с помощью Unity случайно распределять объекты по сцене так, чтобы они не накладывались друг на друга?
Для случайного размещения объектов можно использовать Random.insideUnitSphere или Random.Range для задания координат, но чтобы избежать наложений, требуется дополнительная проверка. Один из способов — хранить позиции уже размещённых объектов и проверять расстояние до новых координат. Например, при генерации позиции: Vector3 newPos = Random.insideUnitSphere * radius; проверяйте, что Vector3.Distance(newPos, existingPos) > minDistance для всех существующих объектов. Если условие не выполняется, генерируйте новую позицию. Такой подход позволяет распределять объекты равномерно и избегать пересечений без сложных алгоритмов физики.
