SpawnManager, belirli bir alan içinde rastgele bir gameObject’i rastgele bir noktada oluşturmaya yarayan bir mekanizmadır.
private float spawnRangeX = 20;
private float spawnPosZ = 20;
public GameObject[] animalPrefabs;
void SpawnRandomAnimal()
{
int animalIndex = Random.Range(0, animalPrefabs.Length);
Vector3 spawnPos = new Vector3(Random.Range(-spawnRangeX,spawnRangeX),0,spawnPosZ);
Instantiate(animalPrefabs[animalIndex], spawnPos, animalPrefabs[animalIndex].transform.rotation);
}
İlk olarak sınırlarımızı belirlemeliyiz. Bu sebepten dolayı ‘spawnRangeX’ ve ‘spawnPosZ’ adlı iki adet değişken oluşturacağız. Daha sonrasında değişkenlerimize değer atayarak sınırlarımızı belirleyeceğiz.
spawnRangeX değişkenine 20 değeri verdiğimizde ve birazdan anlatacağım kod sayesinde -20 ve 20 değerleri arasında prefabimizi rastgele spawnlanması için değer atadık.
spawnPosZ değişkenine 20 değeri verdiğimizde ise 20 birim ileride spawnlanması için değer atadık.
Böylelikle prefablerimiz, X ekseninde -20 birim ve 20 birim değerler arasında herhangi bir yerinde; Z ekseninde ise 20 birim ileride spawnlanması için değer atadık.
GameObject[] bir array(dizi) türüdür. İsteğe bağlı olarak buraya objeler ya da gameObject tanımlayarak sadece bir obje tanımlayabiliriz.
Sınırlarımızı çizdikten sonra bunu aksiyona geçirecek bir fonksiyon yazmamız gereklidir. Bunun için ise ‘SpawnRandomAnimal’ isimli bir fonksiyon oluşturacağız.
void SpawnRandomAnimal()
{
int animalIndex = Random.Range(0, animalPrefabs.Length);
Vector3 spawnPos = new Vector3(Random.Range(-spawnRangeX, spawnRangeX), 0, spawnPosZ);
Instantiate(animalPrefabs[animalIndex], spawnPos, animalPrefabs[animalIndex].transform.rotation);
}
int animalIndex = Random.Range(0, animalPrefabs.Length);
Bu kısımda sıfırdan başlayarak arrayimizin uzunluğu olacak şekilde bir adet tam sayıyı ‘animalIndex’ değişkenine tanımla dedik.
Array mantığını daha iyi anlamak adına;

ekran görüntüsüne göre bu kod 0, 1, 2 tam sayılarından random olarak bir tam sayı seçecek ve değişkenimize atayacak.
Vector3 spawnPos = new Vector3(Random.Range(-spawnRangeX, spawnRangeX), 0, spawnPosZ);
Sınırlarımız için değişkenlerimize değerler atamıştık. Şimdi bu değerleri kullanma zamanı.
new Vector3(x, y, z) olarak düşünelim.
x : Random.Range(-spawnRangeX, spawnRangeX)
x pozisyonumuz -20 ile 20 değerleri arasında random bir sayı olsun.
y : 0
y pozisyonumuz 0 değerinde yani zemin seviyesinde olsun.
z : spawnPosZ
20 birim ileride olsun.
tüm bu değerleri ‘spawnPos’ adlı değişkende tut anlamına gelmektedir.
Instantiate(animalPrefabs[animalIndex],spawnPos,animalPrefabs[animalIndex].transform.rotation);
Instantiate… Klonlama makinemiz. Kısaca;
Instantiate(x, y, z) olarak düşünelim.
x : animalPrefabs[animalIndex]
Prefabs arasından rastgele bir adet hayvan.
y : spawnPos
Spanwlanacak sınırlarımız
z : animalPrefabs[animalIndex].transform.rotation
Prefabimiz hangi yöne bakıyor ise o rotasyonda spawnlansın.
SpawnManager scriptimiz bu kadar mı? Hayır. Devam edelim.
Bu fonksiyonumuzu çalıştırmak için bir şeyler daha gerekli gibi?
İki adet daha değişken oluşturalım.
‘Oyun başladıktan sonra kaç saniye sonra prefab spawnlansın?’ sorusu için:
private float startDelay = 2;
‘İlk hayvandan sonra kaç saniye sonra bir sonraki prefab spawnlansın?’ sorusu için:
private float spawnInterval = 1.5f;
iki adet değişken belirledik.
Şimdi fonksiyonumuzu çalıştırmak için InvokeRepeating() kullanacağız.
InvokeRepeating(“fonksiyon”, baslangicGecikmesi, tekrarSikligi)
private float startDelay = 2;
private float spawnInterval = 1.5f;
void Start()
{
InvokeRepeating("SpawnRandomAnimal", startDelay, spawnInterval);
}
‘SpawnRandomAnimal’ fonksiyonunu oyun başladıktan 2 saniye sonra çalıştır, ardından 1.5 saniye aralıklarla tekrar et.
Son:
public class SpawnManager : MonoBehaviour
{
private float spawnRangeX = 20;
private float spawnPosZ = 20;
public GameObject[] animalPrefabs;
private float startDelay = 2;
private float spawnInterval = 1.5f;
void Start()
{
InvokeRepeating("SpawnRandomAnimal", startDelay, spawnInterval);
}
void SpawnRandomAnimal()
{
int animalIndex = Random.Range(0, animalPrefabs.Length);
Vector3 spawnPos = new Vector3(Random.Range(-spawnRangeX, spawnRangeX), 0, spawnPosZ);
Instantiate(animalPrefabs[animalIndex], spawnPos, animalPrefabs[animalIndex].transform.rotation);
}
}
