Birlikte öğreniyoruz...

Instantiate metodu yani örnekleme konusuna geçmeden önce Unity’de oyun yapmak için sıklıkla kullanacağımız Prefabs konusuna değinmemiz gerekiyor.

Prefabs Kullanımı

Unity oyun motoru üzerinde sürekliliği olan objelerinizi Prefabs özelliği sayesinde hazır yapılar, şablonlar haline getirebiliriz. Prefabs haline getirdiğimiz objemizi istediğimiz gibi düzenleyerek oyunumuzun istediğimiz sahnesinde çağırarak kullanılabilir.

Örneğin sürekli varyasyonları yapılan bir zombi oyununuzun olduğunu düşünün. Genelde bu tarz oyunlarda belirli tiplerde zombiler vardır ve sürekli olarak oyunun belirli bölümlerinde karşınıza çıkar. Siz her zombi için yeniden yapılandırarak kullanmanın ne kadar zor olduğunu düşünün. Bunun yerine prefabs ile bir hazır yapı oluşturup her ihtiyacınız olduğunda kolayca kullanabilirsiniz.

O zaman biraz örneklere girelim ki kafamızda daha iyi anlamlansın.

İlk olarak oluşturacağımız hazır şablonları saklayacağımız klasörümüzü oluşturmamız gerekiyor. “Project” menüsünde “Assets” klasörünün altına “Prefabs” isminde bir klasör oluşturuyoruz. Yazılı olmayan kurallara uymak için ilk harf büyük.

Şimdi iki adet sahne ekleyelim. Sahnelerden birisine şablon yapısını kullanmak için herhangi bir obje ekleyelim.

Daha önce sahne eklemeden hiç bahsetmediğim için aşağıda kısa bir anlatım verdim. Zaten biliyorsanız sonraki paragrafa geçebilirsiniz.

File/ New Screne menüsünden ya da CTRL + N tuşlarıyla yeni sahneyi ekleyebilirsiniz. Sahnelerin isimlerini “BirinciSahne” ve “IkinciSahne” olarak belirledim. Unutmayın sahne oluşturduktan sonra CTRL+S diyerek kaydetme aşamasında sahnenize isim verebilirsiniz.

Oluşturduğumuz objeyi “Hierarchy” menüsünden sürükleyerek “Prefabs” klasörümüze sürükleyerek bıraktığımızda objemizin renginin değiştiğini göreceksiniz.

Unity Prefabs Oluşturma

Bu işlemden sonra dikkat etiyseniz yukarıdaki görselin sağ tarafında gözüktüğü gibi “Inspector” penceresinde “Open Prefab” isminde bir buton eklendi. Bu butona tıklarsanız hazır yapı olarak eklediğiniz objeniz için özel bir “Scene” açılacaktır. İşte bu kısımdan objeye özel değişiklikler yaparak tüm sahnelerde değişmesini sağlayabilirsiniz. Örneğin boyutunda, açısında değiştirdiğiniz her değer ya da eklediğiniz her bileşen tüm sahnelerde değişecektir.

Bu ekrandan sahneye dönmek için aşağıda gösterdiğim alandan ok simgesine tıklayabilirsiniz.

Prefabs obje özel ekranı.

Not: Bu alanda birkaç değişiklik yaparsanız otomatik olarak kaydetme özelliği bulunmaktadır.

Şimdi ikinci sahnemize geçerek “Prefabs” klasöründen oluşturduğumuz objeyi sürükleyerek bırakalım. Şimdi elimize iki sahnemiz ve her sahnede hazır yapı olarak eklediğimiz objemiz var.

Şimdi birinci sahnemize gelerek hazır yapı objemizin boyutlarını ve rengini değiştirelim. Yapılan değişiklik sonrasında sağ tarafta “Inspector” alanında yeni bir kısmın eklendiğini görebilirsiniz.

Overrides” seçeneğine tıkladığınızda iki seçenek karşınıza çıkacaktır. Buradan “Apply All” diyerek tüm değişiklikleri tüm objelerde geçerli kılabilir ya da “Revert All” diyerek geri alabilirsiniz. Ayrıca bu pencerede yaptığınız değişiklikleri gösteren ekrandan işlemlerinizi teyit edebilirsiniz.

Unity Prefabs değişikliklerini kaydetme.

Apply All” diyerek tüm ayarları uyguladıktan sonra ikinci sahnemize geçerek kontrol ettiğimizde değişiklikleri uygulandığını görebilirsiniz.

Ayrıca prefabs olarak oluşturduğunuz objenizin içerisine farklı objeler eklerseniz yani hiyerarşik bir yapı kurarsanız da prefabs olarak eklenen tüm sahnelerde değişiklikler gerçekleşecektir.

Tabi aklınıza şu gelmiş olabilir ya da gelmiş olmalı. Peki bir prefabs bir objeniz var ve her sahnede farklı boyutlarda olmasını istiyorsunuz. Bunun için yaptığınız değişikliklerden sonra prefabs ayarlarını kaydetmeyerek sahneyi kaydetmeniz yeterli. Diğer sahneye geçtiğiniz değişikliğin gerçekleşmediğini gözlemleyebilirsiniz.

Prefabs konusunun bu kadar önemli olmasını diğer bir sebebi ise “Instantiate” yani örnekleme konusunda sıklıkça kullanacak olmamız. Şimdi oldukça kritik bir konu olan örneklendirme konusunu inceleyelim.

Instantiate Metodu Kullanımı

Instantiate” yani örneklendirme ile mevcut bir objeyi sahneye yeniden oluşturma ya da klonlama işlemi yapabiliriz. Örneğin oyunumuzun bir aşamasında bir kapıdan geçildiğinde otomatik olarak şu karakter ortaya çıksın istiyorsak “Instantiate” yapısını kullanabiliriz.

“Instantiate” metodu kullanabilmemiz için bir önceki derste incelediğimiz “Prefabs” objemizin olması gerekiyor. Hazır yapılar yani “Prefabs” yardımıyla örneklendirme metodu kullanacağız.

Şimdi yeni bir C# Script dosyası oluşturun ve sahnene de olan yeni objeye script dosyasını atayın. Örnekleyeceğimiz obje için ise bir obje oluşturun ve prefabs klasörüne taşıyarak hazır yapı haline getirin.

Script dosyamızın içine aşağıdaki kodları ekliyoruz. Burada public GameObject dusman; yazarak, dışarıdan “Prefabs” objesi ataması yapmak için “GameObject” türünde bir nesne oluşturduk ve “dusman” ismini verdik. Instantiate(dusman); kalıbını kullanarak da oyunumuz başladığına sahnede yeni bir obje oluşturmasını belirttik.

public class InstantiateKullanimi : MonoBehaviour
{
    public GameObject dusman;
    void Start()
    {
        Instantiate(dusman);
    }
}

Bu işlem sonrasında aşağıdaki videodaki gibi hazır yapı olarak bulunan objenizin sahnede otomatik olarak oluşması gerekiyor.

Videoda fark ettiyseniz sahneye “Instentiate” kullanarak yeni bir obje oluşturursak otomatik olarak bağlı olduğu obje ile aynı konuma geliyor. Şimdi nasıl müdahale edebileceğimizi inceleyelim.

Yeni oluşturulan objenin konumunu ayarlamadan önce bir objenin alt objesi olarak nasıl ekleyeceğimize bir göz atalım.

Aşağıdaki kodu ekleyerek oyununuzu çalıştırırsanız otomatik olarak bağlı olduğu objenin alt objesi haline gelecektir. Instentiate metoduna parametre olarak eklediğimiz “transform” anahtar kelimesiyle “child” duruma yani alt objesi konumuna geç demiş oluyoruz.

public class InstantiateKullanimi : MonoBehaviour
{
    public GameObject dusman;
    void Start()
    {
        Instantiate(dusman, transform);
    }
}

Şimdi ise aşağıdaki kodu çalıştırarak sahneye yeni eklenecek objenin pozisyonu aynı olsun fakat rotasyonu değişmesin diyelim. Kodumuzda transform.position diyerek bağlı olduğu obje ile aynı pozisyonda olmasını ve Quaternion.identity diyerek rotasyon bilgisinin değişmemesini belirtmiş olduk. Bir önceki derste gördüğümüz Quaternion sınıfının identity özelliğini hatırlamıyorsanız aşağıdaki linkten göz atabilirsiniz.

Quaternion.identity özelliği nasıl kullanılır?

public class InstantiateKullanimi : MonoBehaviour
{
    public GameObject dusman;
    void Start()
    {
        Instantiate(dusman, transform.position, Quaternion.identity);
    }
}

Sırada belirli bir konuma taşımak istiyorsak ne yapmamız gerekiyor inceleyelim.

Aşağıdaki kodda new Vector3(2f, 1f, 5f) yazarak, yeni oluşacak objemizin pozisyonunu belirlemek için vektör yapısını kullandık. Böylece objeyi sahnemizde istediğimiz pozisyona taşıyabiliriz.

Eğer derslere sırayla devam etmediyseniz önceki konularımızda incelediğimiz Vector3 Sınıfı dersimize göz atabilirsiniz.

public class InstantiateKullanimi : MonoBehaviour
{
    public GameObject dusman;
    void Start()
    {
        Instantiate(dusman, new Vector3(2f, 1f, 5f), Quaternion.identity);
    }
}

Tabi isterseniz belirli bir objenin belirli bir eksenindeki bilgiyi alsın ama diğer pozisyon bilgilerini ben yazayım isterseniz de aşağıdaki gibi kullanabilirsiniz.

Instantiate(dusman, new Vector3(transform.position.x, 2f, 8f), Quaternion.identity);

Tabi sadece örneklendirme ile yeni bir obje oluşturmakla işimiz bitmeyecektir. Sahnede bir obje oluşturduysak bu objeye müdahale de edebilmeliyiz.

O zaman Instantiate fonksiyonu ile yeni bir obje oluşturduktan sonra GameObject yeniObje = Instantiate(dusman); yazarak GameObject türünde bir nesneye aktarıyoruz. Bu sayede sonrasında yeniObje.GetComponent yazarak istediğimiz bileşene ve özelliklerine erişerek değişiklik gerçekleştirebiliriz.

public class InstantiateKullanimi : MonoBehaviour
{
    public GameObject dusman;
    void Start()
    {
        GameObject yeniObje = Instantiate(dusman);
        yeniObje.GetComponent<BoxCollider>().isTrigger = true;
    }
}

Peki yeni bir obje oluşturduk, pozisyonunu, rotasyonunu belirleyerek özelliklerine eriştik ya objeyi nasıl hareket ettirebiliriz.

“Prefabs” olarak eklediğimiz objenin normal bir objeden hiçbir farkı yok tabi ki. Normal bir objeye ekliyor gibi hazır yapımıza da C# Script dosyası atayarak işlemler gerçekleştirebiliriz.

Örneğin sahnede yeni bir obje oluşsun ve Z ekseni boyunda durmadan hareket etsin isterseniz “Prefabs” objesinin script dosyasına aşağıdaki kodu ekleyebilirsiniz.

public class YeniObjeScript : MonoBehaviour
{
  
    void Update()
    {
        transform.Translate(Vector3.forward);
    }
}