UE5 ile çalışan her indie geliştirici er ya da geç aynı eşiğe gelir: Blueprint mi yoksa C++ mı kullanmalıyım? Forum tartışmaları, YouTube videoları ve Reddit threadleri bu soruyu ideolojik bir savaşa dönüştürdü. Gerçek şu ki bu, yanlış bir soru. Olgun bir UE5 projesi için doğru cevap neredeyse her zaman "ikisi birden". Asıl soru, hangi sistemin hangi tarafta yaşaması gerektiğidir.
Biz Althera Games olarak Potion Rise Simulator'ı geliştirirken bu kararı her ay yeniden veriyoruz. Bu yazıda, Blueprint ve C++'ın güçlü yanlarını, performans gerçeklerini ve indie bir ekibin gerçekten uygulayabileceği bir karar matriksini ele alacağız. UE5'in genel yapısını henüz tanımıyorsanız, önce UE5 ile indie oyun geliştirmek üzerine genel rehberimizi okumanızı öneririz.
Blueprint Sistemi: Görsel Programlamanın Gücü
Blueprint, UE5'in kalbinde yer alan bir node tabanlı görsel scripting sistemidir. Arka planda bir bytecode VM çalışır; node'lar derlenip motor tarafından yorumlanır. Yani Blueprint "scriptleme" değil, gerçek anlamda derlenmiş koddur, sadece çalışma zamanı yorumlayıcı kullanır.
Blueprint'in pratik gücü, motorun tüm gameplay framework'üyle iç içe geçmiş olmasıdır. UPROPERTY, UFUNCTION, replikasyon, GC entegrasyonu, asset referansları, animasyon notify'ları ve event sistemi gibi tüm motor özellikleri Blueprint'ten doğrudan erişilebilir. Bir Animation Blueprint, bir Widget Blueprint veya bir Behavior Tree task'ı saatlerce C++ ile uğraşmak yerine birkaç dakikada kurulabilir.
Blueprint'in indie geliştirici için en büyük üç avantajı şunlardır:
- Iterasyon hızı: Compile süresi C++'a kıyasla çok kısa. Live Coding olsa bile bir UCharacter alt sınıfını C++'ta her değiştirdiğinizde linker tetiklenir; Blueprint'te değişiklik anında görülür.
- Editor entegrasyonu: Blueprint variables doğrudan Detail panelinden editlenebilir, kategorize edilebilir ve designer-friendly hale getirilebilir. Sanatçılar ve tasarımcılar koda dokunmadan parametre ayarlayabilir.
- Reflection ve serialization: Blueprint, Unreal'in reflection sistemine yerel olarak doğar. Hot reload, undo/redo ve diff takibi ücretsiz gelir.
Blueprint'in epey sevilmemesinin nedeni "spaghetti graph" sendromudur. Bir node ağı yeterince karmaşıklaştığında okumak imkânsız hale gelir. Bu, Blueprint'in değil, organizasyonun kusurudur. Function ve Macro kullanmak, Blueprint Interface'leri tanımlamak, Event Dispatcher'ları doğru kullanmak ve mantığı küçük componentlere parçalamak Blueprint kodunu da temiz tutar. Kötü yazılmış Blueprint, kötü yazılmış C++ kadar zararlıdır.
C++ Tercih Senaryoları: Performans ve Mimari
C++ taraf, Unreal'in altındaki gerçek motor dilidir. UCharacterMovementComponent, UStaticMeshComponent, FArchive serializer, UAssetManager ve replikasyon altyapısı gibi her şey C++ ile yazılmıştır. C++'a inmek, motorun bu çekirdek API'leriyle aynı seviyede çalışmak demektir.
Bazı senaryolarda C++ pratikte zorunludur:
- Yüksek frekanslı tick mantığı: Saniyede binlerce kez yürütülen oyun mantığı (örneğin 1000 actor'ün her birinin custom logic'i, partikül davranışı, fizik etkileşimleri).
- Ağır veri yapıları: 10.000 öğelik bir envanter array'i üzerinde sıralama, filtreleme, indeksleme yapacaksanız Blueprint'in TArray operasyonları darboğaza dönüşür.
- Engine subsystem yazımı: UGameInstanceSubsystem veya UWorldSubsystem türleri yalnızca C++'tan extend edilebilir.
- Replikasyon detayları: RepNotify callback'leri, custom condition'lar ve Push Model replikasyonu C++ olmadan rahat kullanılamaz.
- Online Subsystem entegrasyonları: Steam, EOS veya custom backend bağlantıları C++ ister.
- Editor tooling: Custom Asset Editor, Slate panelleri, kendi editor menünüz, Commandlet'ler tamamen C++.
Mimari açıdan C++ ayrıca kontrat tarafında değerlidir. Bir UInventoryComponent C++ sınıfı, public API'sini sabitler. Buna bağlanan onlarca Blueprint, taban API değişmediği sürece aynı şekilde çalışır. Tüm sistemi Blueprint'te tutarsanız, her küçük yeniden adlandırma onlarca asset'te referans bozar. C++ base + Blueprint extension yapısı, refactoring'i çok daha güvenli kılar.
Hibrit Yaklaşım: İkisinin de İyi Yönü
Sektörde Unreal kullanan büyük ve küçük tüm ekipler bir hibrit modele yakınsadı. Genel desen şudur: C++ omurgayı yazar, Blueprint omurganın üstünde davranışı tanımlar.
Bu pratikte şöyle görünür:
- Bir AAltheraCharacter C++ sınıfı tanımlanır. Movement parametreleri, hasar uygulama, save/load hook'ları ve replikasyon burada yaşar.
- BP_PlayerCharacter Blueprint sınıfı bu C++ sınıfından türer. Animasyon montaj çağrıları, kamera parametreleri, görsel efektler, partikül spawn'ları Blueprint tarafındadır.
- UFUNCTION(BlueprintCallable) ile C++ fonksiyonları Blueprint'e çağrılabilir hale getirilir. UFUNCTION(BlueprintImplementableEvent) ile C++ tarafından çağrılabilen, Blueprint tarafında implement edilen event'ler kurulur.
- UPROPERTY(EditAnywhere, BlueprintReadWrite) makrosu, C++'ta tanımlı bir veriyi Blueprint Detail panelinde editlenebilir kılar.
Bu mimarinin güzelliği, bir programcının ve bir tasarımcının paralel çalışabilmesidir. Programcı yeni bir C++ component yazarken, tasarımcı mevcut Blueprint'i parametre üzerinden ayarlayabilir. İki taraf da kendi hızında ilerler.
Potion Rise Simulator'da envanter sistemini ve simulasyon tick'ini C++'ta tutuyoruz. Diyalog akışı, NPC reaksiyonları, UI animasyonları ve quest tetikleyicileri Blueprint'te kalıyor. Bir tasarım kararı değişince, çoğu zaman C++ derlemesine gerek kalmıyor.
Blueprint Performans Mitleri ve Gerçekler
Blueprint hakkındaki en yaygın efsane "Blueprint yavaş, dolayısıyla bütün oyun C++ olmalı" iddiasıdır. Bu, hem doğru hem de yanıltıcıdır.
Doğru olan kısım: Blueprint VM, eşdeğer C++ koduna kıyasla sıkı bir hesaplama döngüsünde yaklaşık 8 ila 10 kat daha yavaştır. Bir for döngüsünde 10.000 elemanı işliyorsanız, fark ölçülebilir. Profile yaptığımızda Blueprint VM çağrı overhead'i, basit bir aritmetik ifade için bile birkaç yüz nanosaniye eklenebilir.
Yanıltıcı olan kısım: Çoğu indie oyunun gameplay mantığı, sıkı bir for döngüsünden çok event-driven yapıdadır. Bir OnOverlap event'i frame başına en fazla birkaç kez tetiklenir. Bir UI butonuna tıklamak frame başına 0 ila 1 kez olur. Bu durumlarda Blueprint VM ile C++ arasındaki mutlak fark, frame budget'ında ölçülemez bir noktaya iner.
Mit kısmı şöyle çürütülür: Asıl performans dostu olan, dilin kendisi değil, algoritmanın doğru yerde olmasıdır. Yanlış yerde yazılmış C++, doğru yerde yazılmış Blueprint'ten yavaş olur. Örneğin Tick içinde her frame "GetAllActorsOfClass" çağırmak, dilden bağımsız olarak felakettir.
Gerçekçi profiling önerimiz:
- Unreal Insights ile bir bench oturumu açın, Blueprint VM süresini ölçün. Toplam frame zamanının %5'inin altındaysa optimize etmek bir önceliklendirme hatasıdır.
- "stat game" konsol komutu ile per-frame Blueprint time görünür. Spike varsa o noktayı C++'a alın.
- Blueprint Function Library'leri C++'ta yazıp Blueprint'ten çağırmak, çoğu zaman tüm Blueprint'i taşımaktan daha hızlı bir kazançtır.
C++ Öğrenme Eğrisi: Indie İçin Gerçekçi Plan
"C++ öğrenmem lazım" düşüncesi pek çok indie geliştiriciyi felç eder. Standart C++ ile Unreal C++ farklı dünyalardır ve neyse ki Unreal tarafı çok daha küçük bir alt küme. Standart C++ bilmek faydalıdır, ama "Effective Modern C++" kitabını ezberlemek Potion Rise Simulator için gerekli değildir.
Indie bir geliştiricinin pratikte öğrenmesi gereken Unreal C++ konuları:
- UCLASS, UFUNCTION, UPROPERTY makroları: Reflection sisteminin temeli. Bu üçünü anlayan geliştirici motorun %70'ini açmış olur.
- Garbage Collection ve UObject ömrü: Neden raw pointer kullanmadığınızı, TObjectPtr ve TWeakObjectPtr farkını anlamak.
- Delegate sistemi: DECLARE_DYNAMIC_MULTICAST_DELEGATE makroları ve event tabanlı tasarım. Tick'i azaltmanın yolu burdan geçer.
- FString, FName, FText farkları: String'leri yanlış tipte saklamak hem performans hem lokalizasyon hatalarına yol açar.
- Module yapısı ve build.cs dosyaları: Public/Private include path'leri, dependency module ekleme.
Bu beş başlık çoğu indie oyun için yeterlidir. Template metaprogramming, std::move semantikleri veya SFINAE'yi öğrenmek için zaman ayırmak çoğu zaman ROI'si düşük bir yatırımdır. Epic Games Learning portalı ve Tom Looman'ın blog'u indie odaklı kaynaklar arasında en pratik olanlardır.
Önerimiz şu öğrenme sırası: önce Blueprint ile bir küçük prototip bitirin. Sonra o prototipte tek bir component'i C++'a taşıyın (genelde inventory iyi bir başlangıçtır). Bu tek geçiş, soyut tutorial'lardan çok daha öğreticidir. İkinci component'i taşıdığınızda zaten Unreal C++'ı çalışır kullanır hale gelirsiniz.
Hangi Sistemleri C++ ile Yazmalı?
Bunu biraz somutlaştıralım. Bir indie oyununda hangi sistemler tipik olarak hangi tarafa gider, deneyimli ekiplerin yaklaşımına göre kabaca şöyle bölünür:
C++'a gitmesi mantıklı sistemler:
- Inventory ve item data omurgası (item base class, item factory, save serialization)
- Save/Load sistemi (USaveGame türevi sınıflar, custom FArchive operatörleri)
- Ana karakter ve ana NPC base class'ları (ACharacter türevleri)
- Custom Subsystem'ler (UGameInstanceSubsystem ile global servisler)
- Online Subsystem ve Steam entegrasyonu
- Simulasyon tick'i ve ekonomi modeli
- Custom Asset Type'ları ve onların editor desteği
- Localization key yönetimi ve text pipeline'ı
Blueprint'te kalması mantıklı sistemler:
- UI ekranları ve animasyonları (Widget Blueprint, UMG)
- Animation Blueprint'leri ve State Machine'ler
- Behavior Tree task ve service'leri
- Quest mantığı ve dialog tree akışları
- Visual effect Blueprint'leri ve niagara emitter parametreleri
- Level Blueprint'lerinde sahneye özgü tetikleyiciler
- Tutorial sahne kontrolü
- Designer'ın sıkça parametre ayarlayacağı her şey
Kural olarak şunu kullanırız: bir sistem tasarım iterasyonuna dönükse Blueprint'te yaşar. Mimari sözleşmeye dönükse C++'ta yaşar. Saatlik değişen şey Blueprint, aylık olarak şekillenen şey C++.
Karar Matriksi: Senin Projen İçin Doğru Yol
Yeni bir UE5 projesine başlarken aşağıdaki karar matriksi indie ekipler için pragmatik bir başlangıç noktasıdır. Soruları sırayla cevaplayın:
1. Ekipte C++ yazabilen biri var mı?
Yoksa, %100 Blueprint ile başlayın. C++'ı sonra eklemek mümkün, baştan zorlamak gereksiz bariyerdir. Steam'de yayınlanmış pek çok başarılı oyun bu yolu izledi.
2. Oyun türü performansa duyarlı mı?
RTS, simülasyon, MMO veya bullet hell yapıyorsanız core sistemleri C++ planlayın. Narrative adventure, walking simulator veya turn-based RPG ise Blueprint ağırlıklı pekâlâ yeterlidir.
3. Ekip büyüklüğü ve rol dağılımı nedir?
Tek kişiyseniz hibrit gerekli — C++'ı omurga, Blueprint'i içerik için kullanın. 2-3 kişilik ekipte programcı C++ ile, tasarımcı Blueprint ile çalışsın. 5+ kişilik ekipte ayrımı sıkılaştırın; module bazında ayırma mantıklı olur.
4. Multiplayer var mı?
Net replication ciddi şekilde yapılacaksa C++ olmadan üretim kalitesinde bir multiplayer çıkarmak çok zor. Blueprint replication çalışır, ama ileri replication (push model, custom condition, RPC validation) C++ ister.
5. Plugin veya marketplace asset üretmek istiyor musun?
Evetse C++ zorunlu. Fab'da satılacak ciddi pluginler tamamen Blueprint olamaz.
Bu beş soruyu netleştirdiğinizde Blueprint vs C++ sorusu çoğu zaman kendi cevabını verir. Geriye kalan, projenin doğal evrimi içinde sınırı doğru çekmektir.
Sonuç: Sistemler İçin Dil, Dil İçin Sistem Değil
UE5'te programlama tercihi bir kimlik meselesi değildir. "Blueprint geliştiricisi" veya "C++ geliştiricisi" olmak yerine, hangi sistemin nereye ait olduğunu bilen bir geliştirici olmak hedef. Olgun bir UE5 ekibi, her sistem için sorduğu soru "bu kod nereye yazılmalı"dır, "ben hangi dili tercih ediyorum" değil.
Indie geliştiriciler için pratik özet basit: Blueprint ile başlayın, oyun şekillendikçe darboğazlardan başlayarak C++'a inin. Asla tüm projeyi tek seferde C++'a çevirmek için durdurmayın. Hibrit, doğal ve sürdürülebilir olandır.
Althera Games olarak Potion Rise Simulator ve NightRecord: Thin Walls projelerinde tam olarak bu yolu izliyoruz. Her iki oyun da C++ omurga ve Blueprint cilt ile ilerliyor; bu sayede iki farklı türde de tasarım iterasyonunu mühendislikten ayrı tutabiliyoruz. UE5 ile aydınlatma tarafına da bakmak isterseniz, Lumen rehberimizi de inceleyebilirsiniz.
Sıkça Sorulan Sorular
Blueprint sadece prototype için mi kullanılmalı?
Hayır. Blueprint, üretim kodunda da tamamen meşru bir araçtır. Steam'de yayınlanan pek çok başarılı oyun, gameplay mantığının önemli bir kısmını Blueprint ile yazıyor. Önemli olan, Blueprint'i nerede kullandığınız: olay tabanlı oyun mantığı, UI animasyonları, AI durumu geçişleri ve diyalog akışları için Blueprint mükemmel bir seçimdir. Ancak saniyede yüz binlerce iterasyon yapan bir simulasyon döngüsünü Blueprint'te tutmak performansa zarar verir. Blueprint'in "sadece prototype için" olduğu fikri 2014'lerin algısıdır; 2026'da motor çok daha olgunlaşmış durumda.
C++ bilmeden ticari oyun yapılabilir mi?
Kesinlikle evet. Steam'de yayınlanmış ve ticari olarak başarılı olmuş, %100 Blueprint ile yazılmış birçok oyun var. Tek bir programcısı olmayan ekipler bile UE5 ile oyun çıkarabiliyor. Yine de C++ bilmeden bazı sınırlarla karşılaşırsınız: özel render geçişleri, kendi plugin'inizi yazmak, motor kaynak kodunu modifiye etmek veya çok düşük seviyeli optimizasyon C++ gerektirir. Eğer projeniz bu sınırları zorlamıyorsa, C++ olmadan da kaliteli bir ürün çıkarmak tamamen mümkündür.
Blueprint'ten C++'a nasıl geçilir?
Geçişin en sağlıklı yolu adım adımdır. Önce Blueprint'inizi C++ base class'a reparent edin: yeni bir UObject veya AActor türevi C++ sınıfı oluşturun, mevcut Blueprint'i bu sınıfın çocuğu yapın. Daha sonra Blueprint'teki performans-kritik veya yeniden kullanılabilir node'ları C++ fonksiyonlarına taşıyıp UFUNCTION(BlueprintCallable) makrosuyla Blueprint'e geri açın. Tüm Blueprint'i bir kerede C++'a çevirmeye çalışmak çoğu zaman gereksizdir; hibrit yapı korunur. Property'leri taşırken UPROPERTY makrolarını ve Blueprint'te aynı isimleri kullanmak veri kaybını önler.
Hangi UE5 özellikleri C++ gerektirir?
Bazı sistemler Blueprint'ten erişilemez veya pratik değildir. Custom Subsystem yazımı, GameplayAbilitySystem'in core attribute setleri, Online Subsystem entegrasyonları, AI Perception için özel sense'ler, Slate UI extension'ları, Editor utility eklentileri, Replication için RepNotify mantığının ileri seviyesi ve Engine modüllerine doğrudan müdahale C++ ister. Ek olarak, motor kaynak kodunu modifiye etmek (engine fork) doğal olarak yalnızca C++'tır. Buna karşılık AbilitySystem'in ability'leri ve attribute uygulamaları Blueprint'te tamamen yazılabilir.
Blueprint nativization hâlâ var mı?
Hayır. Epic Games, Blueprint Nativization özelliğini UE5 ile kaldırdı. Eski UE4 dokümantasyonunda bahsedilen bu sistem, Blueprint'i derleme zamanında C++'a çevirip native performans elde etmeyi vaad ediyordu, ancak bakımı zor ve karmaşıktı. Bunun yerine Epic, Blueprint VM'sinin kendisini optimize etmeye odaklandı ve gerektiğinde yapı taşlarını C++'a taşımayı önerdi. Pratikte bu hiçbir kayıp değildir: zaten doğru yaklaşım, kritik kodu C++'ta yazmaktı; nativization daha çok bir yara bandıydı.
Blueprint ve C++ üzerine daha derin bir referans için Epic Games'in resmi Blueprint dokümantasyonu ve C++ tarafında Tom Looman'ın eğitim içerikleri indie geliştiriciler için en pratik kaynaklar arasındadır.