Modern oyun geliştirmenin en heyecan verici yönlerinden biri, oyunculara benzersiz görsel deneyimler sunmaktır. Unity’nin Evrensel Render İş Hattı (Universal Render Pipeline – URP), bu tür gelişmiş görsel efektleri düşük performans maliyetiyle oluşturmak için güçlü bir altyapı sağlar. Bu makalede, URP’nin “Render Objects” özelliğini kullanarak oyunlarınızda duvar arkasındaki objeleri gösteren bir X-Ray efekti nasıl oluşturulur, adım adım inceleyeceğiz. Bu özellik, özellikle stratejik avantaj sağlayan veya hikaye anlatımına yardımcı olan oyunlarda büyük fark yaratabilir.
Oyunlarda Duvar Arkası Görme İhtiyacı ve X-Ray Efektinin Önemi
Oyun dünyasında X-Ray efektleri, sadece görsel bir şölen sunmakla kalmaz, aynı zamanda oynanışa derinlik katar. Örneğin, bir gizlilik oyununda düşmanların konumunu duvarların arkasından görmek, oyuncuya taktiksel bir avantaj sağlayabilir. Bir nişancı oyununda objelerin arkasındaki hedefleri belirlemek veya bulmaca oyunlarında gizli geçitleri ortaya çıkarmak için kullanılabilir. Bu tür efektler, oyuncunun çevreyi algılama biçimini değiştirerek, oyun deneyimini zenginleştirir ve daha sürükleyici hale getirir. Geleneksel olarak bu tür efektler karmaşık shader programlama veya derinlik tamponu manipülasyonu gerektirse de, URP’nin Render Objects özelliği bu süreci önemli ölçüde basitleştirir.
URP ve Render Objects Nedir?
Universal Render Pipeline (URP), Unity’nin optimize edilmiş ve esnek bir render iş hattıdır. Mobil cihazlardan yüksek kaliteli konsol oyunlarına kadar geniş bir platform yelpazesinde tutarlı ve performanslı grafikler sunmak üzere tasarlanmıştır. URP, geliştiricilere render sürecini özelleştirme imkanı veren “Render Features” adı verilen güçlü bir mekanizma sunar. Bu özellikler, render hattına yeni adımlar eklemenize veya mevcut adımları değiştirmenize olanak tanır.
Render Objects, URP’nin sağladığı bu Render Features’lardan biridir. Belirli kriterlere uyan objeleri render hattının belirli bir aşamasında, özel bir materyal veya shader ile tekrar render etmenizi sağlar. Bu, örneğin, belirli bir katmandaki (Layer) tüm objeleri farklı bir renkle veya saydam bir efektle çizmek için mükemmel bir araçtır. X-Ray efekti için de tam olarak bu yeteneği kullanacağız: duvarların arkasında kalması gereken objeleri, özel bir saydam materyal ile ön plana çıkararak görünür kılmak.
X-Ray Efektini Adım Adım Oluşturma
1. URP Projesi Kurulumu ve Hazırlık
Öncelikle, Unity projenizin URP kullandığından emin olun. Yeni bir proje oluştururken URP şablonunu seçebilir veya mevcut bir projeye URP paketini (Window > Package Manager aracılığıyla) ekleyebilirsiniz. Projenizde bir URP Asset’i (genellikle “UniversalRenderPipelineAsset”) ve buna bağlı bir URP Renderer Asset’i (genellikle “UniversalRenderer”) olduğundan emin olun. Bu asset’ler, Project Settings > Graphics bölümünde atanmış olmalıdır.
2. Yeni Bir Render Objects Feature Oluşturma
X-Ray efektini uygulamak için özel bir Render Feature oluşturacağız:
- Project penceresinde sağ tıklayın ve Create > Rendering > URP Renderer Feature > Render Objects yolunu izleyin. Buna “XRayRenderFeature” gibi anlamlı bir isim verin.
- Bu yeni Render Feature’ı, URP Renderer Asset’inize eklemeniz gerekir. Project penceresinde URP Renderer Asset’inizi seçin (genellikle “UniversalRenderer.asset” veya benzeri). Inspector penceresinde, “Add Renderer Feature” düğmesine tıklayın ve oluşturduğunuz “XRayRenderFeature”ı seçin.
Bu adımlarla, URP render hattına özel bir render adımı eklemiş olduk. Şimdi bu adımı yapılandırma zamanı.
3. Hedef Objeleri Belirleme ve Filtreleme
XRayRenderFeature’ı Inspector penceresinde seçtiğinizde birçok ayar göreceksiniz. “Filters” bölümü, hangi objelerin bu Render Feature tarafından etkileneceğini belirler:
- Layer Mask: X-Ray efekti uygulayacağınız objelerin bulunduğu katmanı (Layer) seçin. Örneğin, “XRayable” adında yeni bir katman oluşturup, duvar arkasından görünmesini istediğiniz tüm objeleri bu katmana atayabilirsiniz.
- Tag: İsteğe bağlı olarak, objeleri etiketlerine göre de filtreleyebilirsiniz.
- Render Queue: Genellikle “Opaque” veya “Transparent” olarak ayarlanır. Bu, hangi objelerin (saydam veya opak) bu efektle render edileceğini belirler. Çoğu durumda, duvar arkasındaki objelerin opak olduğunu varsayarsak “Opaque” seçeneğini kullanabiliriz.
Bu filtreler sayesinde, sadece belirli objelerin X-Ray efektiyle çizilmesini sağlayarak performansı optimize edebiliriz.
4. X-Ray Materyali Oluşturma
X-Ray efektinin görseli, bu adımda oluşturacağımız özel bir materyal tarafından belirlenecektir:
- Project penceresinde sağ tıklayın ve Create > Shader > URP > Unlit Shader Graph yolunu izleyerek yeni bir Shader Graph oluşturun. Buna “XRayShader” adını verin.
- Bu shader’ı açın ve aşağıdaki temel ayarları yapın:
- Graph Settings (Graph Inspector’da):
- Surface Type: Transparent (saydamlık için)
- Blend Mode: Alpha (saydamlık için)
- Render Face: Both (objenin her iki tarafının da çizilmesi için, özellikle modelin iç yüzeylerini görmek istiyorsanız önemlidir)
- Depth Write: Off (önemli! Bu shader’ın derinlik tamponuna yazmamasını sağlar, böylece arkadaki duvar gibi objelerin derinlik bilgileri korunur ve X-Ray objemiz her zaman önde çizilir)
- Depth Test: Less Equal (Bu, normalde objenin arkasındaki diğer objelerin görünmesini engeller. Biz bu ayarı Render Objects’te değiştireceğiz.)
- Fragment Shader: Bir “Color” düğümü ekleyip “Albedo”ya bağlayın. Bu rengi, X-Ray objelerinizin ana rengi olarak kullanabilirsiniz. Bir “Alpha” değeri için de bir “Float” veya “Vector1” düğümü ekleyip “Alpha” çıkışına bağlayın.
- Graph Settings (Graph Inspector’da):
- Shader Graph’ı kaydedin. Şimdi bu shader’dan bir materyal oluşturun: “XRayMaterial” gibi bir isim verin ve Inspector’da shader olarak “XRayShader”ı atayın. Materyalin rengini ve saydamlığını burada ayarlayabilirsiniz (örn: parlak mavi, %50 saydamlık).
5. Render Objects Özelliğini Yapılandırma
Şimdi XRayRenderFeature’ımızı, oluşturduğumuz materyali kullanacak şekilde ayarlayalım:
- XRayRenderFeature’ı Inspector’da seçin.
- Event: Bu ayar, objelerin render hattının hangi aşamasında çizileceğini belirler. X-Ray objelerinin diğer tüm opak objelerin (duvarlar gibi) üzerine çizilmesi için “After Opaque” veya “Before Transparent” seçeneğini belirleyin. “After Opaque” genellikle iyi bir başlangıç noktasıdır.
- Override Materials: Bu bölümü genişletin ve “Add” düğmesine tıklayarak oluşturduğunuz “XRayMaterial”ı buraya sürükleyip bırakın. Bu, filtrelerden geçen objelerin kendi materyalleri yerine bu X-Ray materyaliyle çizilmesini sağlar.
- Depth Settings: Bu, X-Ray efektinin kalbi niteliğindedir.
- Depth Test: Bu ayarı “Less Equal” yerine “Always” olarak değiştirin. Bu, derinlik testini tamamen devre dışı bırakır ve X-Ray objelerinizin her zaman diğer objelerin önünde çizilmesini sağlar, yani duvarların arkasından bile görünürler.
- Depth Write: “Disable” olarak bırakın (veya Shader Graph’ta zaten kapattıysanız kontrol edin). Bu, X-Ray objelerinin derinlik tamponuna yazmamasını garantiler, böylece diğer objelerin kendi derinlik bilgileri bozulmaz.
Bu adımlarla, filtrelerden geçen ve “XRayable” katmanındaki tüm objeler, oluşturduğunuz saydam X-Ray materyaliyle duvarların arkasından görünecek şekilde çizilecektir.
6. Efekti Kontrol Etme (Scripting ile)
X-Ray efektini oyun içinde dinamik olarak açıp kapatmak veya belirli durumlarda etkinleştirmek isteyebilirsiniz. Bunun için basit bir C# betiği kullanabiliriz:
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class XRayToggle : MonoBehaviour
{
public UniversalRendererData rendererData; // URP Renderer Data Asset'iniz
public string featureName = "XRayRenderFeature"; // Render Feature'ınıza verdiğiniz isim
private RenderObjects xrayFeature;
void Start()
{
if (rendererData == null)
{
Debug.LogError("Renderer Data Asset is not assigned!");
return;
}
foreach (var feature in rendererData.rendererFeatures)
{
if (feature != null && feature.name == featureName)
{
xrayFeature = feature as RenderObjects;
break;
}
}
if (xrayFeature == null)
{
Debug.LogError($"Render Objects feature '{featureName}' not found in Renderer Data Asset.");
}
else
{
// Başlangıçta efekti kapalı tutmak için
xrayFeature.isActive = false;
}
}
// Efekti açıp kapatmak için bir metot
public void ToggleXRayEffect(bool enable)
{
if (xrayFeature != null)
{
xrayFeature.isActive = enable;
Debug.Log($"X-Ray Effect Toggled: {enable}");
}
}
// Örnek kullanım: Bir tuşa basıldığında efekti aç/kapa
void Update()
{
if (Input.GetKeyDown(KeyCode.X)) // 'X' tuşuna basıldığında
{
ToggleXRayEffect(!xrayFeature.isActive);
}
}
}
Bu betiği bir oyun objesine ekleyin ve Inspector’dan Renderer Data Asset’inizi (genellikle “UniversalRenderer.asset”) atayın. Artık ‘X’ tuşuna basarak X-Ray efektini açıp kapatabilirsiniz. Daha gelişmiş senaryolarda, belirli objelerin katmanını dinamik olarak değiştirerek veya efektin gücünü materyal parametreleri aracılığıyla ayarlayarak daha fazla kontrol sağlayabilirsiniz.
Performans ve Optimizasyon İpuçları
Her görsel efekt gibi, X-Ray efekti de performans üzerinde bir etkiye sahip olabilir. Ancak URP ve Render Objects ile bu etkiyi minimize etmek mümkündür:
- Hedef Kitleyi Daraltın: XRayRenderFeature’daki “Filters” bölümünü dikkatlice kullanın. Yalnızca gerçekten duvar arkasından görünmesi gereken objeleri ayrı bir katmana atayın ve sadece o katmanı filtreleyin. Tüm objeleri X-Ray efektiyle çizmek gereksiz performans maliyetine yol açar.
- Shader Karmaşıklığı: X-Ray materyali için mümkün olduğunca basit bir shader kullanın. Unlit Shader Graph, genellikle iyi bir başlangıç noktasıdır. Karmaşık hesaplamalar veya birden fazla doku örneği (texture sampling) içermeyen shader’lar, daha iyi performans sunar.
- Draw Call Optimizasyonu: Render Objects, filtrelerden geçen her objeyi tekrar çizdiği için ekstra çizim çağrıları (draw calls) oluşturur. Bu nedenle, X-Ray efektiyle çizilecek objelerin sayısını minimumda tutmak önemlidir.
- Etkinleştirme/Devre Dışı Bırakma: Efekti sadece ihtiyaç duyulduğunda (örneğin, oyuncu belirli bir yeteneği kullandığında veya belirli bir alana girdiğinde) etkinleştirin ve işi bittiğinde devre dışı bırakın. Yukarıdaki betik örneği, bu dinamik kontrol için bir temel sunar.
Sonuç: Oyun Deneyimine Yeni Bir Boyut
Unity URP’nin Render Objects özelliği, oyun geliştiricilerine güçlü ve esnek bir araç sunarak duvar arkasındaki objeleri gösteren X-Ray efektleri gibi karmaşık görsel efektleri kolayca oluşturma imkanı tanır. Bu özellik, oyunlarınıza stratejik derinlik katabilir, bulmacaları zenginleştirebilir veya hikaye anlatımınızı destekleyebilir. Adım adım uyguladığımız bu yöntemle, kendi oyunlarınızda bu etkileyici görsel efekti başarıyla hayata geçirebilirsiniz. Unutmayın, yaratıcılığınız ve optimizasyon teknikleriniz birleştiğinde, oyuncularınıza unutulmaz deneyimler sunabilirsiniz. Unity’nin bu güçlü araçlarını keşfetmeye devam edin ve oyunlarınızı bir üst seviyeye taşıyın!



