Bloga Dön

Kapsamlı UE5 Steam Workshop Eğitimi: Runtime Asset Swapping ve Güvenlik

Yayınlanma tarihi 29 Mart 2026
Kapsamlı UE5 Steam Workshop Eğitimi: Runtime Asset Swapping ve Güvenlik

Her indie geliştirici, kullanıcı tarafından oluşturulan içeriğin (UGC) oyunlarının uzun ömürlülüğünün anahtarı olduğunu anladığı o anı bilir. Topluluğunuza karakter skinlerini değiştirme, silah modellerini yenileme veya özel videolar ekleme araçları sunmak, geçici bir çıkışı on yıllık bir franchise'a dönüştürebilir.

Ancak bunu Unreal Engine 5'te uygulamak için masaya oturduğunuzda, hemen bir duvara çarparsınız.

En yaygın yanlış anlama — ve geliştirici forumlarında sıkça sorulan bir soru — ham .FBX dosyalarının Steam Workshop üzerinden nasıl yükleneceği ve yükleneceğidir. Acı gerçek mi? Bunu yapmazsınız. Unreal Engine, packaging süreci sırasında assetleri agresif bir şekilde optimize etmek, sıkıştırmak ve bake etmek üzere tasarlanmıştır. Çalışma zamanında (runtime) ham .FBX dosyalarını ayrıştırmaya çalışmak, ya devasa (ve EULA ihlali teşkil eden) Unreal Editor modülünü yayınlanan oyununuza dahil etmeyi ya da UE5'in gelişmiş material graphs ve skeleton retargeting verilerini tamamen yok eden Assimp gibi üçüncü taraf kütüphanelere güvenmeyi gerektirir.

Profesyonel bir modding pipeline'ı oluşturmak için Unreal Engine'in yerel .pak (package) sistemini kullanmanız gerekir.

Bu kapsamlı ue5 steam workshop tutorial içeriğinde, Steam Workshop'u sorgulamak, özel assetleri indirmek, .pak dosyalarını runtime'da dinamik olarak mount etmek ve multiplayer durumunuzu bozmadan oyununuzun modellerini güvenli bir şekilde swap etmek için gereken tam mimariyi inceleyeceğiz.

UE5 Modding Mimarisi

Tek bir satır C++ yazmadan önce, bir Unreal Engine modunun yaşam döngüsünü anlamalısınız. Steam Workshop yalnızca bir dosya dağıtım ağıdır; bir Unreal Engine mesh'inin ne olduğunu bilmez.

İş akışı şöyledir:

  1. Modkit: Topluluğunuza temel Skeleton ve silah şablon sınıflarınızı içeren sadeleştirilmiş bir Unreal Engine projesi sağlarsınız.
  2. Bake: Mod yapımcısı kendi özel .FBX dosyasını bu Modkit'e aktarır, UE5 material'larını ayarlar ve asset'i bir .pak dosyasına "cook" eder.
  3. Dağıtım: Mod yapımcısı, bu .pak dosyasını Steam Workshop'a yüklemek için bir SteamCMD betiği (veya sağladığınız bir oyun içi araç) kullanır.
  4. İstemci: Oyununuz, abone olunan öğeleri sorgulamak, .pak dosyasını indirmek ve sanal dosya sistemine mount etmek için Steamworks SDK'sını kullanır.
  5. Swap: Oyun mantığınız, mount edilen .pak dosyasından USkeletalMesh'i dinamik olarak yükler ve oyuncu karakterine uygular.

Adım 1: Modkit'inizi Mimari Etmek

Oyuncuların bir karakterin görüntülenen modelini değiştirmesini istiyorsanız, skeleton'ınıza ihtiyaçları vardır. UE5 projenizin halka açık bir versiyonunu dağıtmalısınız.

Ancak, tüm kaynak kodunuzu öylece zipleyip veremezsiniz. Yalnızca gerekli referansları içeren steril bir ortam oluşturmanız gerekir. Bu, tescilli kodları, backend sırlarını ve yeniden dağıtma lisansına sahip olmadığınız ücretli marketplace assetlerini agresif bir şekilde ayıklamayı içerir. Bunu daha önce hiç yapmadıysanız, bağımlılıkları bozmadan assetleri nasıl izole edeceğinizi anlamak için How To Master Unreal Engine Dedicated Server Asset Stripping Step By Step kılavuzumuzu okumanız şiddetle tavsiye edilir.

Bu Modkit'te belirli bir klasör yapısı sağlayacaksınız (örneğin, /Game/Mods/CustomSkins/). Mod yapımcısı assetlerini buraya yerleştirecek ve bir .pak dosyası cook etmek için Unreal Automation Tool (UAT) kullanacaktır.

Adım 2: C++ ile Steam Workshop Sorgulama

.pak dosyası Steam'e yüklendikten sonra oyununuzun onu bulması gerekir. DefaultEngine.ini dosyanızda OnlineSubsystemSteam eklentisinin etkinleştirildiğinden emin olun.

Unreal, Steam için bazı Blueprint düğümleri sağlasa da, ciddi bir Workshop entegrasyonu yerel Steamworks API (ISteamUGC) kullanan C++ gerektirir. İşte bir kullanıcının şu anda abone olduğu öğeleri sorgulamak için sağlam bir örnek:

#include "SteamWorkshopManager.h"
#include "ThirdParty/Steamworks/Steamv157/sdk/public/steam/steam_api.h"

void USteamWorkshopManager::QuerySubscribedMods()
{
    if (!SteamAPI_Init())
    {
        UE_LOG(LogTemp, Error, TEXT("Steam API failed to initialize."));
        return;
    }

    // Get the number of subscribed items
    uint32 NumSubscribed = SteamUGC()->GetNumSubscribedItems();
    if (NumSubscribed == 0)
    {
        UE_LOG(LogTemp, Warning, TEXT("User has no subscribed Workshop items."));
        return;
    }

    // Retrieve the PublishedFileIds
    TArray<PublishedFileId_t> SubscribedItems;
    SubscribedItems.SetNum(NumSubscribed);
    SteamUGC()->GetSubscribedItems(SubscribedItems.GetData(), NumSubscribed);

    // Iterate and get install info
    for (PublishedFileId_t FileId : SubscribedItems)
    {
        uint32 ItemState = SteamUGC()->GetItemState(FileId);
        
        // Check if the item is installed and ready
        if (ItemState & k_EItemStateInstalled)
        {
            uint64 SizeOnDisk;
            char FolderPath[1024];
            uint32 Timestamp;

            bool bSuccess = SteamUGC()->GetItemInstallInfo(FileId, &SizeOnDisk, FolderPath, sizeof(FolderPath), &Timestamp);
            
            if (bSuccess)
            {
                FString ModDirectory = UTF8_TO_TCHAR(FolderPath);
                UE_LOG(LogTemp, Log, TEXT("Found Mod at: %s"), *ModDirectory);
                
                // Proceed to locate the .pak file inside this directory and mount it
                FindAndMountPakFile(ModDirectory);
            }
        }
        else
        {
            // Trigger SteamUGC()->DownloadItem() if not installed
            UE_LOG(LogTemp, Log, TEXT("Item %llu is not installed yet."), FileId);
        }
    }
}

Adım 3: Runtime'da .pak Dosyalarını Mount Etmek

Çoğu geliştiricinin takıldığı yer burasıdır. Steam Workshop klasörünün dosya yoluna sahipsiniz, ancak Unreal Engine, IPlatformFile sistemine mount edilene kadar .pak içindeki assetleri yerel olarak okuyamaz.

Bunu yapmak için FPakFile ve FCoreDelegates kullanmanız gerekir. Build.cs dosyanızın PakFile modülünü içerdiğinden emin olun.

#include "IPlatformFilePak.h"
#include "HAL/PlatformFileManager.h"
#include "Misc/Paths.h"

bool USteamWorkshopManager::MountPakFile(const FString& PakFilePath)
{
    IPlatformFile& InnerPlatformFile = FPlatformFileManager::Get().GetPlatformFile();
    FPakPlatformFile* PakPlatformFile = static_cast<FPakPlatformFile*>(FPlatformFileManager::Get().FindPlatformFile(FPakPlatformFile::GetTypeName()));

    // Initialize the PakPlatformFile if it doesn't exist
    if (!PakPlatformFile)
    {
        PakPlatformFile = new FPakPlatformFile();
        PakPlatformFile->Initialize(&InnerPlatformFile, TEXT(""));
        FPlatformFileManager::Get().SetPlatformFile(*PakPlatformFile);
    }

    // Ensure the file exists
    if (!InnerPlatformFile.FileExists(*PakFilePath))
    {
        UE_LOG(LogTemp, Error, TEXT("Pak file does not exist: %s"), *PakFilePath);
        return false;
    }

    // Standard mount point, usually "../../../"
    FString MountPoint = FPaths::ProjectDir(); 
    
    // Mount the pak
    if (PakPlatformFile->Mount(*PakFilePath, 0, *MountPoint))
    {
        UE_LOG(LogTemp, Log, TEXT("Successfully mounted Pak: %s"), *PakFilePath);
        return true;
    }

    UE_LOG(LogTemp, Error, TEXT("Failed to mount Pak: %s"), *PakFilePath);
    return false;
}

Kritik Teknik Not: Mod yapımcısı tarafından cook işlemi sırasında tanımlanan MountPoint, oyunda mount ettiğiniz yerle eşleşmelidir, aksi takdirde motor dahili asset yollarını çözümleyemez.

Adım 4: Assetleri Dinamik Olarak Swap Etmek

.pak mount edildikten sonra içeriği Unreal'ın sanal dosya sistemiyle birleştirilir. Mod yapımcısı /Game/Mods/CustomSkins/SK_CyberNinja adresinde bir Skeletal Mesh oluşturduysa, bunu yerel bir asset gibi yükleyebilirsiniz.

void AMyPlayerCharacter::ApplyModdedSkin(const FString& AssetPath)
{
    // Example AssetPath: "/Game/Mods/CustomSkins/SK_CyberNinja.SK_CyberNinja"
    USkeletalMesh* ModdedMesh = LoadObject<USkeletalMesh>(nullptr, *AssetPath);
    
    if (ModdedMesh)
    {
        GetMesh()->SetSkeletalMesh(ModdedMesh);
        UE_LOG(LogTemp, Log, TEXT("Successfully swapped character model!"));
    }
}

Belirli bir konumdaki bir videoyu değiştirmek de aynı mantığı izler. Mount edilen pak'tan modlanmış UMediaPlayer veya UMediaSource assetini yükler ve oyun içi ekranınızın material instance'ına atarsınız.

Multiplayer bir ortamda silah modellerini swap ediyorsanız, component replication konusuna inanılmaz derecede dikkat edin. Yeni ActorComponents ekleyen modlanmış silahlar, sunucuda da mod mount edilmemişse hızla sunucu desync'lerine neden olabilir. Multiplayer'da bileşen sahipliğinin nasıl bozulduğuna dair derinlemesine bir inceleme için Multiplayer Inventory Nightmares Fixing Swapped Actorcomponent Owners In Unreal Engine analizimize göz atın.

Cross-Platform ve Güvenlik İkilemi

Steam Workshop'u uygulamak teknik olarak tatmin edicidir, ancak modern indie oyunlar için büyük bir mimari kusur getirir: Platform Lock-in.

Steam Workshop yalnızca Steam'de çalışır. Oyununuz patlama yaparsa ve onu Epic Games Store, Xbox veya PlayStation'a taşımak isterseniz, aniden tüm modlama ekosisteminizi kaybedersiniz. Konsol üreticileri Steamworks SDK'sını kesinlikle yasaklar, bu da konsol oyuncularınızın oyununuzu PC'de popüler yapan özel skinlerden ve silahlardan mahrum kalacağı anlamına gelir.

Ayrıca, Steam Workshop sıfır runtime doğrulaması sağlar. Kötü niyetli bir kullanıcı, rastgele kod yürütmek, dedicated servers'larınızı çökertmek için binlerce actor spawn etmek veya kendilerine yönetici ayrıcalıkları tanımak üzere tasarlanmış Blueprint'ler içeren bir .pak dosyası cook edebilir.

Bunu çözmek için özel, cross-platform bir UGC backend'i oluşturmak; coğrafi olarak dağıtılmış dosya depolama (CDN), otomatik .pak doğrulama pipeline'ları (yüklenen modları kötü amaçlı Blueprint'ler için tarayan headless UE5 örnekleri) ve ağlar arası kimlik doğrulama kurulumu gerektirir. Bu altyapıyı manuel olarak mimari etmek kolayca 4-6 aylık özel backend mühendisliği gerektirir.

horizOn ile bu backend hizmetleri önceden yapılandırılmış olarak gelir. Steam'in ekosistemine hapsolmak yerine, birleşik, cross-platform bir mod portalı barındırmak için horizOn'un Backend-as-a-Service çözümünü kullanabilirsiniz. Xbox'taki oyuncular PC oyuncularıyla tamamen aynı .pak dosyalarına göz atabilir ve indirebilir; horizOn backend'i ise binlerce eşzamanlı indirmeye hizmet etmek için gereken güvenli dağıtımı, oyuncu kimlik doğrulamasını ve database sharding işlemlerini yönetir. Bu, yarım yılınızı kendi AWS altyapınızı yönetmekle geçirmek yerine oyununuzu piyasaya sürmenize olanak tanır.

UE5 Modding Entegrasyonu İçin En İyi Uygulamalar

Özel asset swap'ları uyguluyorsanız, oyununuzun topluluk içeriğinin ağırlığı altında çökmesini önlemek için bu savaşta test edilmiş kurallara uyun:

  1. Sunucudaki İstemci .pak Dosyalarına Asla Güvenmeyin: Oyununuz multiplayer ise, dedicated server collision bounds ve hitbox'ları belirlemelidir. Bir oyuncu karakter modelini 10 kat küçülten bir Workshop modu indirirse, sunucu yine de orijinal, modlanmamış collision capsule'ü kullanmalıdır. Görseller istemci tarafındadır; fizik sunucu tarafındadır.
  2. Mount Point'lerinizi Sanitize Edin: Mount işleminden hemen sonra bir .pak dosyasının içeriğini taramak için Unreal'ın Asset Registry'sini kullanın. Eğer .pak dosyası UBlueprint veya UClass assetleri içeriyorsa (ve oyununuz yalnızca kozmetik mesh swap'larını destekliyorsa), dosyayı hemen unmount edin ve işaretleyin. Yalnızca USkeletalMesh, UTexture2D ve UMaterial sınıflarının doğrulamadan geçmesine izin verin.
  3. Swap'lar İçin Async Loading Uygulayın: Aktif oynanış sırasında 50MB'lık bir karakter mesh'i için asla senkron bir LoadObject çağrısı kullanmayın. Ana thread'i donduracak ve büyük bir ping spike'ına neden olacaktır. Asset'i karaktere uygulamadan önce arka planda stream etmek için her zaman FStreamableManager::RequestAsyncLoad kullanın.
  4. Skeleton İsimlendirme Kurallarını Standartlaştırın: Modkit'inizde katı bir isimlendirme kuralı uygulayın. Bir mod yapımcısı kemik hiyerarşisini değiştirirse veya root kemiğini yeniden adlandırırsa, Unreal'ın retargeting işlemi başarısız olur ve ortaya korkunç, bozulmuş bir mesh çıkar. Modkit'inizde, mod yapımcılarını cook etmeden önce skeleton'ları sizinkiyle tam olarak eşleşmiyorsa uyaran bir doğrulama betiği sağlayın.

Sonuç

Unreal Engine 5'e Steam Workshop işlevselliği eklemek ham 3D dosyaları ayrıştırmakla ilgili değil; Unreal'ın dahili packaging ve mounting sistemlerinde ustalaşmakla ilgilidir. Temiz bir Modkit sağlayarak, Steamworks ile arayüz oluşturmak için C++ kullanarak ve sanal dosya sisteminizi güvenli bir şekilde yöneterek, topluluğunuzu inanılmaz içerikler oluşturması için güçlendirebilirsiniz.

Ancak her zaman geleceği planlayın. Oyununuz Steam'in ötesine geçtikçe, backend mimarinizin de onunla birlikte ölçeklenmesi gerekir. Altyapı zahmetine girmeden güvenli, cross-platform bir UGC sistemi uygulamaya hazırsanız, horizOn'u ücretsiz deneyin.