
Unity’de Top Havuzu Yapımı
Merhaba, bir önceki yazımızda Unity‘de joystick ile nesne hareket ettirmeyi öğrenmiştik.Böylece buton üzerinde yaptığımız hareketleri, istediğimiz nesneye aktarabiliyorduk.Bugünkü dersimizde ise, Unity ile top havuzu yapacağız.Evet vakit kaybetmeden yeni bir proje oluşturalım ve dersimize başlayalım.
Sahnemizi hazırlamaya başlayalım.
Bu proje için kullanacağımız senaryoyu inceleyelim.Sahnemizde bir top havuzu ve bu havuzun içinde, bir kaydırağımız olacak.Daha sonra bu top havuzunun içerisine küçük toplar eklemeye başlayacağız.Evet senaryomuz bu şekilde olacak.Sahnemizde kullanacağımız bu iki modeli internetten bulabilirsiniz.Ben kaydırak modelini internetten buldum.Top havuzu içinse internette bulunan modeller hoşuma gitmediği için, kendim basit bir model oluşturdum.Yapmış olduğum top havuzu aşağıdaki gibidir.
Evet şimdi sahnemize bir Plane nesnesi oluşturarak başlıyoruz.Bu nesne bizim zeminimizi oluşturacak.Daha sonra top havuzu modelimizi, projemize dahil ediyoruz.Burada dikkat etmeniz gereken bir nokta var.Bu dışarıdan eklediğiniz her model için geçerlidir.Çünkü sahnemizde ki diğer nesnelerin, kullandığımız 3D modellerin içerisinde geçememesi gerekiyor.Modelimizi projeye ekledikten sonra, Inspector penceresinde Generate Colliders diye bir seçenek bulunuyor.
Bu seçeneği işaretlediğimiz zaman, kullanacağımız 3D modelin parçalarına collider bileşenini eklemiş oluyoruz.Yalnız bu seçeneği işaretlemenizi tavsiye etmiyorum.Çünkü her modelde düzgün sonuçlar vermiyor.O yüzden biz bu işlemi elle yapacağız.Şimdi sahnemize eklemiş olduğumuz top havuzumuzu seçelim.Bu modelde sizinde aşağıda görebileceğiniz gibi, halkalar bulunuyor.
Top havuzuna daha sonradan ekleyeceğimiz küçük toplarımızın bu halkaların içerisinden geçmesini önlemek için, her bir halkaya collider bileşenini eklememiz gerekiyor.Bunu yapmak için, Hierarchy penceresinden tek tek halkalarımızı seçiyoruz ve sağ tarafta Inspector penceresinde bulunan Add Component butonuna basarak Mesh Collider bileşenini modelimizin parçalarına ekliyoruz.Böylece daha sonradan ekleyeceğimiz toplar, havuzumuzun içinden geçemeyeceklerdir.
Evet top havuzumuzu ayarladığımıza göre şimdi, kaydırağımızı projemize ekliyoruz.Kaydırak modelimizi, top havuzunun içerisine girecek şekilde ayarladıktan sonra, bu modelimiz içinde bir Mesh Collider bileşeni ekliyoruz.Şimdi havuzumuzun içerisine ekleyeceğimiz topları oluşturmaya başlayalım.Bunun için sahnemize bir Sphere nesnesi ekliyoruz.
Daha sonra, bu nesnemizin boyutunu Scene penceresinde bulunan araçları kullanarak bir miktar küçültüyoruz.Bu oranı kendinize ve top havuzunuzun büyüklüğüne göre belirleyebilirsiniz.Tavsiyem, çokta küçültmeyin, çünkü havuzu doldurmak için yüzlerce klon oluşturacağız.Daha sonra top nesnemizi, Rigidbody bileşenini ekliyoruz.
Şimdi, Project penceresinde Create > Physic Material seçimini yapıyoruz.Inspector penceresinde, Bounciness değerine bir “1” yazıyoruz.Daha sonra Sphere nesnemizin, Sphere Collider bileşeninde yer alan Material bölümüne, oluşturduğumuz bu Physic Material dosyamızı sürükleyip bırakıyoruz.Böylece toplarımız çarpışma sırasında verdiğimiz değerler doğrultusunda zıplayabilecekler.
Artık top nesnemizi Prefab dosyasına dönüştürebiliriz.Bunun için, nesnemizi Project penceresine sürüklüyoruz ve sahnemizde bulunan top nesnemizi siliyoruz.Son olarak ise, top klonlarının oluşacağı nokta için bir boş nesne oluşturuyoruz.Bu boş nesneyi istediğimiz bir konuma yerleştiriyoruz.Sonra bu nesnemiz için yeni bir etiket oluşturuyoruz.Evet artık sahnemiz hazır duruma geldi.Son hali bu şekildedir.
Kodlarımızı yazmaya başlayalım.
Evet şimdi yeni bir C# Script dosyası oluşturuyoruz.daha sonra bu script dosyamızı editör yardımı ile açıyoruz.Artık kodlarımızı yazmaya başlayabiliriz.
public GameObject Top; public Transform KlonlanmaNoktasi; public Color[] TopRenkleri = new Color[4]; public int HavuzdakiTopSayisi; public float GecenZaman; public float MaksimumZaman;
İlk olarak projemizde kullanacağımız değişkenleri oluşturmakla başlıyoruz.Birinci satırda, bir GameObject değişkeni oluşturuyoruz.Bu değişken ile Prefab dosyamızı kontrol edeceğiz.İkinci satırda, bir Transform değişkeni oluşturuyoruz.Bu değişkende ise, klon toplarımızın oluşacağı pozisyon değerlerini kontrol edeceğiz.Üçüncü satırda, bir Color dizisi için değişken oluşturuyoruz.
Daha sonra bu dizimiz için eleman sayımızı belirliyoruz.Dördüncü satırda, int (integer) türünde bir değişken oluşturuyoruz.Bu değişken ile, havuzumuzda bulunan toplarımızın sayısını kontrol edeceğiz.Beşinci ve altıncı satırlarda float türünde değişkenler oluşturuyoruz.Bu değişkenlerle ise, toplarımızın havuzda klonlanma süresini kontrol edeceğiz.
KlonlanmaNoktasi = GameObject.FindWithTag ("isinlanma_noktasi").transform; TopRenkleri[0] = Color.red; TopRenkleri[1] = Color.green; TopRenkleri[2] = Color.blue; TopRenkleri[3] = Color.yellow; HavuzdakiTopSayisi = 0; MaksimumZaman = 0.1f;
Şimdi start() fonksiyonumuzun içerisine bu kodları yazıyoruz.İlk satırda değişkenimize, etiketi “isinlanma_noktasi” olan nesnenin transform değerlerini eşitliyoruz.İkinci ile beşinci satırlar arasında ise, renk için oluşturduğumuz dizi değişkenimizin elemanlarına rastgele renkler tanımlıyoruz.Burada dikkat etmemiz gereken ise, index numarası sıfırdan “0” başladığını unutmamak.
Böylece dört “4” elemanlı bir dizimiz olmuş oluyor.Altıncı satırda, değişkenimizin değerini sıfıra “0” eşitliyoruz.Çünkü bu değişken ile, havuzumuzda biriken toplarımızı sayacağız.Son satırda ise, top havuzumuzda klonlanacak toplar arasındaki maksimum süreyi belirliyoruz.Böylece klonlar aynı anda oluşmayacak ve birden bir yığılma yaşanmayacak.Bu süreyi istediğiniz gibi ayarlayabilirsiniz.Ben top havuzunu daha çabuk doldurmak için, minimumda tuttum.
if (HavuzdakiTopSayisi < 800) { GecenZaman += Time.deltaTime; if(GecenZaman > MaksimumZaman){ GameObject YeniTop = Instantiate(Top, KlonlanmaNoktasi.position, KlonlanmaNoktasi.rotation); YeniTop.GetComponent<Renderer>().material.color = TopRenkleri[Random.Range(0, TopRenkleri.Length)]; HavuzdakiTopSayisi++; GecenZaman = 0; } }
Evet şimdi update() fonksiyonumuzun içerisine bu kodları yazıyoruz.İlk satırda yeni bir koşul oluşturuyoruz.Eğer değişkenimizin değeri, sekizyüzden “800” küçükse koşulumuz doğru oluyor ve çalışmaya devam ediyor.Buradaki sekizyüz “800” değerini istediğiniz gibi ayarlayabilirsiniz.Ben ayrıca bir değişkende bu değeri tutmak yerine direk kodda belirttim.İkinci satırda, değişkenimizin değerini Time.deltaTime fonksiyonu ile arttırıyoruz.Böylece bir zamanlama oluşturmuş oluyoruz.
Üçüncü satırda ise, yeni bir koşul oluşturuyoruz.Eğer “GecenZaman” değişkenimizin değeri, “MaksimumZaman” değişkenimizin değerinden büyük ise, koşulumuz doğru oluyor ve çalışmaya başlıyor.Dördüncü satırda bir GameObject değişkeni oluşturuyoruz.Daha sonra bu değişkenimize Instantiate fonksiyonu yardımı ile yeni oluşacak klon nesnelerimizi tanımlıyoruz.
Bu fonksiyonun parametrelerinde, Prefab dosyamızın bulunduğu değişken ilk sırada bulunuyor.İkinci sırada, klonların oluşacağı pozisyon bilgilerini tutan değişkenimiz bulunuyor.Üçüncü sırada ise, klonların oluşacağı rotasyon bilgilerini tutan değişkenimiz yer alıyor.Beşinci satırda klon nesnelerin, Renderer bileşenine erişiyoruz ve rengini değiştiriyoruz.Renk seçiminde ise, oluşturduğumuz “TopRenkleri” dizisini kullanıyoruz.
Bu diziden rastgele seçtiğimiz bir eleman ile topumuzun alacağı rengi belirlemiş oluyoruz.Bu rastgele seçimi ise, Random fonksiyonu ile yapıyoruz.Altıncı satırda ise, her top klonu oluştuktan sonra değişkenimizin değerini bir “1” arttırıyoruz.Yedinci satırda, “GecenZaman” değişkenizin değerini sıfırlıyoruz.Bu sayede yeni top klonunun oluşması için gereken süre baştan başlıyor.Evet script dosyamız hazır duruma geldi.
Evet projemizin sonuna geldik.Oluşturduğumuz bu C# Script dosyamızı, top havuzumuzun üzerinine sürükleyip bırakıyoruz.Daha sonra script üzerinde bulunan “Top” bölümüne, Project penceremizde yer alan Prefab dosyamızı sürükleyip bırakıyoruz.Artık test edebiliriz.Evet bir sonraki yazıda görüşmek üzere…