Unity URP X-Ray: Duvar Arkasını Görme Tekniği

Unity URP Render Objects kullanarak oyunlarınızda duvar arkası objeleri gösterme (X-Ray) efektini nasıl oluşturacağınızı öğrenin. Detaylı rehberimizle oyunlarınıza stratejik derinlik katın.

Oyun dünyasında stratejik avantaj sağlamak veya hikaye anlatımına derinlik katmak için kullanılan “duvar arkasını görme” ya da “X-Ray” efekti, oyunculara gizli düşmanları, önemli objeleri veya geçitleri görme imkanı sunar. Unity’nin Universal Render Pipeline (URP) ile bu tür gelişmiş görsel efektleri oluşturmak, Render Objects gibi güçlü özellikler sayesinde artık çok daha erişilebilir. Bu makalede, URP Render Objects kullanarak oyunlarınızda duvar arkasındaki objeleri nasıl göstereceğinizi adım adım öğrenecek ve kendi X-Ray sisteminizi kuracaksınız.

URP ve Render Özellikleri: Temeller

Universal Render Pipeline (URP), Unity’nin performans odaklı ve özelleştirilebilir bir render pipeline’ıdır. Mobil, konsol ve PC gibi farklı platformlarda yüksek performans sunarken, geliştiricilere render süreçleri üzerinde daha fazla kontrol sağlar. URP’nin en güçlü yanlarından biri, render pipeline’ına özel render pass’lar veya efektler eklemenizi sağlayan “Render Özellikleri” (Render Features) mekanizmasıdır. X-Ray efekti gibi karmaşık görsel teknikler, bu özellikler aracılığıyla kolayca entegre edilebilir.

Render Özellikleri, sahnenin renderlanma aşamasına müdahale etmenizi sağlar. Örneğin, belirli objeleri farklı bir materyalle veya farklı bir render sırasıyla çizmek isteyebilirsiniz. X-Ray efektinde tam da bunu yapacağız: normalde görünmeyen objeleri, özel bir materyal ve render sırası ile duvarların üzerinden görünür kılacağız.

X-Ray Efekti İçin Render Objects Kullanımı

URP’deki “Render Objects” özelliği, belirli kriterlere uyan (katman, etiket vb.) objeleri seçip, onları özel bir materyal ile farklı bir render pass’te çizmenizi sağlar. Bu, X-Ray efektimiz için mükemmel bir araçtır.

Adım 1: URP Projesi Oluşturma ve Ayarları Yapılandırma

Öncelikle Unity’de bir URP projesi oluşturduğunuzdan veya mevcut projenizi URP’ye geçirdiğinizden emin olun. Projenizde bir URP Asset’i (Project Settings > Graphics altında veya Assets > Create > Rendering > URP Asset yoluyla oluşturulabilir) ve bu asset’e bağlı bir Render Data Asset’i (Assets > Create > Rendering > URP Renderer) bulunmalıdır. Bu Render Data Asset’ini seçerek Inspector panelinde ayarlarını görebilirsiniz.

X-Ray ile görünmesini istediğiniz objeler için özel bir Layer (Katman) oluşturun. Örneğin, “XRayObjects” adında bir katman oluşturabilirsiniz. Bu objelerin normal render sürecinde görünmesini istemiyorsanız, varsayılan render ayarlarınızda bu katmanı görmezden gelebilirsiniz; ancak X-Ray efektiyle görüneceklerdir.

Adım 2: Render Objects Feature Oluşturma

Şimdi Render Data Asset’inize bir Render Objects Feature ekleyeceğiz:

  1. Project penceresinde, URP Renderer Data Asset’inize sağ tıklayın (genellikle “UniversalRendererData” olarak adlandırılır) ve Create > Rendering > URP Renderer Feature > Render Objects yolunu izleyerek yeni bir Render Objects Feature oluşturun. Bu yeni özelliği “XRayRenderObjects” olarak adlandırabilirsiniz.
  2. Bu yeni özelliği, URP Renderer Data Asset’inizin Inspector panelindeki “Add Renderer Feature” düğmesine tıklayarak listeye ekleyin.

Adım 3: Render Objects Feature Ayarlarını Yapılandırma

Oluşturduğunuz “XRayRenderObjects” özelliğini seçin ve Inspector panelindeki ayarlarını yapılandırın:

  • Name: “XRayRenderObjects” (isteğe bağlı, daha açıklayıcı bir isim verebilirsiniz)
  • Event: Bu, objelerin render sırasını belirler. X-Ray objelerinin duvarların üzerinden görünmesini istediğimiz için, normalde renderlanan her şeyden sonra ama muhtemelen post-processing efektlerinden önce çizilmeleri gerekir. Genellikle After Rendering Transparents veya Before Rendering Post Processing uygun seçeneklerdir.
  • Filters > Layers: Buradan, X-Ray efekti ile görünmesini istediğiniz “XRayObjects” katmanını seçin.
  • Filters > Render Queue: Varsayılan değerleri bırakabilirsiniz.
  • Overrides > Material: Burası çok önemli. X-Ray objeleri için özel bir materyal atayacağız. Henüz oluşturmadık, ancak bir sonraki adımda yapacağız.
  • Overrides > Depth: X-Ray efektinin duvarların arkasından görünmesi için, derinlik testini kapatmamız veya değiştirmemiz gerekir. Depth Test ayarını Always olarak ayarlayarak objelerin derinlikten bağımsız olarak her zaman çizilmesini sağlayabilirsiniz. Ayrıca Depth Write ayarını Off olarak ayarlayarak bu objelerin sahnenin derinlik arabelleğini değiştirmesini engelleyebilirsiniz.

Adım 4: X-Ray Materyali ve Shader Oluşturma

Şimdi X-Ray efekti için özel bir materyal ve bu materyalin kullanacağı bir shader oluşturmamız gerekiyor. Bu shader, objeyi farklı bir renkte, saydam veya ana hatlarıyla (outline) çizebilir.

  1. Shader Oluşturma: Project penceresinde sağ tıklayın ve Create > Shader > URP > Unlit Shader Graph yolunu izleyerek yeni bir Shader Graph oluşturun. Adını “XRayShader” olarak belirleyin. Shader Graph’i açın.
  2. Shader Graph İçeriği:
    • Bir Color node’u ekleyin ve X-Ray rengini (örneğin parlak yeşil veya mavi) ayarlayın.
    • Bu Color node’unu Fragment Shader‘ın Base Color girişine bağlayın.
    • Graph Settings panelinde (sol üstte), Surface ayarını Transparent olarak değiştirin.
    • Alpha girişine bir Float veya Slider node’u bağlayarak saydamlık kontrolü ekleyebilirsiniz.
    • Derinlik testi ve yazma ayarlarını doğrudan shader’da da yapabiliriz, ancak Render Objects Feature’daki ayarlar genellikle daha pratik ve genel geçer bir çözüm sunar.
    • Kaydedin ve Shader Graph’i kapatın.
  3. Materyal Oluşturma: Project penceresinde sağ tıklayın ve Create > Material yolunu izleyin. Adını “XRayMaterial” olarak belirleyin. Inspector panelinde, bu materyalin Shader’ını az önce oluşturduğunuz “XRayShader” olarak ayarlayın. Materyalin rengini ve saydamlığını buradan ayarlayabilirsiniz.

Adım 5: Materyali Render Objects Feature’a Atama

Geri dönüp “XRayRenderObjects” özelliğini seçin. Overrides > Material bölümüne, az önce oluşturduğunuz “XRayMaterial”i sürükleyip bırakın.

Adım 6: Objeleri Yapılandırma

Sahnenizdeki X-Ray efektiyle görünmesini istediğiniz tüm objeleri seçin ve Inspector panelindeki Layer (Katman) açılır menüsünden “XRayObjects” katmanını atayın. Artık bu objeler duvarların arkasından, belirlediğiniz X-Ray efektiyle görünmelidir.

Gelişmiş İpuçları ve Optimizasyonlar

Performans

X-Ray efekti, ek bir render pass gerektirdiği için performans üzerinde bir miktar etki yaratabilir. Performansı optimize etmek için:

  • Yalnızca gerçekten X-Ray ile görünmesi gereken objelere “XRayObjects” katmanını atayın.
  • Karmaşık X-Ray shader’ları yerine basit shader’lar kullanın.
  • Efekti yalnızca ihtiyaç duyulduğunda (örneğin, bir yetenek aktifken veya belirli bir mesafedeyken) etkinleştirip devre dışı bırakın. Bunu bir C# scripti ile Render Objects Feature’ın enabled özelliğini değiştirerek yapabilirsiniz.

Dinamik Aktivasyon

X-Ray efektini bir yetenek gibi dinamik olarak açıp kapatmak için aşağıdaki gibi bir C# scripti kullanabilirsiniz:


using UnityEngine;
using UnityEngine.Rendering.Universal;

public class XRayToggle : MonoBehaviour
{
    public UniversalRenderPipelineAsset urpAsset; // URP Asset'inizi Inspector'dan sürükleyin
    public string xRayFeatureName = "XRayRenderObjects";

    private RenderObjects xRayRenderFeature;

    void Start()
    {
        if (urpAsset == null)
        {
            Debug.LogError("URP Asset is not assigned!");
            return;
        }

        // Renderer Data Asset'i bul
        if (urpAsset.rendererDataList.Length > 0 && urpAsset.rendererDataList[0] != null)
        {
            UniversalRendererData rendererData = urpAsset.rendererDataList[0] as UniversalRendererData;
            if (rendererData != null)
            {
                foreach (var feature in rendererData.rendererFeatures)
                {
                    if (feature != null && feature.name == xRayFeatureName)
                    {
                        xRayRenderFeature = feature as RenderObjects;
                        break;
                    }
                }
            }
        }

        if (xRayRenderFeature == null)
        {
            Debug.LogError("XRayRenderObjects feature not found in URP Renderer Data.");
        }
        else
        {
            // Başlangıçta pasif yapabilirsiniz
            xRayRenderFeature.SetActive(false);
        }
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.X) && xRayRenderFeature != null)
        {
            xRayRenderFeature.SetActive(!xRayRenderFeature.isActive);
            Debug.Log("X-Ray Feature Active: " + xRayRenderFeature.isActive);
        }
    }
}

Bu scripti bir GameObject’e ekleyin ve URP Asset’inizi Inspector’dan sürükleyin. “X” tuşuna bastığınızda X-Ray efekti açılıp kapanacaktır.

Görsel Geliştirmeler

  • Outline Efekti: Shader Graph’inizde, objenin etrafına bir ana hat (outline) çizmek için Sobel operatörü gibi kenar algılama tekniklerini kullanabilir veya iki pass’li bir shader (bir pass objenin normalini, diğer pass ana hattını çizer) oluşturabilirsiniz.
  • Renk ve Saydamlık Ayarları: Materyalinizdeki renk ve saydamlık ayarlarını dinamik olarak değiştirerek efektin yoğunluğunu ve görünümünü kontrol edebilirsiniz.
  • Uzaktan Solma: Kameraya olan uzaklığa göre X-Ray efektinin gücünü veya saydamlığını azaltarak daha gerçekçi bir geçiş sağlayabilirsiniz. Bunu shader içinde bir Distance node’u kullanarak yapabilirsiniz.

Sonuç

Unity URP’nin Render Objects özelliği, oyunlarınıza X-Ray görüşü gibi gelişmiş görsel efektler eklemek için inanılmaz derecede esnek ve güçlü bir araçtır. Bu makaledeki adımları takip ederek, duvarların arkasındaki objeleri gösteren kendi X-Ray sisteminizi kolayca kurabilirsiniz. Bu teknik, oyunculara stratejik avantajlar sunmanın yanı sıra, oyun dünyasına gizem ve keşif unsurları katmanıza da olanak tanır. Kendi yaratıcılığınızı kullanarak farklı shader’lar ve ayarlar deneyerek benzersiz X-Ray efektleri geliştirebilirsiniz. Unutmayın, iyi optimize edilmiş bir efekt, hem görsel olarak çekici hem de performans açısından verimli olmalıdır.