
Unity’de Belirli Bir Alan İçerisinde Nesne Oluşturmak
Merhaba, bir önceki yazımızda Unity‘de araç tekerlerini nasıl döndüreceğimizi ve gerçek bir teker gibi simule edeceğimizi öğrenmiştik.Bu dersimizde ise, Unity‘de belirli sınırlar içerisinde rastgele pozisyonlarda nasıl nesne klonlayacağımızı öğreneceğiz.Aslında yapacağımız işlemler gayet basit olmakla birlikte, ben biraz daha iyi anlaşılması için nesnelerin kopyalanacağı alanların sayısını çoğalttım.Ne demek istediğimi birazdan daha iyi anlayacağınızı umuyorum.Evet lafı uzatmadan yeni bir proje oluşturalım ve dersimize başlayalım.
Sahnemizin oluşturulma süreci.
Evet bu projemizde kullanacağımız senaryoyu inceleyelim.Belirli bir alan içerisinde nesne oluşturacağımız için, buna göre bir sahne oluşturmamız gerekiyor.Bu alanı oluşturmak için bir insan modelinden yararlanacağız.Böylelikle birden fazla uzuv için farklı boyutlarda ve pozisyonlarda sınırlar oluşturabileceğiz.Siz isterseniz farklı bir 3D Model kullanabilir yada model kullanmak yerine basit bir Plane nesnesi ile de yapabilirsiniz.Ancak yazımın başında da dediğim gibi, daha iyi anlaşılır olması için böyle bir şey yapıyorum.
Şimdi internetten bulduğumuz herhangi bir modeli indirelim ve projemize ekleyelim.Daha sonra modelimizde bulunan her bir uzuv için, Unity‘de yeni bir nesne oluşturalım ve modele göre pozisyonunu ve boyutunu ayarlayalım.Örneğin kafa bölgesi için, bir Sphere nesnesi oluşturuyoruz ve modelin kafasından bir daha büyük olacak şekilde ayarlıyoruz.Yada modelin gövdesi için, bir Cube nesnesi oluşturuyoruz ve Scene penceresinin üzerinde bulunan yardımcı araçlar yardımıyla, gerekli boyut ve pozisyon ayarlarını yapıyoruz.
Model üzerinde her uzuv için nesnelerimizi oluşturup modelin kalıbına göre ayarlıyoruz.Sonra bu modelimiz üzerinde rastgele oluşacak nesneleri sahnemize ekliyoruz.Ben her bir nesneden sahneme ekledim.Bunlar Capsule, Cube, Cylinder ve Sphere nesneleridir.Bu nesneleri sahnemize ekledikten sonra sırasıyla, Project penceresine sürükleyip bırakıyoruz.Artık daha sonra kullanmak üzere, dört adet Prefab nesnemiz hazır hale geldi.Evet artık sahnemiz hazır duruma geldi.Sahnemizin son hali bu şekildedir.
Script dosyamızı oluşturalım.
Evet şimdi sıra kodlarımızı yazmaya geldi.Bunun için öncelikle bir C# Script dosyası oluşturuyoruz.Daha sonra bu dosyamıza bir isim veriyoruz ve sürükleyerek, Hierarchy penceresinde bulunan modelimizin, ebeveyn nesnesinin üzerine bırakıyoruz.Şimdi editör ile açalım ve kodlarımızı yazmaya başlayalım.
public List<GameObject> KalipAlinacakNesneler = new List<GameObject>(); public List<GameObject> PrefabNesneListesi = new List<GameObject>();
İlk olarak, kullanacağımız değişkenleri oluşturmakla başlayalım.Bu projede birden fazla nesne kullanacağımız için, bu nesneleri toplayacağımız listeler oluşturuyoruz.İlk satırda, oluşturmuş olduğumuz Prefab nesnelerinin kopyalanacağı pozisyonlar için bir liste değişkeni oluşturuyoruz.Böylelikle modelimizi referans alarak oluşturmuş olduğumuz bütün nesneleri bu GameObject listesinde tutacağız.İkinci satırda ise bu sefer, tüm Prefab nesnelerini ekleyeceğimiz bir liste oluşturuyoruz.Bu listeden rastgele nesneler çekerek sahnemizde oluşturacağız.
foreach (GameObject kalipNesne in KalipAlinacakNesneler) { Vector3 merkezNokta = kalipNesne.transform.position; Vector3 nesneBoyutu = kalipNesne.transform.localScale; float xEkseni = Random.Range (-nesneBoyutu.x / 2, nesneBoyutu.x / 2); float yEkseni = Random.Range (-nesneBoyutu.y / 2, nesneBoyutu.y / 2); float zEkseni = Random.Range (-nesneBoyutu.z / 2, nesneBoyutu.z / 2); Vector3 yeniPozisyon = merkezNokta + new Vector3 (xEkseni,yEkseni,zEkseni); }
Update() fonksiyonunun içerisine bu kodları yazıyoruz.İlk satırda, bir foreach döngüsü oluşturuyoruz.Bu döngü ile, ilk GameObject listemizde bulunan nesneleri sırasıyla alıyoruz.İkinci satırda, bir Vector3 değişkeni oluşturuyoruz.Bu değişkende her bir nesnenin pozisyonunu tutuyoruz.Üçüncü satırda, tekrar yeni bir Vector3 değişkeni oluşturuyoruz.Bu değişkende ise, her bir nesnenin boyutunu tutuyoruz.Dördüncü, beşinci ve altıncı satırlarda float türünde değişkenler oluşturuyoruz.
Bu değişkenlerde x, y ve z eksenleri için işlem yapıyoruz.Örneğin x eksenine bakacak olursak, Random fonksiyonunu kullanarak rastgele bir boyut değeri belirliyoruz.Bu boyutu belirlerken, nesnemizin x ekseninin eksi değeri ile artı değeri arasında rastgele bir boyut belirliyoruz.Bu boyutu daha sonra ikiye bölüyoruz.Çünkü Prefab nesneleri, bu listede yer alan nesnelerin kalıplarının içerisinde kalmaları gerekiyor.Burada neden bu nesnelerin pozisyonlarını çekmek yerine boyutlarını çektiğimiz aklınıza takılmış olabilir.
Bunun nedeni, Prefab nesnelerinin oluşması için bir kalıba ihtiyaç duymasıdır.Bu kalıbı bir nesnenin pozisyon değerlerini alarak oluşturamayız.İşte bu nedenle nesnelerin boyutlarını alarak işlem yapıyoruz.Yedinci satırda ise, bulmuş olduğumuz bu değerleri ,Prefab nesnelerimizin oluşacağı pozisyonları belirlemek için kullanacağız.Bunun için yeni bir Vector3 değişkeni oluşturuyoruz.Bu değişkene, nesnemizin pozisyonunu tutan değişkeni eşitliyoruz.Daha sonra bu değişken ile de, az önce hesaplamış olduğumuz yeni Vector3 değerlerini topluyoruz.
Foreach içerisinde foreach kullanmak.
foreach (GameObject nesne in PrefabNesneListesi) { nesne.transform.position = yeniPozisyon; GameObject yeniNese = Instantiate(nesne, nesne.transform.position, Random.rotation); float rastgeleBoyutOlustur = Random.Range (1f, 4f); yeniNese.transform.localScale = new Vector3 (rastgeleBoyutOlustur, rastgeleBoyutOlustur, rastgeleBoyutOlustur); yeniNese.GetComponent<MeshRenderer> ().material.color = new Color (Random.Range(0, 1f), Random.Range(0, 1f), Random.Range(0, 1f), 1f); }
Şimdi yeni bir foreach döngüsü daha oluşturuyoruz.Bu döngüde ise, Prefab nesnelerimizi eklediğimiz listeyi çekeceğiz.Yalnız bu döngüyü az önce oluşturduğumuz döngü içerisinde kullanacağız.Böylelikle az önce rastgele belirlemiş olduğumuz pozisyon değerlerini kullanabileceğiz.İkinci satırda bakacak olursak, GameObject değişkenimizin pozisyon değerini, ilk döngüdeki değişkene eşitliyoruz.İkinci satırda yeni bir GameObject değişkeni oluşturuyoruz.
Bu değişkende, Instantiate fonksiyonu ile klonladığımız yeni Prefab nesnelerini kontrol edeceğiz.Parantez içerisinde, listede bulunan nesneleri çekecek olan değişkenimiz, bu nesnelerin yeni pozisyonu ve rastgele rotasyon değeri bulunuyor.Burada Random.rotation fonksiyonu ile, yeni oluşacak bu nesnelerin x, y ve z eksenlerine rastgele değerler atayabiliyoruz.Dördüncü satırda, float türünde yeni bir değişken oluşturuyoruz.Bu değişkende Random fonksiyonu kullanarak, klon nesnenin boyutunu belirliyoruz.Ben en az bir “1”, en çok dört “4” birim olacak şekilde ayarladım.
Beşinci satırda ise, belirlediğimiz rastgele boyutu nesnemize tanımlıyoruz.Bunu localScale fonksiyonu ile yapıyoruz.Parantez içerisinde, her eksen için aynı değişkeni kullandığım dikkatini çekmiştir.Bunun nedeni, oluşacak nesnelerimizin her eksende eşit ölçülerde olması içindir.Altıncı satırda, oluşan bu nesnelerimize rastgele renkler veriyoruz.Bunu yapmak için, nesnemizin MeshRenderer bileşenine erişmemiz gerekiyor.Daha sonra yeni bir Color tanımlıyoruz ve Random fonksiyonu yardımıyla çeşitli renk tonları oluşturuyoruz.Evet C# Script dosyamız hazır duruma geldi.
Şimdi Inspector penceremize dönelim.Script dosyasını eklediğimiz nesnemizi seçiyoruz.Buradan, script dosyamızın içerisinde oluşturduğumuz listeleri görüyorsunuz.Burada ilk listeye, sınırları belirlemek için oluşturduğumuz nesneleri ekliyoruz.İkinci listeye ise, Project penceresinde bekleyen tüm Prefab dosyalarını ekliyoruz.Artık projemizi başlatıp sonuçlarına bakabiliriz.Evet bu projemiz de sonuna geldik.Bir sonraki yazıda görüşmek üzere…