Войти
ПрограммированиеФорумИгровая логика и ИИ

Спавнер рандомных объектов

#0
18:31, 23 июля 2021

Здравствуйте. Написал скрипт для того чтобы спавнил рандомные прифабы в рандомных позициях. И так это работает. Только теперь не могу догнать как сделать так чтобы объекты спавнились с определенным шансом. Вот код:

public class Spawner : MonoBehaviour {

public Transform[] spawnPoints;
public GameObject[] prefab;

public float timetospawn=2f;
public float t=2f;
public int[,] pos = new int[,] {
{5,4,3,0,1,2},
{5,0,0,3,0,0},
{5,3,0,4,5,0},
{5,4,0,4,1,0},
{5,3,1,5,7,8},
{5,3,1,9,10,2},
{5,1,0,9,2,0},
{5,2,3,11,3,12},
{5,4,0,4,13,0},
{5,0,0,4,0,0},
{6,0,0,3,0,0},
{6,0,0,4,0,0},
{6,3,0,11,12,0},
{6,2,0,14,3,0},
{6,1,0,14,15,0},
{2,0,0,16,0,0},
{4,0,0,17,0,0},
{1,4,0,18,19,0},
{1,2,0,2,20,0},
{2,0,0,20,0,0}
};

void Update()
{
if(Time.time>=timetospawn)
{
SpawnBlocks ();
timetospawn =Time.time + t;
}
}
void SpawnBlocks()
{
int random1 = Random.Range (0,3);
int random2 = Random.Range (0,20);
if(random1==0)
{
for (int i = 0; i < 3; i++) {
if(pos[random2,i]!=0)
{
Instantiate (prefab[pos[random2,i]-1],spawnPoints[pos[random2,i+3]+21].position,Quaternion.identity);
}
}

}
if(random1==1)
{
for (int i = 0; i < 3; i++) {
if(pos[random2,i]!=0)
{
Instantiate (prefab[pos[random2,i]-1],spawnPoints[pos[random2,i+3]].position,Quaternion.identity);
}
}

}
if(random1==2)
{
int random3 = Random.Range (0,20);
for (int i = 0; i < 3; i++) {
if(pos[random3,i]!=0)
{
Instantiate (prefab[pos[random3,i]-1],spawnPoints[pos[random3,i+3]+21].position,Quaternion.identity);
}
}
for (int i = 0; i < 3; i++) {
if(pos[random2,i]!=0)
{
Instantiate (prefab[pos[random2,i]-1],spawnPoints[pos[random2,i+3]].position,Quaternion.identity);
}
}
}

}
}


#1
12:26, 24 июля 2021

Мне кажется это все чрезмерно усложнено.
Я правильно понимаю, есть некоторая "сетка" игрового пространства на которую случайным образом копируются префабы?

#2
13:57, 24 июля 2021

Да. Сделанная с помощью пустышек. Jeners

#3
(Правка: 23:07) 22:52, 24 июля 2021

Шанс выбора объекта или шанс выбора позиции?
Ну допустим такой вариант:
Если у тебя есть вероятность выпадения, то суммарно все вероятности должны равняться некоему MAX. Единицы вероятностей тут могут быть любыми. Допустим целыми от 1 до 10 или от 1 до 10000 - неважно.
Складываешь их и получаешь MAX
Далее получаешь RND в диапазоне от 0 до MAX.
Дальше опять перебираешь объекты вычитая из полученного случайного числа вероятности, до тех пор пока не будет меньше нуля - это и будет предмет или место для спавна.

Такой перебор можно заменить деревом или бинарным поиском, если вероятности представить диапазонами.

Обычно генератор случайных чисел тоже имеет некоторый свой собственный график вероятностей выпадения определенный чисел. Так что тут надо думать.

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

ПрограммированиеФорумИгровая логика и ИИ