Как сделать рандомный спавн объектов в unity

от admin

Создаём рандомный спавн объектов

Бывают случаи, когда при определённых условиях нам необходимо создать случайный объект на игровой сцене. Например, при нажатии на кнопку, или при уничтожении ящика, из него должно выпасть случайный предмет. Давайте же это сейчас реализуем.

Для начала в окне Hierarchy создадим пустой объект(Create Empty), и назовём его SpawnArea. Этот объект будет являться нашим спавнером, и именно в нём будет спавниться случайный объект. Так же необходимо создать несколько префабов для спавна. У меня всего три префаба: арбуз, груша и яблоко.

Спавнер вместе с прифабами готов. Осталось написать скрипт. Создаём C# скрипт с названием Spawner, и заранее присвойте его к объекту SpawnArea. Впишите в него следующий код:

Предлагаю вкратце разобрать этот код:

  • В строке #5 мы создали массив объектов для спавна. Там будут хранится ссылки на префабы моего арбуза, яблока и груши.
  • Так же мы создали метод Spawn() в котором будет генерироваться случайное число от нуля, до длины нашего массива — 1. В нашем случае получается от 0 до 2.
  • Ну а запускать метод Spawn() мы будем в методе Start(), который сработает сразу же при старте игры.

И остался последний штрих. Необходимо в окне Inspector для нашего скрипта Spawner в поле Obj перетащить все наши префабы.

Можете запустить свой проект, и сразу же при старте игры на игровой сцене появится случайный объект.

Хочу обратить ваше внимание, что запуск Spawn() в методе Start() был всего лишь демонстративным. Его мы можете запускать когда угодно, например, при клике на определённую кнопку, или сразу же после уничтожения того самого ящика, или врага.

Бывают случаи, когда нам необходимо создавать объекты не единожды, а многократно, например, каждые 5 секунд, и не в одной точке пространства, а в случайных, то советую посмотреть мой предыдущий гайд, который называется Как создать спавн объектов в Unity.

А на этом всё. Если есть вопросы — пишите в комментариях, и не забывайте о лайках 🙂

Random spawning in Unity (C#)

Hi I am making my first unity game in 2D and I have this code now. I have 3 different GameObjects (call them a, b , c) in the array arrows and i would want to know which one of them is spawned ( so i can use it in another function) and delete the previous one from the scene. Now it just spawns one GameObject on another every 5 seconds and I don’t know which one of them did it randomly spawn. Any idea?

I.B's user avatar

2 Answers 2

To keep track of what objects you instantiated you could create a List of GameObject and then when you instantiate an object you can add it in the List . Then you can use any GameObject in that list to do whatever you need.

And for spawning object like that it would be better to use InvokeRepeating , you can pass it the repeat rate and when you want it to start. More information on InvokeRepeating

Как сделать случайную генерацию объектов по координатам заданным в массиве unity?

MrMureno

Код не точный , а просто показать принцип
— цилк — по количеству объектов , которые хотим сгенерировать.
— выбирает рандомную позицию в списке
— генерируем в этой позиции объект
— удаляем эту позицию из списка (в этом месте больше уже не сгенерируем, и в следующих раз выбирать будет из меньшего числа доступных позиций)

только проверьте что точек размещения в списке больше, чем число объектов которые хотите сгенерировать.
и еще можно делать копию списка , так как после удаления из него элементов в процессе генерации — повторно его уже не используешь.

  • Facebook
  • Вконтакте
  • Twitter

MrMureno

оо все похенько.
С чего вы взяли что js код у меня? Это все си шарп ваш любимый.

и что у вас со знанием структур данный. массив от списка чем отличается?? почитайте плиз где нибудь.
Я специально указал и расписал что используется СПИСОК, и что его размер по ходу дела УМЕНЬШАЕТСЯ.

public List <Transform> spawnPoints;
и не забыть using System.GenericCollection;

Читать:
1394 разъем на материнской плате куда подключать

MrMureno

и еще раз это не разовая генерация/расстановка врагов по точкам.

то вам надо по сути при создании врага запоминать куда он создался (может в скрипт врага записывать или куда еще)
и делать выборку из вашего списка с исключением уже занятых (запомненных, точек)

Except(МАССИВ УЖЕ ЗАНЯТЫХ ТРАНСФОРМОВ);

и тогда после смерти врага, зная какое место он занимал — удалив его из массива занятых — сможете освободить место.

но это все лишь принципы, как это сделать, а вы судя по всему где то пропустили курс основ программирования как такового(

BasmanovDaniil

Простейший способ выбора точки спавна — это дёргать Random.Range до тех пор, пока не получите нужное количество противников.

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

Даже со взвешенным рандомом легко может случиться так, что все враги заспавнятся в одном месте, поэтому лучше использовать какой-то алгоритм ротации точек спавна. Для этого можно использовать Shuffle Bag, либо можно просто выкидывать использованные точки спавна из списка.

Как сделать рандомный спавн объектов в unity

The array of floats method works well if you have discrete outcomes, but there are also situations where you want to produce a more continuous result — say, you want to randomize the number of gold pieces found in a treasure chest, and you want it to be possible to end up with any number between 1 and 100, but to make lower numbers more likely. Using the array-of-floats method to do this would require that you set up an array of 100 floats (i.e. sections on the paper strip) which is unwieldy; and if you aren’t limited to whole numbers but instead want any number in the range, it’s impossible to use that approach.

A better approach for continuous results is to use an AnimationCurve to transform a ‘raw’ random value into a ‘weighted’ one; by drawing different curve shapes, you can produce different weightings. The code is also simpler to write:

A ‘raw’ random value between 0 and 1 is chosen by reading from Random.value. It is then passed to curve.Evaluate(), which treats it as a horizontal coordinate, and returns the corresponding vertical coordinate of the curve at that horizontal position. Shallow parts of the curve have a greater chance of being picked, while steeper parts have a lower chance of being picked.

A linear curve does not weight values at all; the horizontal coordinate is equal to the vertical coordinate for each point on the curve.A linear curve does not weight values at all; the horizontal coordinate is equal to the vertical coordinate for each point on the curve. This curve is shallower at the beginning, and then steeper at the end, so it has a greater chance of low values and a reduced chance of high values. You can see that the height of the curve on the line where x=0.5 is at about 0.25, which means theres a 50% chance of getting a value between 0 and 0.25.This curve is shallower at the beginning, and then steeper at the end, so it has a greater chance of low values and a reduced chance of high values. You can see that the height of the curve on the line where x=0.5 is at about 0.25, which means there’s a 50% chance of getting a value between 0 and 0.25. This curve is shallow at both the beginning and the end, making values close to the extremes more common, and steep in the middle which will make those values rare. Notice also that with this curve, the height values have been shifted up: the bottom of the curve is at 1, and the top of the curve is at 10, which means the values produced by the curve will be in the 1-10 range, instead of 0-1 like the previous curves. This curve is shallow at both the beginning and the end, making values close to the extremes more common, and steep in the middle which will make those values rare. Notice also that with this curve, the height values have been shifted up: the bottom of the curve is at 1, and the top of the curve is at 10, which means the values produced by the curve will be in the 1–10 range, instead of 0–1 like the previous curves.

Notice that these curves are not probability distribution curves like you might find in a guide to probability theory, but are more like inverse cumulative probability curves.

By defining a public AnimationCurve variable on one of your scripts, you will be able to see and edit the curve through the Inspector window visually, instead of needing to calculate values.

Похожие статьи