Important Classes - GameObject

Unity'nin GameObject sınıfı, Sahne'de var olabilen her şeyi temsil eder.

Bu sayfa, Unity'nin GameObject sınıfıyla kod yazımı ile ilgilidir. Sahne ve Hiyerarşi kullanımı hakkında daha fazla bilgi için Unity Editörü'ndeki GameObject bölümünü kullanıcı kılavuzunda inceleyebilirsiniz. GameObject sınıfının her üyesinin ayrıntılı referansı için GameObject komut dosyası referansına bakınız.

GameObject'ler, Unity'de sahnelerin yapı taşlarıdır ve GameObject'un nasıl göründüğünü ve ne yaptığını belirleyen işlevsel bileşenleri için bir konteyner olarak hareket ederler.

Kod yazımında, GameObject sınıfı size kodunuzda onlarla çalışmanıza olanak sağlayan bir dizi metod sunar. Bu metodlar arasında GameObject'ler arasında bulma, bağlantılar kurma ve mesajlar gönderme, GameObject'lere eklenen bileşenleri ekleme veya kaldırma ve sahnede durumlarıyla ilgili değerleri ayarlama gibi işlemler yer alır.

Sahne Durumu Özellikleri

Sahnedeki bir GameObject'in durumu ile ilgili birçok özelliği değiştirmek için komut dosyaları kullanabilirsiniz. Bu kontroller genellikle Editörde bir GameObject seçtiğinizde inspector'ün üst kısmında görünen kontrollere karşılık gelir.

Bu özellikler herhangi bir belirli bileşenle ilişkili değildir ve bir GameObject'in İzleyici penceresinde, bileşen listesinin üstünde görünürler.

Tipik olarak, Inspector'de görünen bir GameObject. Bu durumda, bir yönlü ışık. Sahne durumu özellikleri kırmızıyla çevrilidir.


Tüm GameObject'lar, sahnedeki GameObject'un durumu ile ilgili üstteki denetimleri paylaşırlar ve bunlar GameObject'in kodlama API'si aracılığıyla kontrol edilebilir.

GameObject sınıfı için kullanılabilir tüm API'ların hızlı bir listesini istiyorsanız, GameObject Komut Dosyası Referansına bakın.

Aktiflik Durumu

Bir GameObject'in Aktiflik durumu


GameObjects varsayılan olarak aktifdir, ancak etkisiz hale getirilebilirler, bu da GameObject'e bağlı tüm bileşenleri kapatır. Bu genellikle onun görünmez hale gelmesi ve Update veya FixedUpdate gibi normal geri çağırma veya olayları almayacağı anlamına gelir.

GameObject'un aktiflik durumu, GameObject'un adının solundaki onay kutusu ile temsil edilir. Bunu GameObject.SetActive kullanarak kontrol edebilirsiniz.

GameObject.activeSelf özelliğini kullanarak bir GameObject'un mevcut aktif durumunu okuyabilirsiniz. GameObject.activeInHierarchy özelliğini kullanarak GameObject'un sahnede gerçekten aktif olup olmadığını okuyabilirsiniz. GameObject.activeInHierarchy, bir GameObject'un gerçekten aktif olup olmadığı, kendi aktiflik durumu ve tüm üst öğelerin aktiflik durumu tarafından belirlendiği için gereklidir. Ebeveynlerinden herhangi biri aktif değilse, kendi aktif ayarına rağmen aktif değildir.

Statiklik Durumu

Bir GameObject'in Statiklik durumu


Bazı Unity sistemleri, Global Illumination, Occlusion, Batching, Navigasyon ve Reflection Probe'lar gibi, bir GameObject'un statik durumuna dayanır. Unity'nin sistemlerinden hangilerinin GameObject'i statik olarak kabul ettiğini belirlemek için GameObjectUtility.SetStaticEditorFlags kullanabilirsiniz. Statik GameObject'lar hakkında daha fazla bilgi edinin.

Etiketler ve Katmanlar

Bir GameObject'in Etiket (Tag) ve Katman (Layer) alanları.


Etiketler, sahnenizdeki GameObject türlerini işaretleme ve tanımlama yolu sağlar ve Katmanlar, rendering veya fizik çarpışmaları gibi belirli yerleşik işlemlerden bazı grupları içeren veya hariç tutan benzer ancak farklı bir yoldur.

Editörde Etiketleri ve Katmanları nasıl kullanılacağı hakkında daha fazla bilgi için Etiketler ve Katmanlar için ana kullanıcı kılavuzu sayfalarına bakın.

GameObject.tag ve GameObject.layer özelliklerini kullanarak komut dosyası yoluyla etiket ve katman değerlerini değiştirebilirsiniz. Etiketin var olup olmadığını doğrulayan ve herhangi bir bellek ayırma yapmayan CompareTag metodunu kullanarak bir GameObject'un etiketini verimli bir şekilde kontrol edebilirsiniz.

Bileşen Ekleme ve Kaldırma

Çalışma zamanında bileşen ekleyebilir veya kaldırabilirsiniz, bu, GameObject'lar oluşturmayı veya bir GameObject'un davranışını değiştirmeyi sağlar. Not olarak, bunları yok etmeden komut dosyası bileşenleri ve bazı türdeki yerleşik bileşenleri de etkinleştirebilir veya devre dışı bırakabilirsiniz.

Çalışma zamanında bir bileşen eklemenin en iyi yolu AddComponent<Type> kullanmaktır, bileşenin türünü açı köşeli parantezler içinde belirterek. Bir bileşeni kaldırmak için, bileşenin kendisine Object.Destroy metodunu kullanmanız gerekmektedir.

Bileşenlere erişim

En basit durum, bir GameObject üzerindeki bir komut dosyasının aynı GameObject'e bağlı başka bir Bileşene erişmesi gerektiğidir (hatırlayın, bir GameObject'e bağlı diğer komut dosyaları da kendileri Bileşenlerdir). Bunun için ilk adım, çalışmak istediğiniz Bileşen örneğine bir referans elde etmektir. Bu, GetComponent metoduyla yapılır. Genellikle, Bileşen nesnesini bir değişkene atamak istersiniz ve bunu aşağıdaki kod kullanılarak yaparsınız. Bu örnekte, komut dosyası aynı GameObject üzerindeki bir Rigidbody bileşenine bir referans alıyor:

void Start ()
{
    Rigidbody rb = GetComponent<Rigidbody>();
}


Bir Bileşen örneğine bir referans aldıktan sonra, onun özelliklerinin değerlerini, Inspector'de olduğu gibi ayarlayabilirsiniz:

void Start ()
{
    Rigidbody rb = GetComponent<Rigidbody>();

    // Rigidbody'in kütlesini değiştir.
    rb.mass = 10f;
}


Ayrıca, Bileşen referansı üzerinde metodlar da çağırabilirsiniz, örneğin:

void Start ()
{
    Rigidbody rb = GetComponent<Rigidbody>();

    // Rigidbody'e bir kuvvet ekle.
    rb.AddForce(Vector3.up * 10f);
}


Not: Aynı GameObject'e birden fazla özel komut dosyası ekleyebilirsiniz. Bir komut dosyasından başka bir komut dosyasına erişmeniz gerekiyorsa, her zamanki gibi GetComponent'i kullanabilir ve sadece Bileşeni belirtmek için komut dosyası sınıfının adını (veya dosya adını) kullanabilirsiniz.

Eğer GameObject'e henüz eklenmemiş bir Bileşen türünü almayı denerseniz, GetComponent null döndürecektir; null bir nesne üzerinde herhangi bir değeri değiştirmeye çalışırsanız çalışma zamanında null referans hatası alırsınız.

Diğer GameObject'lerdeki bileşenlere erişme

Bazen yalnız çalışsa da, komut dosyalarının diğer GameObject'leri izlemesi veya daha yaygın olarak diğer GameObject'lerdeki bileşenleri takip etmesi yaygındır. Örneğin, bir pişirme oyununda, bir aşçının ocak pozisyonunu bilmesi gerekebilir. Unity, diğer nesneleri almanın farklı yollarını sağlar, her biri belirli durumlara uygun.

İzleyicide GameObject'lere bağlantılar

İlgili bir GameObject bulmanın en doğrudan yolu, komut dosyasına bir halka açık GameObject değişkeni eklemektir:

public class Chef : MonoBehaviour
{
    public GameObject stove;

    // Diğer değişkenler ve işlevler...
}


Bu değişken, Inspector'da bir GameObject alanı olarak görünecektir.

Artık sahnedeki veya Hiyerarşi panelindeki bir nesneyi bu değişkene sürükleyerek atayabilirsiniz.

Proje penceresinden bir Prefab'ı Inspector penceresindeki bir GameObject alanına sürükleyerek atayabilirsiniz.


GetComponent işlevi ve bileşen erişim değişkenleri bu nesne için diğerlerinde olduğu gibi kullanılabilir, bu nedenle aşağıdaki gibi kodları kullanabilirsiniz:

public class Chef : MonoBehaviour {
    public GameObject stove;

    void Start() {
        // Şefi ocaktan 2 birim ileride başlat.
        transform.position = stove.transform.position + Vector3.forward * 2f;
    }
}


Ayrıca, komut dosyasında bir Bileşen türünde bir genel değişken bildirirseniz, bu Bileşeni içeren herhangi bir GameObject'i üzerine sürükleyebilirsiniz. Bu, doğrudan Bileşene erişmenizi sağlar, GameObject'in kendisine değil.

public Transform playerTransform;


Değişkenler aracılığıyla nesneleri birleştirmek, genellikle kalıcı bağlantılara sahip bireysel nesnelerle çalıştığınızda en kullanışlı olandır. Aynı türdeki birkaç nesneyi birleştirmek için bir dizi değişkeni kullanabilirsiniz, ancak bağlantılar hala Unity editöründe yapılmalıdır ve çalışma zamanında gerçekleştirilemez. Nesneleri çalışma zamanında yerini tespit etmek genellikle pratik olur ve Unity, bunu yapmanın iki temel yolunu sağlar, aşağıda açıklandığı gibi.

Çocuk GameObject'leri Bulma

Bazı oyun Sahneleri, koleksiyon öğeleri, yol işaretleri ve engeller gibi aynı türden birçok GameObject kullanabilir. Bu tür öğeler, özellikle onları denetleyen veya tepki gösteren bir komut dosyası tarafından izlenmesi gerekebilir (örneğin, tüm yol işaretleri, yol bulma komut dosyası için erişilebilir olmalıdır). Bu GameObject'leri bağlamak için değişkenler kullanmak mümkündür, ancak her yeni yol işareti için bir değişkeni komut dosyasına sürüklemek tasarım sürecini sıkıcı hale getirir. Aynı şekilde, bir yol işareti silindiğinde, eksik GameObject için değişken referansını kaldırmak uğraştırıcı olabilir. Bu tür durumlarda, tüm GameObject'leri bir üst GameObject'in çocukları yaparak yönetmek genellikle daha iyidir. Çocuk GameObject'ler, üst GameObject'in Transform bileşeni kullanılarak alınabilir (çünkü tüm GameObject'lerin varsayılan olarak bir Transform'u vardır):

using UnityEngine;

public class WaypointManager : MonoBehaviour {
    public Transform[] waypoints;

    void Start()
    {
        waypoints = new Transform[transform.childCount];
        int i = 0;

        foreach (Transform t in transform)
        {
            waypoints[i++] = t;
        }
    }
}


Belirli bir çocuk nesneyi de adıyla bulabilirsiniz, bunun için Transform.Find metodunu kullanabilirsiniz: transform.Find("Frying Pan");

Bu, oyun sırasında eklenip çıkarılabilen bir çocuk GameObject'e sahip olan durumlarda faydalı olabilir. Oyun sırasında alınıp bırakılabilen bir araç veya mutfak gereci buna iyi bir örnektir.

Mesaj Gönderme ve Yayınlama

Projenizi düzenlerken, Inspector aracılığıyla GameObject'ler arasında referanslar oluşturabilirsiniz. Ancak bazen bunları önceden ayarlamak imkansız olabilir (örneğin, oyununuzda bir karakterin en yakın öğeyi bulması veya Sahnenin yüklenmesinden sonra oluşturulan GameObject'lere referans oluşturması gerekebilir). Bu durumlarda, GameObject'ler arasında referanslar bulabilir ve çalışma zamanında mesajlar gönderebilirsiniz.

BroadcastMessage, adı belirtilmiş bir metoda çağrı yapmanıza olanak tanır ve bu metodun nerede uygulanması gerektiği konusunda spesifik olmanıza gerek yoktur. Belirli bir GameObject üzerindeki her MonoBehaviour'a veya çocuklarından herhangi birine adı belirtilmiş bir metodu çağırmak için kullanabilirsiniz. İsteğe bağlı olarak en az bir alıcı olması gerektiğini belirleyebilirsiniz (aksi takdirde bir hata oluşturulur).

SendMessage biraz daha spesifiktir ve yalnızca çağrıyı GameObject'in kendisine, çocuklarına değil, sadece belirtilmiş bir metoda gönderir.

SendMessageUpwards ise benzer şekilde, çağrıyı GameObject ve tüm ebeveynlerine adı belirtilmiş bir metoda gönderir.

Adı veya Etiketiyle GameObject'leri Bulma

Herhangi bir bilgiye sahip olduğunuz sürece, Sahne hiyerarşisindeki GameObject'leri bulmak her zaman mümkündür. Bireysel nesneler, GameObject.Find işlevi kullanılarak adlarına göre alınabilir:

GameObject player;
void Start()
{
    player = GameObject.Find("MainHeroCharacter");
}


Bir nesne veya nesne koleksiyonu, GameObject.FindWithTag ve GameObject.FindGameObjectsWithTag metodları kullanılarak etiketleriyle de bulunabilir.

Örneğin, mutfakta bir şef karakteri ve (her biri "Fırın" olarak etiketlenmiş) birden çok ocak olan bir yemek pişirme oyununda:

GameObject chef;
GameObject[] stoves;
void Start()
{
    chef = GameObject.FindWithTag("Chef");
    stoves = GameObject.FindGameObjectsWithTag("Stove");
}


GameObject'lerin Oluşturulması ve Yok Edilmesi

Projeniz çalışırken GameObject'ler oluşturabilir ve yok edebilirsiniz. Unity'de bir GameObject, varolan bir nesnenin yeni bir kopyasını oluşturmak için Instantiate metodu kullanılarak oluşturulabilir.

GameObject'leri nasıl instantiate edilir konusunda tam bir açıklama ve örnekler için, Çalışma Zamanında Prefab'lar Oluşturma başlığına bakınız.

Destroy metodu, bir nesneyi çerçeve güncellemesi tamamlandıktan sonra veya isteğe bağlı olarak kısa bir zaman gecikmesinden sonra yok eder:

void OnCollisionEnter(Collision otherObj) 
{
    if (otherObj.gameObject.tag == "Garbage can") 
    {
        Destroy(gameObject, 0.5f);
    }
}


Unutmayın ki Destroy işlevi, tekil bileşenleri yok edebilir ve GameObject'i etkilemez. Yaygın bir hata, this yazıp komut dosyasının bağlı olduğu GameObject'i yok edeceğini varsaymaktır:

Destroy(this);


this, komut dosyasını temsil eder ve GameObject'i değil. Aslında, yalnızca onu çağıran komut dosyasının bileşenini yok eder ve GameObject'i, ancak komut dosyası bileşeni kaldırılmış olarak bırakır.

Primitive (Basit) Nesneler

GameObject sınıfı, Unity'nin GameObject menüsünde mevcut olan seçeneklere alternatif olarak, komut dosyası tabanlı seçenekler sunar ve basit nesneler oluşturmanıza olanak tanır.

Unity'nin dahili basit nesnelerinden örnekler oluşturmak için GameObject.CreatePrimitive kullanın. Bu, belirttiğiniz türde bir basit nesne oluşturur. Kullanılabilir basit nesne türleri Sphere, Capsule, Cylinder, Cube, Plane ve Quad'dir.

Unity'nin GameObject menüsünde mevcut olan Basit şekiller

Bu blog Unity Docs'un Türkçeye çevrilmiş halidir.

Yorumlar

Bu blogdaki popüler yayınlar

Important Classes - Vectors

RequireComponent