Unity Editöründe Handles.DrawLine ile Görsel Çizimler Yapmak

Unity editöründe geliştirme ve hata ayıklama süreçlerinizi hızlandırmak için Handles.DrawLine kullanarak özel görsel çizimler yapmayı öğrenin. Temel kullanımdan pratik ipuçlarına kadar.

Unity oyun geliştirme sürecinde, bazen sahne görünümünde (Scene View) objelerin davranışlarını, yollarını veya etkileşim alanlarını görselleştirmek isteriz. Bu, hata ayıklama sürecini büyük ölçüde hızlandırır ve oyun içi mantığın daha iyi anlaşılmasına yardımcı olur. İşte tam bu noktada Unity’nin Handles API’si ve özellikle Handles.DrawLine() metodu devreye giriyor. Bu makalede, Unity Handles DrawLine metodunu kullanarak editörde nasıl özel çizimler yapacağınızı, temel kullanımdan ileri seviye ipuçlarına kadar detaylı bir şekilde inceleyeceğiz.

Giriş: Geliştirici Araçları ve Görselleştirme

Bir oyun geliştiricisi olarak, kodunuzu çalıştırdığınızda ne olduğunu görmek istersiniz. Ancak bazen bir karakterin hedef noktasına giden yolu, bir düşmanın görüş alanını veya bir fiziksel objenin hareket yörüngesini doğrudan oyun içinde debug etmek zordur. Unity editöründe sahne görünümünde bu tür bilgileri görselleştirmek, geliştirme sürecini çok daha verimli hale getirir. Handles API’si, editörde özel çizgiler, küpler, küreler ve diğer geometrik şekilleri çizmek için güçlü bir araç setidir.

Handles API’si Nedir?

Handles sınıfı, Unity editörüne özgü görsel çizimler yapmamızı sağlayan statik metotlar içerir. Bu metotlar sadece editörde çalışır ve derlenmiş oyununuzda (runtime) herhangi bir performans etkisi veya görünürlüğü olmaz. Bu, onları hata ayıklama ve geliştirme araçları için ideal kılar. Unity Handles DrawLine, bu API’nin en temel ve en sık kullanılan metotlarından biridir.

Handles.DrawLine() Kullanımının Temelleri

Handles.DrawLine() metodu, sahne görünümünde iki nokta arasında bir çizgi çizmenizi sağlar. Genellikle, bu metodu özel bir editör betiği içinde veya bir MonoBehaviour sınıfının OnSceneGUI() metodunda kullanırsınız. OnSceneGUI(), objeniz seçildiğinde veya her çerçevede sahne görünümü güncellendiğinde çağrılan bir olay metodudur.

Temel Sözdizimi ve Parametreler

Handles.DrawLine() metodunun en basit hali iki adet Vector3 parametresi alır: çizginin başlangıç ve bitiş noktaları.


public static void DrawLine(Vector3 p1, Vector3 p2);

Ancak, çizginin rengini belirlemek için genellikle Handles.color özelliğini kullanırız. Bu özellik statiktir, bu yüzden tüm sonraki Handles çizimlerini etkiler. Genellikle, çizimden önce rengi ayarlar, çizimi yapar ve sonra orijinal renge geri döndürürüz veya başka bir renge ayarlarız.


using UnityEditor;
using UnityEngine;

public class MyLineDrawer : MonoBehaviour
{
    public Transform targetA;
    public Transform targetB;

    void OnDrawGizmos()
    {
        // Gizmos sadece oyun içi veya seçili değilken çalışır. Handles için OnSceneGUI kullanılmalı.
    }

    void OnSceneGUI()
    {
        if (targetA != null && targetB != null)
        {
            // Çizim rengini ayarla
            Handles.color = Color.red;

            // İki transform arasında bir çizgi çiz
            Handles.DrawLine(targetA.position, targetB.position);

            // Çizimin okunabilirliğini artırmak için noktalara küçük küreler çizilebilir
            Handles.SphereHandleCap(0, targetA.position, Quaternion.identity, 0.2f, EventType.Repaint);
            Handles.SphereHandleCap(0, targetB.position, Quaternion.identity, 0.2f, EventType.Repaint);

            // Rengi sıfırlamak iyi bir pratiktir, aksi takdirde diğer Handles çizimleri de kırmızı olabilir.
            Handles.color = Color.white; // Veya varsayılan renge
        }
    }
}

Yukarıdaki kod bloğunu bir MonoBehaviour betiğine ekleyin ve sahnenizdeki herhangi bir GameObject’e iliştirin. Sonra bu GameObject’i seçtiğinizde, targetA ve targetB olarak atadığınız iki Transform objesi arasında kırmızı bir çizgi göreceksiniz. Bu, Unity Handles DrawLine kullanımının en temel örneğidir.

Handles.color ile Renk Yönetimi

Handles.color statik bir özelliktir. Bu, onu değiştirdiğinizde, tüm ardışık Handles çizimlerinin yeni rengi kullanacağı anlamına gelir. Bu yüzden, farklı renklerde birden fazla çizim yapıyorsanız, her çizimden önce veya sonra rengi uygun şekilde ayarlamanız önemlidir. Genellikle, bir çizim bloğunun başında rengi ayarlar, çizimleri yapar ve sonra varsayılan renge (genellikle Color.white) geri döndürürüz.

Orta Seviye Kullanım ve İpuçları

Nesneye Bağımlı Çizimler ve Dönüşümler

Bazen çizgileri dünya koordinatları yerine belirli bir objenin yerel koordinat sistemine göre çizmek isteyebilirsiniz. Bunun için Handles.matrix özelliğini kullanabilirsiniz. Handles.matrix, tüm sonraki Handles çizimlerinin uygulanacağı dönüşüm matrisini belirler.


using UnityEditor;
using UnityEngine;

public class LocalLineDrawer : MonoBehaviour
{
    public float lineLength = 1f;
    public Color lineColor = Color.blue;

    void OnSceneGUI()
    {
        Handles.color = lineColor;

        // Objelerin yerel koordinat sistemine geçiş yap
        Matrix4x4 originalMatrix = Handles.matrix;
        Handles.matrix = transform.localToWorldMatrix;

        // Objelerin yerel sıfır noktasından ileri doğru bir çizgi çiz
        // Bu çizgi objenin yerel Z eksenini temsil eder.
        Handles.DrawLine(Vector3.zero, Vector3.forward * lineLength);

        // Orijinal matrisi geri yükle
        Handles.matrix = originalMatrix;
    }
}

Bu örnekte, GameObject’in yerel Z ekseni boyunca bir çizgi çizildiğini göreceksiniz. GameObject’i döndürdüğünüzde, çizginin de onunla birlikte döndüğünü fark edeceksiniz. Bu, Unity Handles DrawLine ile objeye bağımlı görselleştirmeler yapmak için çok kullanışlıdır.

Yol Çizimleri ve Nokta Dizileri

Tek bir çizgi yerine, bir dizi noktayı birleştiren bir yol çizmek isteyebilirsiniz. Bunu, bir Vector3 dizisi üzerinde döngü yaparak ve her ardışık nokta çifti arasında Handles.DrawLine() çağırarak yapabilirsiniz.


using UnityEditor;
using UnityEngine;
using System.Collections.Generic;

public class PathDrawer : MonoBehaviour
{
    public List<Vector3> pathPoints = new List<Vector3>();
    public Color pathColor = Color.green;

    void OnSceneGUI()
    {
        if (pathPoints == null || pathPoints.Count < 2) return;

        Handles.color = pathColor;

        for (int i = 0; i < pathPoints.Count - 1; i++)
        {
            // Mevcut objenin pozisyonunu referans alarak dünya koordinatlarına çevir
            Vector3 p1 = transform.TransformPoint(pathPoints[i]);
            Vector3 p2 = transform.TransformPoint(pathPoints[i + 1]);
            Handles.DrawLine(p1, p2);

            // Her noktayı küçük bir kare ile işaretle
            Handles.CubeHandleCap(0, p1, Quaternion.identity, 0.1f, EventType.Repaint);
        }
        // Son noktayı da işaretle
        Handles.CubeHandleCap(0, transform.TransformPoint(pathPoints[pathPoints.Count - 1]), Quaternion.identity, 0.1f, EventType.Repaint);

        Handles.color = Color.white;
    }
}

Bu betik, pathPoints listesindeki noktaları birleştirerek bir yol çizer. Editörde bu noktaları manuel olarak ekleyebilir ve bir AI devriye yolu veya bir platformer seviyesindeki hareket yolu gibi şeyleri görselleştirebilirsiniz.

Z-Test ile Görünürlük Kontrolü

Handles.zTest özelliği, çizimlerin sahnedeki diğer geometrinin arkasında mı yoksa önünde mi görüneceğini kontrol etmenizi sağlar. Varsayılan olarak Handles.zTest = Handles.ZTestMode.CompareLess‘tir, yani çizimler diğer objelerin arkasında kaldığında gizlenir. Bunu Handles.ZTestMode.Always olarak ayarlayarak, çizimlerinizin her zaman diğer objelerin önünde görünmesini sağlayabilirsiniz, bu da bazı durumlarda hata ayıklama için daha iyi olabilir.


void OnSceneGUI()
{
    // ... (önceki kodlar)

    Handles.color = Color.magenta;
    Handles.zTest = Handles.ZTestMode.Always; // Her zaman önde göster
    Handles.DrawLine(transform.position, transform.position + Vector3.up * 5f);
    Handles.zTest = Handles.ZTestMode.CompareLess; // Varsayılanı geri yükle

    // ... (sonraki kodlar)
}

Pratik İpuçları

İpucu 1: Her Zaman Handles.color’ı Yönetin

Handles.color statik bir özellik olduğundan, farklı çizimler için farklı renkler kullanıyorsanız veya diğer editör araçlarıyla çakışmasını istemiyorsanız, her çizim bloğundan sonra veya işiniz bittiğinde varsayılan rengi (Color.white) geri yüklemeyi unutmayın. Bu, beklenen görsel tutarlılığı sağlar ve diğer Handles tabanlı araçların yanlış renkte çizim yapmasını engeller.

İpucu 2: OnSceneGUI Dışında Kullanmayın

Handles API’si, özellikle Handles.DrawLine(), sadece editörde ve genellikle OnSceneGUI() metodu içinde çalışacak şekilde tasarlanmıştır. Bu metodu Update(), Start() veya oyunun çalışma zamanında (runtime) çağrılan başka bir metotta kullanmaya çalışırsanız, hiçbir şey çizilmez ve muhtemelen bir hata alırsınız. Bu, Unity Handles DrawLine‘ın temel kısıtlamalarından biridir.

İpucu 3: Performansı Göz Önünde Bulundurun

Editörde bile olsa, çok sayıda karmaşık Handles çizimi yapmak sahne görünümünün performansını düşürebilir. Özellikle her karede yüzlerce veya binlerce çizgi çiziyorsanız, bu durum fark edilir bir gecikmeye neden olabilir. Çizimlerinizi sadece gerektiğinde (örneğin, objeniz seçildiğinde) veya daha az sıklıkta yapmaya çalışın.

İpucu 4: Seçili Objeler İçin Çizim

Çoğu zaman, Handles çizimlerini sadece belirli bir GameObject seçiliyken görmek istersiniz. OnSceneGUI() metodu, betiğin iliştirildiği GameObject seçili olduğunda otomatik olarak çağrılır. Bu, çizimlerinizi belirli bir bağlama oturtmanın doğal bir yoludur. Birden fazla objede aynı betik varsa, her biri seçildiğinde kendi çizimini yapacaktır.

Yaygın Hatalar ve Çözümleri

Çizgiler Neden Görünmüyor?

  • Yanlış Metot: Handles.DrawLine()‘ı OnSceneGUI() yerine OnDrawGizmos() veya başka bir metotta kullanmak. Çözüm: Çizim kodunu OnSceneGUI() içine taşıyın.
  • Objenin Seçili Olmaması: OnSceneGUI() sadece betiğin iliştirildiği GameObject seçili olduğunda çağrılır. Çözüm: İlgili GameObject’i seçtiğinizden emin olun.
  • Sıfır Uzunlukta Çizgi: Başlangıç ve bitiş noktaları aynı ise çizgi görünmez. Çözüm: Noktaların farklı olduğundan emin olun.
  • Kamera Dışı: Çizginin sahne kamerasının görüş alanı dışında olması. Çözüm: Sahne kamerasını çizgiye yaklaştırın.

Renk Sorunları

  • Yanlış Renk: Handles.color‘ı ayarlamayı unutmak veya başka bir araç tarafından rengin değiştirilmesi. Çözüm: Çizimden önce Handles.color‘ı istediğiniz renge ayarlayın ve işiniz bittiğinde varsayılanı geri yükleyin.
  • Çok Benzer Renkler: Çizginin arka plan rengiyle çok benzer olması ve bu yüzden ayırt edilememesi. Çözüm: Kontrastı yüksek renkler kullanın.

Performans Düşüşleri

  • Aşırı Çizim: Her karede çok fazla çizgi veya karmaşık Handles objeleri çizmek. Çözüm: Sadece gerektiğinde çizim yapın, çizim sayısını azaltın veya daha basit görselleştirmeler kullanın.
  • Yanlış Yerleştirme: Handles kodunu sürekli olarak çağrılan bir döngüye yerleştirmek. Çözüm: Çizim mantığını optimize edin, örneğin sadece belirli bir koşul karşılandığında çizim yapın.

Performans ve Optimizasyon Notları

Handles API’si, editörde hızlı görselleştirmeler için tasarlanmıştır. Ancak, özellikle büyük projelerde veya karmaşık sahnelerde, optimizasyon önemlidir. İşte dikkat etmeniz gerekenler:

  • Koşullu Çizim: Tüm objeler için her zaman çizim yapmak yerine, sadece seçili objeler veya belirli bir katmandaki objeler için çizim yapın.
  • Basit Geometriler: Karmaşık üç boyutlu modeller yerine, mümkün olduğunca basit çizgiler, küpler veya küreler kullanın. Unity Handles DrawLine, bu konuda en hafif seçeneklerden biridir.
  • Gereksiz Hesaplamalardan Kaçının: Çizim noktalarını veya renkleri her karede yeniden hesaplamak yerine, eğer değişmiyorlarsa önbelleğe alın.
  • Z-Test Kullanımı: Handles.zTest‘i Always olarak ayarlamak, performansı bir miktar etkileyebilir çünkü Unity’nin derinlik testi yapmasını engeller. Varsayılan CompareLess çoğu durumda daha iyidir.

Sonuç

Handles.DrawLine(), Unity editöründe görsel hata ayıklama ve geliştirme için vazgeçilmez bir araçtır. Bu makalede ele aldığımız temel ve orta seviye kullanımlar, pratik ipuçları ve yaygın hatalar sayesinde, sahne görünümünde kendi özel görselleştirmelerinizi kolayca oluşturabilirsiniz. Unity Handles DrawLine‘ı etkin bir şekilde kullanarak, geliştirme sürecinizi hızlandıracak ve oyunlarınızın iç işleyişini daha iyi anlayacaksınız. Unutmayın, iyi görselleştirmeler, daha hızlı hata ayıklama ve daha iyi bir geliştirme deneyimi anlamına gelir.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir