Anlatı sistemimde sıfır ile tanımsız neden aynı şey değil?
Coldwater Hollow’un NarrativeFramework altyapısında hikâye durumunu Gameplay Tag, integer değer ve açık tanımlılık bilgisiyle nasıl temsil ediyorum?
Coldwater Hollow, şu anda geliştirdiğim solo korku projem. Oyunla birlikte anlatı sistemleri için C++ tabanlı NarrativeFramework altyapısını da geliştiriyorum. Bu altyapının küçük ama önemli parçalarından biri, hikâye durumunu nasıl temsil ettiğim.
Açık tuttuğum ayrım
Uygulamamda hiç tanımlanmamış bir fact ile değeri sıfır olan bir fact farklı durumlar.
Örneğin bir görev sayacında sıfır, görevin mevcut olduğunu ama oyuncunun henüz ilerleme kaydetmediğini anlatabilir. Tanımsız değer ise görevin hikâyeye henüz dahil olmadığını ifade edebilir. Bu, yayımlanmış belirli bir görevin anlatımı değil; ayrımı göstermek için bir örnek.
Depo bir TMap<FGameplayTag, int32>. Narrative.Fact altında kayıtlı bir alt tag, fact’i tanımlıyor. Map’te bulunması tanımlı olup olmadığını, integer ise değerini gösteriyor.
İhtiyaç duyulan durumu sorgulamak
Subsystem farklı ihtiyaçlar için ayrı sorgular sunuyor:
IsFactDefined, fact’in mevcut olup olmadığını kontrol ediyor.GetFactValueIfDefined, yalnızca tanımlıysa bir değer döndürüyor.GetFactValueOrDefault, bilinçli olarak seçilmiş varsayılan değeri kullanıyor.
Böylece seçim, sorgunun yapıldığı yerde görünür kalıyor. Bir koşul, fact’in mevcut olup olmadığını özel bir sayısal değerden çıkarmak zorunda değil.
Reset, silmek anlamına gelmiyor
ResetFactValue, mevcut bir fact’in değerini sıfıra indiriyor. Fact tanımsızsa tanımsız kalıyor. UndefineFact ise fact’i depodan kaldırıyor.
Koşul tipi de IsDefined ve IsUndefined kontrollerini eşitlik veya büyüklük gibi integer karşılaştırmalarından ayırıyor. Flow düğümleri hem varlık hem ilerleme kontrolünü ifade edebiliyor.
Sahiplik ve bildirimler
Depo bir UGameInstanceSubsystem içinde tutuluyor. Durum değiştiğinde değer ve tanımlılık bildirimleri gönderiliyor; herhangi bir fact değişimi için de ayrı bildirim var. Başlangıç preset’leri oturumun ilk durumunu kuruyor.
Oyun büyürken bu ayrımı görünür tutmak istiyorum: hikâye neyi biliyor, bunu henüz biliyor mu ve değişiklik olduğunda hangi sistemler tepki vermeli? GameInstance sahipliği runtime yaşam süresini anlatıyor; tek başına verinin diske kaydedildiği anlamına gelmiyor.