"Enter"a basıp içeriğe geçin

Unity Günlüklerim (Roll-a-Ball) #6

Bu dersimizde 6. videoyu yani itemleri toplamayı anlatacağım. Bu derste etiket sisteminden, itemleri toplamaktan, dökümantasyonu kullanmaktan ve colliderların performansa etkisinden bahsedeceğim.

İtemi toplayabilmemiz için arada tetikleyici bir unsur olması gerekiyor. Tetikleyici unsur olarak colliderları kullanıyoruz. Colliderlar diğer objelerle teması sağlamaktadır.

Collider varken player ile içinden geçemiyoruz.
Collider yokken player ile içinden geçebiliyoruz.

Player’ı aktif edelim. PlayerController scriptini açalım. İtem toplama olayını burada tanımlayacağız. Bunun için OnTriggerEnter’ı kullanacağız. Peki buna nasıl karar verdik?

Yukarıdaki görselde göreceğiniz üzere tüm komponentlerin yanında soru kitapçığı bulunmakta. Temas olaylarını kontrol edeceğimiz için collider özelliği barındıran Sphere Collider komponentinin kaynakçasına bakıyoruz.

Bu sayfada görsel arayüzdeki özelliklerini anlatmakta. Bize lazım olan kod içerisindeki özellikler.

Kod özelliklerine bakmak için “Switch To Scripting” yazısına tıklayalım. Burada kod içinde kullanılan komutları görebilirsiniz. Burada kodları okursanız neyi kullanacağınızı bulabilirsiniz. Bizim ihtiyacımızı ise OnTriggerEnter karşılamakta.

Diğer objeler ile temas olduğu zaman tetiklendiğini söylüyor.

Tıkladığımızda nasıl kullanabileceğimizle ilgili örnekler anlatmakta. Yukarıdaki örnekle bir temas olduğu zaman, temas edilen objeyi Destroy fonksiyonu ile yok ediyor.

Destroy ile yok edilen bir objenin kendisi dahil child objelerinide yok etmektedir. Hazır koddan yola çıkarak bu objeleri yok etmek istemiyoruz. Sadece görünürlüğünü pasif yapmak istiyoruz. Tıpkı Pick Up objelerini oluştururken Player objesini görünmez yaptığımız gibi.

Görünmez yapacağımız obje bir Cube objesi ve bu GameObject’tir. Nasıl pasif yapacağımızı öğrenmek için GameObject dökümantasyonuna girelim.

Burada SetActive metodunu görmekteyiz. Açıklamasını okursak objeleri aktif/pasif yaptığını, true veya false değerlerini aldığını söylemekte.

Bu metodun içindeki kodları sadece Pick Up objesine uygulamak istiyoruz. Bunu nasıl yapacağız? Cevabı basit. Etiket kullanarak. Temas edilen objenin bir de etiketi olması gerekiyorki Pick Up objesini tespit edelim. Etiket olmazsa her tetiklenebilir obje ile temasında kodları çalıştıracaktır.

GameObject özelliklerine bakarsak bu isteğimizi karşılayan bir metodun olduğunu görebiliriz.

GameObject’tin etiket sistemine sahip olduğunu nereden biliyoruz? Dökümantasyona bakarsak tag yani etiket özelliğinin olduğunu göstermekte.

https://docs.unity3d.com/ScriptReference/GameObject-tag.html

https://docs.unity3d.com/ScriptReference/GameObject.CompareTag.html

https://docs.unity3d.com/ScriptReference/GameObject.SetActive.html

Etiket sistemini nasıl kullanacağız? Bunun için tag’i anlatan dökümantasyonu açalım.

Burada şöyle bir tanım var. Kullanılabilmesi için Tags and Layers manager’da önceden tanımlanmış olması gerekmekte.

Tags and Layers manager yazısına tıklarsak nasıl oluşturabileceğimizi görebiliriz.

Edit > Project Settings seçtikten sonra Tags and Layers’a tıklamamız gerektiğini söylüyor.

Burada + butonuna tıklamamız gerektiğini söylemekte. Tıkladığımızda etiket ekleme ekranı gelecek. Buraya “Pick Up” yazalım.

Sıra geldi bu etiketi Pick Up objelerimize uygulamaya.

Pick Up prefabını açalım. Görseldeki Tag yazan yere tıklayalım ve buradan Pick Up etiketini seçelim. Bunu prefab içerisinde uyguladığımız için diğer objelerin etiketleri otomatik olarak Pick Up olmuş durumda.

Şimdi dökümantasyonu kullanmayı öğrendiğimize göre kod yazmaya başlayalım.

OnTriggerEnter’ın nasıl kullanıldığını gösteriyor. Bunu kodumuza ekleyelim.

Ardından etiketi kontrol etmek için CompareTag kullanacağımızı bulmuştuk.

Ardından SetActive’i kullanarak pasif yapalım.

Son adım olarakta Is Trigger özelliğini inceliyelim. Oyunu çalıştırdığımız zaman Pick Up objelerine dokunmamız halinde hiç bir olay olmamakta. Bir olayın olması için Pick Up objelerinin tetiklenebilir olması gerekiyor. Tetiklenebilir özelliğinin olması gerekiyor.

Bu özelliğide böylece açmış oluyoruz. Test ettiğimiz zaman bu bölümün bittiğini düşünebilirsiniz. Fakat bir sorunumuz var. Bu sorun Unity optimizasyonuyla ilgili. Unity performans optimizasyonu olarak sahnedeki tüm statik colliderların hacimlerini hesaplar ve bu bilgiyi önbellekte tutar.

Statik colliderlar hareket etmediği için mantıklıdır ve her karede bu bilgileri yeniden hesaplamaktan kurtarır. Hata yaptığımız yer kodlar ile bu küpleri döndürmemiz. Ne zaman bir statik colliderı hareket ettirir, döndürür, veya ölçeklendirirsen, Unity tüm statik colliderları tekrar hesaplar ve statik collider önbelleğini günceller. Önbellek yeniden hesaplanırken kaynaklarımızı kullanır.

Dinamik colliderları istediğimiz kadar taşıyabilir, döndürebilir veya ölçeklendirebiliriz ve Unity herhangi bir collider birimini önbelleğe almaz. Unity, colliderları hareket ettirmemizi bekler. Onları taşımak için hangi colliderların dinamik olduğunu Unity’e bildirmemiz gerekir. Bunu Rigidbody kullarak yapıyoruz. Collider ve Rigidbody içeren bir obje dinamik kabul edilir.

Şu anda Pick Up GameObjectlerimizin bir Box Collider’ı var ama Rigidbody yok. Yani Unity statik collider önbelleğini her karede yeniden hesaplıyor. Çözüm, Pick Up objelerine Rigidbody eklemektir.

Pick Up prefabını açın ve Rigidbody ekleyin. Ardından oyunu çalıştırın. Tüm objelerin yerin altına gittiğini göreceksiniz. Bunun nedeni Rigidbody ile gelen fiziksel özellikler. Bu özellikleri iptal etmek için Is Kinematic’in karşısındaki kutuya tik eklemek yeterli olacaktır. Kinematic Rigidbody, fiziksel güçleri kullanmaz.

Sonraki derste skor sisteminden bahsedeceğiz.

Yazıyı Medium’da okumak için:

https://medium.com/@osmananilozcan/unity-g%C3%BCnl%C3%BCklerim-roll-a-ball-6-4aa78547ea85

Önceki yazı:

Sonraki yazı:

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.