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

Unity Handles.DrawWireCube() ile Sahne İçi Görselleştirmeler

Paylaşan: Unity Eğitim 28 December 2025 9 dakika okuma 174 görüntülenme

Unity oyun motoru, geliştiricilere sadece oyun içi nesneleri değil, aynı zamanda editör içinde görsel hata ayıklama ve tasarım araçları oluşturma imkanı da sunar. Bu araçlardan biri de Handles sınıfıdır. Özellikle Handles.DrawWireCube() metodu, sahne üzerinde belirli alanları, sınırları veya referans noktalarını görselleştirmek için paha biçilmez bir yardımcıdır.

Bu makalede, Unity Handles sınıfının ne olduğunu, DrawWireCube() metodunun nasıl kullanıldığını, pratik ipuçlarını, yaygın hataları ve performans notlarını detaylı bir şekilde inceleyeceğiz. Amacımız, Unity editöründe daha etkili hata ayıklama ve geliştirme süreçleri için size yol göstermektir.

Unity Handles ve DrawWireCube Temelleri

Unity'deki Handles sınıfı, editör komut dosyaları (Editor Scripts) ve özel denetçiler (Custom Inspectors) yazarken sahne görünümünde çizim yapmak için kullanılan bir araç setidir. Bu araçlar, geliştiricilerin oyun içi nesneleri seçme, taşıma, döndürme ve ölçeklendirme gibi editör manipülasyonlarına benzer görsel geri bildirimler oluşturmasına olanak tanır. Handles sınıfı, UnityEditor namespace'i altında yer alır, bu da onu sadece editör ortamında kullanabileceğiniz anlamına gelir.

Handles.DrawWireCube() Nedir?

Handles.DrawWireCube() metodu, adından da anlaşılacağı gibi, sahne üzerinde belirtilen bir merkez noktası ve boyuta sahip tel kafes bir küp çizer. Bu küp, oyunun kendisinde görünmez; yalnızca Unity editörünün Scene View (Sahne Görünümü) penceresinde görünür olur. Bu özellik, özellikle oyun geliştirme sırasında belirli alanların veya sınırların görselleştirilmesi gerektiğinde çok faydalıdır.

Metodun temel kullanımı şu şekildedir:

public static void DrawWireCube(Vector3 center, Vector3 size);
  • center: Küpün merkez noktasının dünya koordinatlarındaki konumu.
  • size: Küpün X, Y ve Z eksenlerindeki boyutları.

Unity Handles ile çizim yaparken en önemli noktalardan biri, bu çizimlerin ne zaman gerçekleştiğidir. Handles sınıfı ile çizimler genellikle, Editor sınıfından türetilmiş bir özel denetçinin veya bir EditorWindow'un içinde yer alan OnSceneGUI() metodunda yapılır. Bu metod, sahne görünümü her güncellendiğinde çağrılır ve bu sayede çizimleriniz dinamik olarak yenilenir.

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(MyCustomObject))]
public class MyCustomObjectEditor : Editor
{
    protected virtual void OnSceneGUI()
    {
        MyCustomObject myObject = (MyCustomObject)target;

        // Küpün rengini ayarla
        Handles.color = Color.red;

        // Belirtilen merkez ve boyutta bir tel kafes küp çiz
        Handles.DrawWireCube(myObject.transform.position, myObject.customSize);

        // İsteğe bağlı: Küpün etrafına bir etiket ekle
        Handles.Label(myObject.transform.position + Vector3.up * (myObject.customSize.y / 2 + 0.5f), "Özel Alan");
    }
}

Yukarıdaki örnekte, MyCustomObject adlı bir MonoBehaviour için özel bir denetçi oluşturduk ve bu denetçi içinde OnSceneGUI() metodunu kullanarak nesnenin konumunda ve özel bir boyutta kırmızı bir tel kafes küp çizdik.

Neden Handles.DrawWireCube() Kullanmalıyız? (Gizmos'tan Farkı)

Unity'de benzer görselleştirmeler için Gizmos.DrawWireCube() de mevcuttur. Peki, Unity Handles'ı neden tercih etmeliyiz? Temel farklar şunlardır:

  • Etkileşim: Handles, kullanıcı etkileşimine (seçim, sürükleme) izin veren araçlar (örneğin, Handles.PositionHandle) oluşturmak için tasarlanmıştır. Gizmos ise genellikle statik görselleştirmeler içindir.
  • Kontrol: Handles ile çizim yaparken, çizimlerin ne zaman ve nasıl görüneceği üzerinde daha fazla kontrolünüz vardır. Örneğin, sadece belirli bir nesne seçiliyken çizim yapmak mümkündür.
  • Koordinat Sistemi: Handles, Handles.matrix kullanarak çizimlerin global veya yerel koordinat sistemlerinde yapılmasını kolayca ayarlamanızı sağlar.
  • Performans: Her ikisi de sadece editörde çalışır ve oyunun çalışma zamanı performansını etkilemez. Ancak Handles genellikle daha karmaşık editör araçları için tercih edilir.

Pratik İpuçları

1. Tetikleyici ve Çarpıştırıcı Sınırlarını Görselleştirme

Birçok oyunda, tetikleyiciler (triggers) veya çarpıştırıcılar (colliders) belirli alanları temsil eder. Ancak bu bileşenler varsayılan olarak editörde tam boyutlarıyla görünmeyebilir (özellikle Is Trigger işaretli BoxCollider'lar). Handles.DrawWireCube() kullanarak bunları daha net bir şekilde görselleştirebilirsiniz.

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(BoxCollider))]
public class BoxColliderVisualizer : Editor
{
    protected virtual void OnSceneGUI()
    {
        BoxCollider collider = (BoxCollider)target;
        if (collider == null) return;

        // Küpün rengini ve kalınlığını ayarla
        Handles.color = collider.isTrigger ? Color.cyan : Color.green;
        Handles.matrix = Matrix4x4.TRS(collider.transform.position, collider.transform.rotation, collider.transform.lossyScale);

        // Yerel koordinatlarda küpü çiz
        Handles.DrawWireCube(collider.center, collider.size);

        Handles.matrix = Matrix4x4.identity; // Matrisi sıfırla
    }
}

Bu kod bloğu, BoxCollider'lar için özel bir editör oluşturur ve tetikleyici olup olmamasına göre farklı renklerde tel kafes küp çizer. Handles.matrix kullanarak küpü doğru transformasyonla çizdiğimize dikkat edin.

2. Özel Alanları ve Bölgeleri İşaretleme

Oyununuzda düşman spawn noktaları, görev alanları, etkileşim bölgeleri veya belirli efektlerin uygulanacağı alanlar gibi özel bölgeler tanımlamanız gerekebilir. Bu bölgeleri görselleştirmek, seviye tasarımcıları için büyük kolaylık sağlar.

using UnityEditor;
using UnityEngine;

public class CustomAreaMarker : MonoBehaviour
{
    public Vector3 areaCenter = Vector3.zero;
    public Vector3 areaSize = new Vector3(5, 5, 5);
    public Color areaColor = Color.yellow;
}

[CustomEditor(typeof(CustomAreaMarker))]
public class CustomAreaMarkerEditor : Editor
{
    protected virtual void OnSceneGUI()
    {
        CustomAreaMarker marker = (CustomAreaMarker)target;
        if (marker == null) return;

        Handles.color = marker.areaColor;
        
        // MonoBehaviour'ın transformunu kullanarak küpü çiz
        Vector3 worldCenter = marker.transform.TransformPoint(marker.areaCenter);
        Vector3 worldSize = Vector3.Scale(marker.areaSize, marker.transform.lossyScale);

        Handles.DrawWireCube(worldCenter, worldSize);

        // İsteğe bağlı: Küpün merkezini sürükleyebilir hale getir
        marker.areaCenter = marker.transform.InverseTransformPoint(
            Handles.PositionHandle(worldCenter, Quaternion.identity)
        );
    }
}

Bu örnek, CustomAreaMarker bileşenine sahip nesneler için editörde sarı bir tel kafes küp çizer ve hatta Handles.PositionHandle() kullanarak bu alanın merkezini sahne içinde sürükleyerek değiştirebilme imkanı sunar. Bu, Unity Handles'ın interaktif gücünü gösterir.

3. Etkileşimli Seçim Alanları Oluşturma

Bazen editörde birden fazla nesneyi kapsayan, görsel olarak belirgin bir seçim veya etkileşim alanı oluşturmak isteyebilirsiniz. Handles.DrawWireCube() bu tür alanları tanımlamak için mükemmeldir. Örneğin, bir RTS oyununda birimlerin seçileceği alanı görselleştirebilirsiniz.

using UnityEditor;
using UnityEngine;

public class SelectionZone : MonoBehaviour
{
    public Vector3 extents = new Vector3(10, 1, 10);
    public Color zoneColor = Color.blue;
}

[CustomEditor(typeof(SelectionZone))]
public class SelectionZoneEditor : Editor
{
    protected virtual void OnSceneGUI()
    {
        SelectionZone zone = (SelectionZone)target;
        if (zone == null) return;

        Handles.color = zone.zoneColor;

        Vector3 center = zone.transform.position;
        Vector3 size = zone.extents * 2; // extents, merkeze olan mesafedir, size ise toplam boyuttur.

        // Küpü çiz
        Handles.DrawWireCube(center, size);

        // Handle'lar ile boyutları değiştirebilme (örneğin, köşe sürükleyiciler)
        // Bu kısım daha karmaşık Handles API'leri gerektirebilir, DrawWireCube sadece görselleştirir.
        // Ancak DrawWireCube bu tür bir arayüzün temel görselini sağlamak için kullanılabilir.
    }
}

Bu kod ile, SelectionZone bileşenine sahip nesneler, sahne görünümünde mavi bir tel kafes küp ile temsil edilir. Bu sayede tasarımcılar, seçim alanının nerede olduğunu ve ne kadar büyük olduğunu kolayca görebilirler.

Yaygın Hatalar ve Çözümleri

1. OnSceneGUI() Dışında Kullanmak

Hata: Handles.DrawWireCube() veya diğer Handles metodlarını bir MonoBehaviour'un Update(), Start() veya OnDrawGizmos() gibi metodlarında kullanmaya çalışmak.

Çözüm: Handles sınıfı, yalnızca editörde çalışmak üzere tasarlanmıştır. Çizimlerinizin görünür olması için bu metodları UnityEditor.Editor sınıfından türetilmiş bir özel denetçinin OnSceneGUI() metodunda veya bir EditorWindow içinde kullanmanız gerekir. Aksi takdirde çizimleriniz hiçbir zaman görünmeyecektir.

2. Koordinat Sistemini Yanlış Anlamak

Hata: Küpün konumunun veya boyutunun beklediğiniz gibi görünmemesi, özellikle nesnenin transformasyonuna göre.

Çözüm: Handles.DrawWireCube() metoduna ilettiğiniz center ve size değerleri, varsayılan olarak dünya koordinatlarındadır. Eğer bir nesnenin yerel koordinatlarındaki bir küpü çizmek istiyorsanız, Handles.matrix özelliğini kullanmalısınız. Handles.matrix = transform.localToWorldMatrix; şeklinde ayarlayarak, sonraki tüm Handles çizimlerinin bu nesnenin yerel koordinat sistemine göre yapılmasını sağlayabilirsiniz. İşiniz bittiğinde Handles.matrix = Matrix4x4.identity; ile matrisi sıfırlamayı unutmayın.

3. Renk veya Kalınlık Ayarlarını Unutmak

Hata: Çizilen küpün varsayılan beyaz renkte veya çok ince görünmesi ve diğer çizimlerle karışması.

Çözüm: Çizimden önce Handles.color özelliğini istediğiniz renge ayarlayın (örneğin, Handles.color = Color.blue;). Ayrıca, çizimlerin kalınlığını ayarlamak için Handles.DrawWireCube() doğrudan bir parametre sunmasa da, Handles.zTest veya Handles.SetDiscRenderMode() gibi diğer Handles metodlarıyla birlikte kullanarak daha belirgin çizimler elde edebilirsiniz. Daha kalın çizgiler için genellikle birden fazla DrawWireCube çağrısı (biraz farklı boyutlarla) veya özel shader'lar gerekir, ancak çoğu durumda renk değişimi yeterlidir.

Performans ve Optimizasyon Notları

Handles sınıfı ve dolayısıyla Handles.DrawWireCube() metodu, yalnızca Unity editöründe çalışır. Bu, oyununuzun derlenmiş sürümünde veya çalışma zamanında hiçbir kodunun çalışmadığı anlamına gelir. Dolayısıyla, bu metodların oyunun performansına sıfır etkisi vardır.

Ancak, editör içinde OnSceneGUI() metodu her karede (veya sahne görünümü her güncellendiğinde) çağrıldığı için, bu metodun içinde çok karmaşık veya yoğun hesaplamalar yapmaktan kaçınmak önemlidir. Aşırı karmaşık Handles çizimleri, editörün yanıt verme süresini yavaşlatabilir. Genel olarak, basit tel kafes küpler çizmek için DrawWireCube() kullanmak performansa dikkate değer bir etki yapmayacaktır.

Sonuç

Handles.DrawWireCube() metodu, Unity geliştiricilerinin editörde daha anlamlı görsel geri bildirimler oluşturması için güçlü ve esnek bir araçtır. Nesnelerin sınırlarını, özel alanları veya etkileşim bölgelerini net bir şekilde görselleştirerek, hata ayıklama süreçlerinizi hızlandırabilir ve seviye tasarımınızı daha verimli hale getirebilirsiniz. Unity Handles'ın sunduğu bu imkanları keşfetmek, Unity ile geliştirme deneyiminizi kesinlikle zenginleştirecektir. Unutmayın, bu araçlar sadece sizin için var ve onları doğru kullanarak geliştirme sürecinizi optimize edebilirsiniz.

🧠 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!