Unity Eğitim
Dersler
Forum Sınav Merkezi Premium 💎
C# Dersleri

Unity'de Selection.activeGameObject Kullanımı: Editör Geliştirme Rehberi

Paylaşan: Unity Eğitim 07 October 2025 8 dakika okuma 47 görüntülenme

Giriş: Selection.activeGameObject Nedir?

Unity geliştiricileri olarak genellikle oyun dünyamızı sahne (Scene) görünümünde görsel olarak düzenleriz. Nesneleri seçer, taşır, döndürür ve bileşenler ekleriz. Peki ya bu işlemleri programatik olarak, yani kod aracılığıyla yapmak istersek? İşte tam bu noktada Unity'nin Editor Scripting yetenekleri devreye girer. Bu yeteneklerin en temel ve sık kullanılan parçalarından biri de Selection.activeGameObject özelliğidir. Bu makalede, Selection.activeGameObject'in ne olduğunu, nasıl kullanıldığını, pratik ipuçlarını, yaygın hataları ve çözümlerini detaylıca inceleyeceğiz. Bu özellik, Unity Editor'da iş akışınızı hızlandırmak ve özel araçlar geliştirmek için kritik bir öneme sahiptir.

Selection Sınıfı ve activeGameObject Temelleri

Selection Sınıfına Genel Bakış

Unity'nin UnityEditor namespace'i altında yer alan Selection sınıfı, Editor penceresinde (Hierarchy, Project veya Scene görünümleri) o an seçili olan tüm nesneler hakkında bilgi sağlar ve bu seçimi programatik olarak değiştirmeye olanak tanır. Bu sınıf, özellikle Unity Editor Scripting yaparken çok güçlü bir araçtır. Bir Editor script'i yazarken, kullanıcıların neyi seçtiğini bilmek veya belirli bir nesneyi otomatik olarak seçmek isteyebilirsiniz. Selection sınıfı, bu tür senaryolar için tasarlanmıştır.

activeGameObject Özelliği Ne İşe Yarar?

Selection.activeGameObject, Selection sınıfının en sık kullanılan özelliklerinden biridir. Bu özellik, Editör'de *şu anda aktif olan* veya *vurgulanan* tek GameObject'i döndürür. Eğer birden fazla GameObject seçiliyse, activeGameObject genellikle en son seçilen veya fare ile üzerine tıklanarak seçimi başlatan GameObject olur. Eğer hiçbir GameObject seçili değilse, bu özellik null döndürür. Hem okuma hem de yazma (get/set) erişimine sahiptir, yani seçili nesneyi alabilir veya programatik olarak yeni bir nesne seçebilirsiniz.

using UnityEditor;
using UnityEngine;

public class SelectionExample : EditorWindow
{
    [MenuItem("Tools/Selection/Aktif Nesneyi Logla")]
    public static void LogActiveGameObject()
    {
        if (Selection.activeGameObject != null)
        {
            Debug.Log("Aktif olarak seçili nesne: " + Selection.activeGameObject.name);
        }
        else
        {
            Debug.Log("Hiçbir nesne seçili değil.");
        }
    }
}

Yukarıdaki örnek, menüden çağrıldığında o anki aktif nesnenin adını konsola yazdırır. Bu, Unity Editor Scripting ile yapabileceğiniz basit ama etkili bir işlemdir.

activeGameObject ile gameObjects Arasındaki Fark

Selection.activeGameObject, tek bir GameObject'i temsil ederken, Selection.gameObjects (çoğul 's' ile) seçili olan tüm GameObject'lerin bir dizisini (array) döndürür. Eğer birden fazla nesne seçiliyse, activeGameObject dizideki nesnelerden biri olacaktır, genellikle en son etkileşimde bulunulan nesne. Örneğin, Ctrl tuşuna basılı tutarak birden fazla nesne seçtiğinizde, Selection.gameObjects tüm bu nesneleri içeren bir dizi döndürürken, Selection.activeGameObject sadece bu nesnelerden birini (genellikle en son tıklananı) gösterir. Bu ayrımı anlamak, doğru senaryoda doğru özelliği kullanmak için çok önemlidir.

Pratik Kullanım Senaryoları ve İpuçları

Selection.activeGameObject, Unity Editor Scripting yaparken pek çok pratik senaryoda işinize yarar. İşte birkaç ipucu:

İpucu 1: Yeni Oluşturulan Nesneyi Otomatik Seçme

Bir Editor script'i aracılığıyla yeni bir GameObject oluşturduğunuzda, genellikle kullanıcının hemen o nesne üzerinde işlem yapabilmesi için onu otomatik olarak seçmek istersiniz. Selection.activeGameObject özelliğine yeni oluşturulan nesneyi atayarak bunu kolayca yapabilirsiniz.

using UnityEditor;
using UnityEngine;

public class CreateAndSelect : EditorWindow
{
    [MenuItem("Tools/Oluştur ve Seç/Boş Nesne Oluştur")]
    public static void CreateEmptyAndSelect()
    {
        GameObject newGameObject = new GameObject("Yeni Boş Nesne");
        // Yeni oluşturulan nesneyi sahnenin köküne ekle
        newGameObject.transform.SetParent(null);
        
        // Yeni nesneyi aktif olarak seç
        Selection.activeGameObject = newGameObject;
        
        // Odaklanmak için sahne görünümünü yenile (isteğe bağlı)
        EditorApplication.RepaintProjectWindow();
        EditorApplication.RepaintHierarchyWindow();
    }
}

Bu kod bloğu, yeni bir GameObject oluşturur ve hemen ardından onu Unity Editor'da aktif olarak seçili hale getirir.

İpucu 2: Seçili Nesneye Özel İşlemler Yapma

Bir menü öğesi veya özel bir Editor penceresi aracılığıyla, seçili GameObject üzerinde belirli işlemler yapmak isteyebilirsiniz. Örneğin, seçili GameObject'e belirli bir bileşen eklemek veya adını değiştirmek.

using UnityEditor;
using UnityEngine;

public class AddComponentToSelection : EditorWindow
{
    [MenuItem("Tools/Seçiliye Bileşen Ekle/Rigidbody Ekle")]
    public static void AddRigidbodyToActive()
    {
        if (Selection.activeGameObject != null)
        {
            GameObject selectedObject = Selection.activeGameObject;
            if (selectedObject.GetComponent<Rigidbody>() == null)
            {
                Undo.AddComponent<Rigidbody>(selectedObject);
                Debug.Log(selectedObject.name + " nesnesine Rigidbody eklendi.");
            }
            else
            {
                Debug.Log(selectedObject.name + " nesnesinde zaten Rigidbody var.");
            }
        }
        else
        {
            Debug.LogWarning("Lütfen bir GameObject seçin.");
        }
    }
}

Bu örnek, seçili GameObject'e bir Rigidbody bileşeni ekler, eğer zaten yoksa. Undo.AddComponent kullanımı, yaptığımız değişikliğin geri alınabilir olmasını sağlar, bu da Unity Editor Scripting için iyi bir uygulamadır.

İpucu 3: Birden Fazla Seçili Nesne Arasında Aktif Olanı Belirleme

Bazen, kullanıcının birden fazla nesne seçtiği bir durumda, sadece aktif olan nesne üzerinde özel bir işlem yapmak isteyebilirsiniz. Bu durumda hem Selection.gameObjects hem de Selection.activeGameObject özelliklerini birlikte kullanabilirsiniz.

using UnityEditor;
using UnityEngine;

public class MultiSelectionInfo : EditorWindow
{
    [MenuItem("Tools/Seçim Bilgisi/Tüm Seçilileri ve Aktifi Göster")]
    public static void ShowSelectionInfo()
    {
        Debug.Log("\n--- Seçim Bilgisi ---");
        if (Selection.gameObjects.Length > 0)
        {
            Debug.Log("Toplam seçili nesne sayısı: " + Selection.gameObjects.Length);
            foreach (GameObject go in Selection.gameObjects)
            {
                Debug.Log("  Seçili: " + go.name);
            }
        }
        else
        {
            Debug.Log("Hiçbir nesne seçili değil.");
        }

        if (Selection.activeGameObject != null)
        {
            Debug.Log("Aktif olarak vurgulanan nesne: " + Selection.activeGameObject.name);
        }
        else
        {
            Debug.Log("Aktif nesne yok.");
        }
        Debug.Log("---------------------");
    }
}

Bu script, hem tüm seçili nesnelerin listesini hem de aralarından aktif olanı konsola yazdırır. Bu, kullanıcı arayüzü geri bildirimleri veya özel toplu işlem araçları oluştururken faydalıdır.

Yaygın Hatalar ve Çözümleri

1. Null Referans Hataları

En yaygın hata, hiçbir GameObject seçili değilken Selection.activeGameObject'e doğrudan erişmeye çalışmaktır. Bu durumda Selection.activeGameObject null döndüreceği için bir NullReferenceException alırsınız.

Çözüm: Her zaman Selection.activeGameObject'i kullanmadan önce null kontrolü yapın.

if (Selection.activeGameObject != null)
{
    // Güvenli bir şekilde kullanabiliriz
    Debug.Log(Selection.activeGameObject.name);
}
else
{
    Debug.LogWarning("Lütfen bir nesne seçin.");
}

2. Selection.activeGameObject ile Selection.gameObjects Karışıklığı

Birden fazla nesne üzerinde işlem yapmanız gerekirken sadece activeGameObject'i kullanmak veya tam tersi. Bu, beklediğinizden farklı sonuçlar doğurabilir.

Çözüm: İhtiyaçlarınıza göre doğru özelliği seçin. Eğer sadece bir nesne üzerinde işlem yapacaksanız activeGameObject, birden fazla nesne üzerinde döngü kuracaksanız gameObjects kullanın. Unutmayın, gameObjects dizisi boş olabilir, bu yüzden onun da uzunluğunu kontrol edin.

3. Değişikliklerin Kaydedilmemesi (Undo/Redo Desteği)

Unity Editor Scripting ile bir GameObject'i veya bileşenini değiştirdiğinizde, bu değişikliklerin Unity'nin Undo/Redo sistemi tarafından tanınmasını sağlamak önemlidir. Aksi takdirde, kullanıcı Ctrl+Z ile işlemleri geri alamayabilir.

Çözüm: Değişiklik yapmadan önce Undo.RecordObject(targetObject, "Değişiklik Açıklaması") veya Undo.AddComponent(targetObject) gibi Undo sınıfı metodlarını kullanın. Ayrıca, bir GameObject veya bileşen üzerinde yapılan değişiklikleri Unity'ye bildirmek için EditorUtility.SetDirty(targetObject) çağrısını yapmanız gerekebilir, özellikle Inspector penceresinin güncellenmesini istiyorsanız.

// Değişikliği geri alınabilir hale getir
Undo.RecordObject(selectedObject, "Nesnenin Adını Değiştir");
selectedObject.name = "Yeni Ad";
// Editörün bu nesnenin değiştiğini anlamasını sağla
EditorUtility.SetDirty(selectedObject);

Performans ve Optimizasyon Notları

Editor script'leri genellikle oyunun çalışma zamanı performansını etkilemez, çünkü sadece Unity Editor'da çalışırlar. Ancak, çok sayıda GameObject üzerinde döngü yapan veya karmaşık hesaplamalar yapan bir Unity Editor Scripting aracı yazıyorsanız, yine de bazı optimizasyonları göz önünde bulundurmak isteyebilirsiniz:

  • Gereksiz Yeniden Çizimleri Önleyin: Editor pencerelerini veya Hierarchy'yi gereksiz yere EditorApplication.RepaintProjectWindow() gibi metodlarla yeniden çizdirmekten kaçının. Sadece gerçekten ihtiyaç duyulduğunda çağırın.
  • Büyük Veri Kümelerinde Dikkatli Olun: Binlerce nesne üzerinde işlem yapıyorsanız, işleminizi parça parça yapmayı veya kullanıcıya bir ilerleme çubuğu (EditorUtility.DisplayProgressBar) göstermeyi düşünebilirsiniz.
  • Verimli Algoritmalar Kullanın: Oyun geliştirme sırasında olduğu gibi, Editor script'lerinizde de verimli algoritmalar kullanmak önemlidir, özellikle büyük projelerde.

Sonuç

Selection.activeGameObject, Unity Editor'da programatik kontrol sağlamak için vazgeçilmez bir araçtır. Bu özelliği anlayarak ve doğru kullanarak, iş akışınızı büyük ölçüde hızlandırabilir, tekrarlayan görevleri otomatikleştirebilir ve kendinize özel güçlü Editor araçları geliştirebilirsiniz. Unutmayın, Unity Editor Scripting ile yaratıcılığınızın sınırlarını zorlayabilir ve geliştirme sürecinizi çok daha verimli hale getirebilirsiniz. Pratik yaparak ve farklı senaryolarda deneyerek bu güçlü aracın tüm potansiyelini keşfedin.

🧠 Ders Sonu Değerlendirme Testi

Dersi tamamladıktan sonra bilgilerinizi test edin ve ekstra puanlar kazanın.

🔥 +50 XP Ödül
🔒

Sınava Katılmak İçin Giriş Yapın

Bu ders sonu testini çözebilmek, bilginizi test edip **+50 XP** kazanmak ve **Sınav Şampiyonu** rozetinin kilidini açmak için üye girişi yapmalısınız.

Yorumlar (0)

Yorum yazabilmek ve derslere katkıda bulunabilmek için giriş yapmalısınız.

İlk yorumu siz yapın!