Yazılarımız

Veri Akademi

UNREAL ENGİNE İLE BUİLD VE PAKETLEME SÜRECİNİ YÖNETMEK VE HATA AZALTMAK

Unreal Engine projelerinde “çalışıyor” demek, her zaman “paketlenince de çalışıyor” demek değildir. Editörde sorunsuz akan bir sahne, farklı bir hedef platformda paketlenince bambaşka hatalar üretebilir. Bu yüzden build ve paketleme sürecini, yalnızca son adım gibi değil; üretim hattının doğal bir parçası gibi tasarlamak gerekir.

Özellikle ekipler büyüdükçe, farklı makinelerden çıkan farklı çıktılar, sürüm geçişleri, eklenti uyumsuzlukları ve konfigürasyon karmaşası teslim tarihlerini sessizce zorlar. Buradaki hedef; süreci “şans” olmaktan çıkarıp tekrarlanabilir hale getirmek, böylece hataları daha erken yakalamaktır.

Bu rehberde; ayarların standardize edilmesi, logların doğru okunması, otomasyonun devreye alınması ve en sık görülen paketleme hatalarının azaltılması için uygulanabilir bir yol haritası bulacaksın. İhtiyaç duyarsan pratikleri hızlandırmak için Unreal Engine eğitimi içeriğiyle de aynı yaklaşımı ekip geneline yayabilirsin.


Build konfigürasyonlarını proje başında standardize etmek

Build sürecini yönetmenin ilk adımı, herkesin aynı hedeflere göre derleme almasını sağlamaktır. “Development mı Shipping mi?” sorusu yalnızca performans için değil; log seviyesi, optimizasyon, sembol üretimi ve hata ayıklama davranışları için de kritik bir ayrım yaratır. Standart bir karar setiyle ilerlemek, farklı makinelerde çıkan sürprizleri azaltır.

Development build’ler hızlı iterasyon için idealdir; ancak paketleme öncesi en az bir kez Shipping çıktısını doğrulamak, “son anda patlayan” hataların payını ciddi biçimde düşürür. Ayrıca kullanılan Unreal Engine sürümünü, eklenti sürümlerini ve toolchain versiyonlarını dokümante etmek; ekip içi uyumsuzlukları önler.

Hedef platform profilini ekipçe netleştirmek

Windows, Android, iOS, konsol ya da özel bir kiosk hedefi… Her platformun derleme zinciri ve kısıtları farklıdır. Platform profilini netleştirmek; doğru SDK, doğru sertifika, doğru mimari (x64/ARM) ve doğru paketleme stratejisini aynı noktaya bağlar. Belirsizlik en pahalı hatadır; çünkü geç fark edilir.

Derleme çıktısı klasörlerini düzenli tutmak

Intermediate, Saved ve DerivedDataCache gibi klasörlerin kontrolden çıkması; derleme süresini şişirir, disk dolması kaynaklı hatalara yol açar ve “temiz derleme” ihtiyacını artırır. CI makinesinde düzenli temizlik, geliştirici makinelerinde ise kontrollü cache yönetimi önerilir. Böylece aynı commit’te farklı sonuç üretme riski azalır.

Modül bağımlılıklarını doğru tanımlamak ve çakışma azaltmak

Paketleme hatalarının önemli bir kısmı, modül bağımlılıklarının eksik ya da hatalı tanımlanmasından gelir. Editörde çalışan bir özellik, paketleme sırasında “missing module” veya “unresolved external” gibi hatalarla kırılabilir. Bunun sebebi, editörün bazı bağımlılıkları dolaylı olarak taşıması; paketlemenin ise daha katı davranmasıdır.

Özellikle C++ tabanlı projelerde Build.cs dosyalarında Public/Private bağımlılık ayrımını doğru yapmak, üçüncü parti kütüphaneleri hedef platforma uygun biçimde paketlemek ve gereksiz modülleri devre dışı bırakmak gerekir. Bu noktada minimum bağımlılık yaklaşımı, hataları da build süresini de azaltır.

Build.cs içinde bağımlılıkları tutarlı yönetmek

Aşağıdaki örnek, modül bağımlılıklarını daha net kurgulamak için basit bir iskelet gösterir. Örneği kendi modül adlarınla uyarlayabilirsin.

using UnrealBuildTool;

public class MyGame : ModuleRules
{
    public MyGame(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

        PublicDependencyModuleNames.AddRange(new string[]
        {
            "Core",
            "CoreUObject",
            "Engine",
            "InputCore"
        });

        PrivateDependencyModuleNames.AddRange(new string[]
        {
            "Slate",
            "SlateCore"
        });

        // Platform-specific bağımlılıkları kontrollü eklemek
        if (Target.Platform == UnrealTargetPlatform.Win64)
        {
            PublicDefinitions.Add("WITH_CUSTOM_SDK=1");
        }
        else
        {
            PublicDefinitions.Add("WITH_CUSTOM_SDK=0");
        }
    }
}

Eklenti ve üçüncü parti kütüphaneleri uyumlu tutmak

Bir eklenti editörde çalışsa bile, Shipping paketlemede “banned functions”, “missing binary” veya “unsupported platform” sorunları çıkarabilir. Çözüm; eklentinin hedef platform desteğini doğrulamak, gerekiyorsa platforma özel alternatifleri belirlemek ve sürüm yükseltmelerini kontrollü yapmakla başlar. Eklenti güncellemelerini “tek seferde hepsi” yerine, aşamalı güncellemek hata izolasyonunu kolaylaştırır.

Paketleme ayarlarını hedefe uygun yapılandırmak

Paketleme tarafında en sık karşılaşılan problemler; yanlış hedef platform seçimi, yanlış mimari, yanlış “cook” ayarları ve içerik kapsamının hatalı belirlenmesidir. “Neyi paketliyorum?” sorusu, yalnızca asset listesi değil; config dosyaları, shader cache, lokalizasyon dosyaları ve çevrimdışı/çevrimiçi kaynakların da dahil edilmesi demektir.

Build loglarıyla sürüm numarası ve hedef platform bilgisini aynı ekranda kontrol eden geliştirici ekibi

Cook stratejisini projeye göre belirlemek

Cook işlemi, paketleme hattının kalbidir. “By the book” cook daha güvenli ve tekrarlanabilirdir; hızlı iterasyon için “on the fly” tercih edildiğinde ise ortam bağımlılıkları artabilir. Büyük projelerde cook çıktısını ölçmek, “hangi içerik neden dahil oldu?” sorusunu yanıtlamak için zorunludur. Böylece boyut artışı ve yükleme süresi sorunları daha erken görülür.

Konfigürasyon dosyalarını sürümlemeyle yönetmek

DefaultEngine.ini ve ilgili config dosyaları, paketleme davranışını doğrudan etkiler. Bu dosyaların sürüm kontrolünde yer alması, “benim makinede çalışıyordu” tartışmasını azaltır. Ayrıca platforma özel bölümlerle, sadece gereken ayarların aktif olması sağlanabilir.

[/Script/UnrealEd.ProjectPackagingSettings]
BuildConfiguration=PPBC_Shipping
ForDistribution=True
IncludePrerequisites=True
UsePakFile=True
bShareMaterialShaderCode=True
bSharedMaterialNativeLibraries=True

; Boyut ve güvenlik için gereksiz içerikleri dışarıda tutmak
DirectoriesToNeverCook=(Path="/Game/DevOnly")

Log ve hata ayıklama akışını sistematik kurmak

Build ve paketleme hatalarını azaltmanın en hızlı yolu, hatayı “ilk görüldüğü yerde” yakalamaktır. Bunun için log seviyelerini doğru ayarlamak, output log’un filtrelerini bilmek ve otomatik raporlama üretmek önemlidir. “Unknown error” gibi görünen birçok çıktı, biraz yukarıda asıl sebebi yazar.

Önerilen pratik; paketleme çıktısını tek bir klasöre toplamak, her çalıştırmada log’u arşivlemek ve hataları sınıflandırmaktır: derleme hatası, cook hatası, staging hatası, sign/sertifika hatası, runtime crash. Bu sınıflandırma, düzeltme süresini ciddi biçimde kısaltır.

Tipik paketleme hatalarını kökten elemek

  • Eksik dosya yolu sorunlarını azaltmak için asset redirector temizliği yapmak
  • Shader derleme darboğazını azaltmak için paylaşımlı shader cache yaklaşımını denemek
  • Kaynak boyutu şişmesini önlemek için “never cook” dizinlerini netleştirmek
  • Çakışan isim problemlerini azaltmak için naming convention uygulamak
  • Eklenti uyumu için platform bazlı test matrisi oluşturmak

CI otomasyonuyla tekrarlanabilir çıktı üretmek

Manuel paketleme; kişiye, makineye ve zamana bağımlıdır. Otomasyon ise aynı commit’ten aynı çıktıyı üretmeyi hedefler. Basit bir CI akışı bile; “her merge sonrası Development build” ve “release branch’te Shipping paketleme” gibi iki katmanla riskleri azaltır. Böylece hata, kullanıcıya gitmeden önce yakalanır.

CI tarafında önemli olan; toolchain’in sabitlenmesi, DerivedDataCache kullanımının planlanması, build ajanlarının kaynaklarının ölçülmesi ve paketleme süresinin izlenmesidir. Ölçemediğin süreç yönetilemez; bu yüzden süre, boyut ve hata oranı gibi metrikler raporlanmalıdır.

Komut satırı paketlemeyi standartlaştırmak

Unreal Automation Tool (UAT) ile komut satırı üzerinden paketleme almak, tekrarlanabilirlik sağlar. Aşağıdaki örnek, tipik bir BuildCookRun akışını gösterir. Parametreleri proje yapına göre düzenleyebilirsin.

RunUAT.bat BuildCookRun ^
-project="D:ProjectsMyGameMyGame.uproject" ^
-noP4 ^
-platform=Win64 ^
-clientconfig=Shipping ^
-build ^
-cook ^
-stage ^
-pak ^
-archive ^
-archivedirectory="D:BuildsMyGame_Win64_Shipping"

Performans ve boyut optimizasyonunu planlı yürütmek

Paketleme hataları sadece “çıktı alamamak” değildir; bazen çıktı alınır ama boyut hedefi aşılır, yükleme süreleri artar ya da runtime crash oranı yükselir. Bu yüzden paketleme süreci, aynı zamanda performans bütçesinin kontrol noktasıdır. Asset boyutlarını izlemek, texture streaming ayarlarını doğrulamak, gereksiz içerikleri ayıklamak ve platforma özel sıkıştırmayı doğru kullanmak önemlidir.

Özellikle mobil ve VR hedeflerinde; texture formatları, mipmap stratejisi, mesh LOD ayarları ve ses sıkıştırma politikası doğrudan paket boyutunu etkiler. Burada amaç; tek seferlik “diyet” değil, her sprintte küçük iyileştirmelerle sürdürülebilir bir çizgi oluşturmaktır.

Paket boyutu raporunu inceleyip hangi dosyaların büyüdüğünü birlikte değerlendiren üretim ekibi

Dağıtım öncesi kontrol listesini işletmek

Yayın öncesi kontrol listesi; sürprizleri azaltmanın en pratik yoludur. Sürüm numarası, hedef platform, sertifika, başlangıç haritası, lokalizasyon dosyaları, ağ izinleri ve üçüncü parti lisanslar tek tek doğrulanmalıdır. Bu adımı bir şablona bağlamak, yeni ekip üyelerinin de aynı standardı uygulamasını sağlar.

Hata azaltma kültürünü ekip içinde kalıcılaştırmak

En iyi teknik çözüm bile, ekip alışkanlıklarıyla desteklenmezse kalıcı olmaz. Build ve paketleme sürecini “son dakika görevi” olmaktan çıkarıp; sprintin doğal bir parçası haline getirmek gerekir. Haftalık düzenli paketleme, küçük değişikliklerin etkisini görünür kılar ve sorunların büyümesini engeller.

Pratik olarak; her önemli özellikten sonra paketleme almak, eklenti eklemeden önce hedef platform uyumunu kontrol etmek ve log hatalarını “ertelenebilir” görmemek büyük fark yaratır. Böylece ekip, teslimat sırasında değil; geliştirme sırasında öğrenir ve hızlanır.

Bu yaklaşımı ekip genelinde oturtmak ve ortak bir dil oluşturmak istersen, içerik ve uygulama odaklı Unreal Engine eğitimi programı, aynı standartları kısa sürede yaygınlaştırmaya yardımcı olur.

 ANİMASYON AKADEMİ