Üç takım içinde Casuslar, oyunundaki en benzersiz rolü oynayan takımdır. Casuslar gizli hareket eder ve oyuna görünmez olarak başlarlar. Yüksek hasar verebilen bir sürgülü tüfekle doğarlar ve Savunmacı üssüne doğru gizlice ilerlerken gölgelerin içinden avlama puanları alabilirler. Ancak Casuslar her zaman görünmez değildir. Vurulduklarında görünmezliklerini geçici süreyle kaybederler ve titreşim şeklinde bir görünüp bir kaybolurlar.
Bu eğitimde bir Casus hasar gördüğünde takımdaki her Casusu titretmeyi veya yalnızca ilgili Casusun titremesini sağlamayı da öğreneceksin. Takım halinde titreme, Casuslar için daha zor bir deneyim oluşturur ancak onları daha dikkatli oynamaya teşvik eder.
Casusları doğduklarında nasıl görünmez yapacağını öğrenmek için bu adımları izle.
Görünmezlik Yöneticisini Oluşturma
Verse Gezgini’ni kullanarak invisibility_manager adlı yeni bir Verse cihazı oluştur ve cihazı bölüme sürükle.
Bir oyuncuyla ilişkili
fort_character’ı almak içininvisibility_managerdosyasının üstüneusing{ /Fortnite.com/Characters }ifadesini ekle.using { /Fortnite.com/Devices } using { /Fortnite.com/Characters } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics }invisibility_managersınıf tanımına aşağıdaki alanları ekle:Düzenlenebilir bir oyuncu çıkma yerleri dizisi olan
PlayerSpawners. Bu dizi, Casuslar için oyuncu çıkma yerlerini takip eder ve doğduklarında Casusları görünmez yapmak için kullanılırinvisibility_manager := class(creative_device): Logger:log = log{Channel := triad_invisibility_log_channel} # Casuslar takımı için oyuncu doğma karelerinin dizisi @editable PlayersSpawners:[]player_spawner_device = array{}Düzenlenebilir bir mantık olan
IsVisibilityShared. Bu mantık, hasar gördükten sonra titreşimin aynı anda tüm Casuslar için veya yalnızca hasar gören oyuncu için gerçekleşeceğini belirler.# Casuslar takımı için oyuncu çıkma yerleri dizisi @editable PlayersSpawners:[]player_spawner_device = array{} # Casusların görünürlük bilgisinin takım arkadaşlarıyla paylaşılıp paylaşılmadığı. @editable IsVisibilityShared:logic = trueDüzenlenebilir bir kayan sayı olan
VulnerableSecondsve düzenlenebilir bir kayan sayı olanFlickerRateSeconds. Birinci kayan değer Casusların hasar gördükten sonra ne kadar süreyle titreyeceğini belirlerken ikinci kayan değer ise titreşim animasyonunun ne kadar hızlı oynatılacağını kontrol eder.# Casusların görünürlük bilgisinin takım arkadaşlarıyla paylaşılıp paylaşılmadığını belirtir. @editable IsVisibilityShared:logic = true # Casusların hasar gördükten sonra ne kadar süreyle görünür olacağı. @editable VulnerableSeconds:float = 3.0 # Casusların hasar gördükten sonra ne kadar hızlı titreyeceğini belirtir. @editable FlickerRateSeconds:float = 0.4Teamsadlı değişken bir takım dizisi. Bu diziyi kullanarak bir oyuncunun Casus olup olmadığını kontrol edeceksin.# Casusların hasar gördükten sonra ne kadar çabuk titreyeceğini belirtir. @editable FlickerRateSeconds:float = 0.4 # Oyundaki tüm takımların dizisi. var Teams:[]team = array{}PlayerVisibilitySecondsadlı değişken biragent-floateşleştirmesi. Bu eşleştirme, her bir aracının hasar gördükten sonra kaç saniye titrediğini belirler.var Teams:[]team = array{} # Oyundaki tüm takımların dizisi. var Teams:[]team = array{} # Oyuncuların titremeye devam edecekleri kalan saniye miktarıyla eşleştirilmesi. var PlayerVisibilitySeconds:[agent]float = map{}
OnBegin()’de, cihazın başladığını doğrulamak için basit bir günlük ifadesi ekle. Yanlış takımdaki oyuncuların görünmez olmasını önlemek için, takımlartriad_infiltration_gamekoduyla dengelendikten sonrainvisibility_manager’ın çalıştığından emin olman gerekir. Bunu garanti etmek için koduOnBegin()’de çalıştırmak yerineinvisibility_manager’ıtriad_infiltration_game’den başlatmalısın.OnBegin<override>()<suspends>:void= # Oyuncuları görünür yapan olaylara abone olmadan önce takımların dengelenmesini bekle. Logger.Print("Takımların dengelenmesi bekleniyor...")invisibility_managersınıf tanımınaOnPlayerSpawn()adlı yeni bir metot ekle. Casusların her doğduğunda görünmez olmasını sağlaman gerektiği için önce bu fonksiyonu uygularsın.Verse# Handles a player spawning from an infiltrator spawn pad OnPlayerSpawn(SpawnedAgent:agent):void= Logger.Print("A player just spawned from an infiltrator spawn pad!")OnPlayerSpawn()’da,GetFortCharacter[]’ı kullanarak çıkarılan aracıyla ilişkilifort_character’ı al ve onuFortCharacterdeğişkenine kaydet. Ayrıca,GetTeam[]’i kullanarak çıkarılan aracının takımını al ve onuCurrentTeamdeğişkenine kaydet.Verse# Handles a player spawning from an infiltrator spawn pad OnPlayerSpawn(SpawnedAgent:agent):void= Logger.Print("A player just spawned from an infiltrator spawn pad!") if: FortCharacter:fort_character = SpawnedAgent.GetFortCharacter[] CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[SpawnedAgent]CurrentTeam’inTeamsdizisindeki birinci takım ile eşleşip eşleşmediğini kontrol et. Bu takım Casuslar olmalıdır. Eşleşiyorsa bu aracı bir casustur ve aracınınFortCharacter’ındaHide()’ çağırabilirsin. Bunu yaptığında aracı doğduğu zaman görünmez olacaktır.OnPlayerSpawn()fonksiyonun şu şekilde görünmelidir:Verse# Handles a player spawning from an infiltrator spawn pad OnPlayerSpawn(SpawnedAgent:agent):void= Logger.Print("A player just spawned from an infiltrator spawn pad!") if: FortCharacter:fort_character = SpawnedAgent.GetFortCharacter[] CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[SpawnedAgent] Teams[0] = CurrentTeam Logger.Print("Player spawned as an infiltrator, making them invisible") then: FortCharacter.Hide()
invisibility_managersınıf tanımınaStartInvisibilityManager()adlı yeni bir metot ekle. Bu fonksiyon, takım türünden bir dizi olanAllTeams’i, oyuncu türünden bir dizi olanAllPlayers’ı veteamtüründeki Casuslar takımına yönelik bir referansı alır. Bunu,invisibility_managermantığını başlatmak içintriad_infiltration_game’den çağıracaksın. Bu nedenle bu fonksiyonun,triad_infiltration_game’in onu bulabilmesi için<public>belirleyicisine sahip olması gerekir.# Görünmezlik yöneticisi mantığını başlatır. Takım dengeleme bittikten sonra triad_infiltration sınıfından çağrılır StartInvisibilityManager<public>(AllTeams:[]team, AllPlayers:[]player, Infiltrators:team):void= Logger.Print("Görünmezlik kodu başlatıldı!")StartInvisibilityManager()’da şunları yap:TeamsdizisiniAllTeamsdizisi olarak ayarla.# Görünmezlik yöneticisi mantığını başlatır. Takım dengeleme bittikten sonra triad_infiltration sınıfından çağrılır StartInvisibilityManager<public>(AllTeams:[]team, Players:[]player, Infiltrators:team):void= Logger.Print("Görünmezlik kodu başlatıldı!") set Teams = AllTeamsBir
fordöngüsünde,PlayerSpawners’daki her bir oyuncu çıkma yeriniOnPlayerSpawn()fonksiyonuna bağla.for(PlayerSpawner:PlayersSpawners): PlayerSpawner.SpawnedEvent.Subscribe(OnPlayerSpawn)Kod başlatıldığında her bir Casusu bulup görünmez yapman gerekir. Ayrıca
PlayerVisibilitySecondsharitanda bunlar için bir giriş oluşturman uygun olacaktır. Bu girişi daha sonra, hasar gören her bir Casusun ne kadar süreyle titreyeceğini takip etmek için kullanacaksın. TıpkıOnPlayerSpawn()’da olduğu gibi her oyuncu içinfort_character’ı veteam’i al.Versefor(PlayerSpawner:PlayersSpawners): PlayerSpawner.SpawnedEvent.Subscribe(OnPlayerSpawn) # For each player, if they spawned on the infiltrator team, spawn an OnInfiltratorDamaged function for that # player. Then make their character invisible. for(TeamPlayer:AllPlayers): if: FortCharacter:fort_character = TeamPlayer.GetFortCharacter[] CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[TeamPlayer]CurrentTeam’in, bu fonksiyona geçirdiğinCasuslartakımıyla eşleşip eşleşmediğini kontrol et. EşleşiyorsaPlayerVisibilitySeconds’ oyuncunun anahtarını0,0olarak ayarla.Versefor(TeamPlayer:AllPlayers): if: FortCharacter:fort_character = TeamPlayer.GetFortCharacter[] CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[TeamPlayer] Logger.Print("Got this player's current team") Infiltrators = CurrentTeam set PlayerVisibilitySeconds[TeamPlayer] = 0.0 Logger.Print("Added player to PlayerVisibilitySeconds")Son olarak oyuncunun
FortCharacter’ındaHide()’ı çağırarak oyuncuyu görünmez yap.StartInvisibilityManager’ın aşağıdaki gibi görünmelidir:Verse# Starts the invisibility manager logic. Called from triad_infiltration class after team balancing finishes StartInvisibilityManager<public>(AllTeams:[]team, Players:[]player, Infiltrators:team):void= Logger.Print("Invisibility script started!") set Teams = AllTeams for(PlayerSpawner:PlayersSpawners): PlayerSpawner.SpawnedEvent.Subscribe(OnPlayerSpawn) # For each player, if they spawned on the infiltrator team, spawn an OnInfiltratorDamaged function for that # player. Then make their character invisible. for(TeamPlayer:AllPlayers):
Görünmezlik Yöneticisini Üçlü Casusluk Oyunundan Çağırma
triad_infiltration_game’e geri dönerek sınıf tanımına düzenlenebilir birinvisibility_managerekle. Bu,triad_infiltration_gamecihazının bölümünde çağıracağı cihaz olacaktır.# Casusların görünmezliğini kontrol eden invisibility_manager koduna yönelik referans. @editable InvisibilityManager:invisibility_manager = invisibility_manager{}OnBegin()fonksiyonunda,BalanceTeams()’e yapılan çağrıdan sonraStartInvisibilityManager()’ı çağırarakTeams’i,AllPlayers’ı veInfiltrators’ı ilet.OnBegin()fonksiyonun şu şekilde görünmelidir:VerseOnBegin<override>()<suspends>:void = # Get all the Teams set Teams = GetPlayspace().GetTeamCollection().GetTeams() # Save the teams to later reference them set MaybeInfiltrators = option{Teams[0]} set MaybeAttackers = option{Teams[1]} set MaybeDefenders = option{Teams[2]} if: Infiltrators := MaybeInfiltrators?Dosyaları kaydet ve derle. Anahat Düzenleyicisi’nde cihazı seç ve casuslara dair mevcut tüm doğma karelerini PlayerSpawners dizisine ata.
Anahat Düzenleyicisi’nde triad_infiltration_game cihazını seç ve invisibility_manager cihazını, onun InvisibilityManager özelliğine ata.
Bölümün oynanış testini yapmak için UEFN araç çubuğunda Oturumu Başlat düğmesine tıkla.
Bölümüne oynanış testi uyguladığında her oyuncunun en büyük farka sahip takıma atanması ve kendi takımına uygun bir silahla doğması gerekir. Her Casus hem oyun başladığında hem de yeniden doğduğunda görünmez olmalıdır.
Sonraki Adım
Bu eğitimin bir sonraki adımında bir casus hasar gördüğünde onun karakterini nasıl titreteceğini öğreneceksin.