Üst Öğe: learn-game-mechanics-in-unreal-editor-for-fortnite Order: 0 Type: tutorial Tags: verse Tags: cihazlar Tags: Süreklilik Hero-image:persistence-hero.png Topic-image:persistence-topic.png Social-image:persistence-social.png
Birçok deneyimde, oyuncu deneyimi verilerini zaman içinde izlemek için oyuncu istatistikleri kullanılır. Yüksek puan, kazanılan toplam oyun sayısı, toplam oyun süresi ve toplanan eşyalar gibi istatistikler oyunculara ilerleme hissi verir ve oyuncuları deneyimine geri dönmeye teşvik eden harika yollardır.
Verse Sürekliliği, Verse kodlarına kalıcı veriler eklemene olanak sağlayan güçlü bir araçtır. Kalıcı veriler oyuncu başına ve ada başına kaydedilir, oyun oturumları arasında aynı kalır. Kalıcı veriler, oyun oturumları arasında oyuncu ilerlemesini izlemene olanak sağlayarak daha önce UEFN'de bulunmayan çeşitli benzersiz ve ilginç oyun deneyimlerinin önünü açar.
Bu eğitimde, Verse ile özel oyuncu istatistiklerini nasıl oluşturacağın ve bunları deneyimin birden fazla kez oynandığında kalıcı olacak şekilde nasıl ayarlayacağın gösterilecektir. Bu eğitimi bitirdikten sonra, oyun içi sıralamaları oluşturmak için sürekliliği nasıl kullanacağını öğrenmek için Verse’te kendi oyun içi sıralamanı oluştur bölümüne göz at.
Kullanılan Verse Dili Özellikleri
-
Sınıf: Bu örnek, tek bir istatistiği yöneten bir Verse sınıfının yanı sıra tek oyuncu için bir grup istatistiğini izleyen kalıcı bir sınıf oluşturur.
-
Oluşturucu: Oluşturucu, ilişkili olduğu sınıfın bir örneğini oluşturan özel bir fonksiyondur.
-
weak_map: weak_map, üzerinde yineleme yapılamayan basit bir haritadır. Verse kalıcı verilerinin bir weak_map içinde saklanması gerekir.
Bölümü Ayarlama
Bu örnekte aşağıdaki nesne ve cihazlar kullanılıyor.
-
2 x Düğme cihazı: Oyuncu cihazla etkileşime geçtiğinde, mevcut puanına bir puan ekleyecektir. Bir oyunun sonunu simüle etmek için başka bir düğme cihazı kullanacak, oyuncunun mevcut puanına bağlı olarak galibiyet veya mağlubiyetlerine ekleme yapacaksın.
-
1 x Billboard cihazı: Kalıcı verilerin oyuncuya gösterilmesi genellikle önemlidir. Bu bazen test amacıyla, bazen de oyuncu katılımını artırmak veya ilerlemeyi göstermek için yapılır. Verilerin ne zaman gösterileceğine ve hangi verilerin gösterileceğine ilişkin gereksinimler deneyimden deneyime değişmekle birlikte, bu örnekte bir billboard cihazında puan, yüksek puan, galibiyetler ve mağlubiyetler için istatistik verilerini göstereceksin.

Kalıcı Oyuncu İstatistiklerini İzleme
Öncelikle, oyuncu başına hangi istatistikleri izlemek istediğini tanımlamak önemlidir. Örneğin, bir oyuncunun tüm zamanlardaki puanını, geçerli sıralamasını veya bir turdaki en iyi süresini takip etmek isteyebilirsin. Bu örnekte, her oyuncu için bir istatistik değerleri tablosunda puan, galibiyet ve mağlubiyetleri izleyeceksin. Bunu, ana kalıcı sınıfın olacak olan player_stats_table
adındaki bir sınıfta yapacaksın.
player_stats_table
sınıfını oluşturmak için şu adımları izle:
-
Verse Gezgini ile
player_stats_table.verse
adında yeni bir Verse dosyası oluştur. -
Yeni Verse dosyasında
player_stat_table
adında yeni bir sınıf oluştur. Sınıfına hem<persistable>
hem de<final>
değiştiricilerini ekle.<persistable>
değiştiricisi sınıftaki verilerin kalıcı olmasını sağlar ve kalıcı veriler geçersiz kılınamayacağından veya alt sınıf oluşturulamayacağından<final>
değiştiricisini gerektirir.using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } # Her oyuncu için farklı kalıcı istatistikleri izler. player_stats_table := class<final><persistable>:
-
player_stats_table
tablosunaScore
,Wins
veLosses
adında üçplayer_stat
değeri ekle. Bunlar her oyuncu için oyun boyunca sırasıyla skoru, galibiyetleri ve mağlubiyetleri izler. Ayrıca,player_stats_table' tablosunun mevcut sürümünü izlemek için
Versionadında bir
int` ekle.# Her oyuncu için farklı kalıcı istatistikleri izler. player_stats_table := class<final><persistable>: # Geçerli istatistik tablosunun sürümü. Version<public>:int = 0 # Bir oyuncunun puanı. Score<public>:int = 0 # Bir oyuncu için galibiyet sayısı. Wins<public>:int = 0 # Bir oyuncu için mağlubiyet sayısı. Losses<public>:int = 0
-
player_stat_table
sınıfının bir örneğini oluşturmak için, bir<constructor>
fonksiyonu kullanacaksın. Verse sürekliliği, değişken alanlar içeren sınıfların kalıcı olmasına izin vermediğinden bu oluşturucu gereklidir. Bir oluşturucu kullanmak, değişken olan mevcut bir kalıcı istatistiğin kopyasını oluşturarak kalıcı sınıf değerlerini güncellemene, kopyayı güncellemene ve ardından sınıfın orijinal örneğini değiştirilen değerlerle değiştirmene olanak sağlar. DosyanaMakePlayerStatsTable()
adında yeni bir oluşturucu fonksiyon ekle. Bu oluşturucuplayer_stats_table
sınıfının orijinal (önceki) bir örneğini alıp belirtilen orijinal değerlerden yeni birini oluşturacaktır.# Önceki player_stats_table ile aynı değerlere sahip yeni bir player_stats_table oluşturur. MakePlayerStatsTable<constructor>(OldTable:player_stats_table)<transacts> := player_stats_table: Version := OldTable.Version Score := OldTable.Score Wins := OldTable.Wins Losses := OldTable.Losses
-
Tüm
player_stats_tables
sınıflarını izlemek için,player
ileplayer_stats_table
örnekleri arasında başka bir kalıcıweak_map
kullanacaksın. Bu zayıf haritayı dosyana ekle.# Oyuncuları, oyuncu istatistiklerinin bir tablosuyla eşleştirir. var PlayerStatsMap:weak_map(player, player_stats_table) = map{}
-
Tamamlanmış
player_stats_table
sınıfın şimdi şu şekilde görünmelidir:using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } # Her oyuncu için farklı kalıcı istatistikleri izler. player_stats_table := class<final><persistable>: # Geçerli istatistik tablosunun sürümü. Version<public>:int = 0 # Bir oyuncunun puanı. Score<public>:int = 0 # Bir oyuncu için galibiyet sayısı. Wins<public>:int = 0 # Bir oyuncu için mağlubiyet sayısı. Losses<public>:int = 0 # Önceki player_stats_table ile aynı değerlere sahip yeni bir player_stats_table oluşturur. MakePlayerStatsTable<constructor>(OldTable:player_stats_table)<transacts> := player_stats_table: Version := OldTable.Version Score := OldTable.Score Wins := OldTable.Wins Losses := OldTable.Losses # Oyuncuları, oyuncu istatistiklerinin bir tablosuyla eşleştirir. var PlayerStatsMap:weak_map(player, player_stats_table) = map{}
Tüm Oyuncular için Oyuncu İstatistiklerini Yönetme
player_stats_table
sınıfın tek bir oyuncu için istatistikleri izlemeni sağlar, ancak henüz bunları yönetmenin bir yolu yoktur. Her oyuncu puan kazandığında istatistik tablolarını güncellemen gerekir ve deneyiminin tasarımına bağlı olarak aynı anda birçok oyuncu olabilir.
Bunu çözmek için, tüm oyuncuların istatistiklerini yönetmek ve bir oyuncu kazandığında, kaybettiğinde veya puan aldığında istatistik değişikliklerini kaydetmek için başka bir sınıf kullanacaksın. Yönetici sınıfını ayarlamak için aşağıdaki adımları izle.
-
Verse Gezgini ile
player_stats_manager
adında yeni bir Verse dosyası oluştur. Bu dosyada yeni birplayer_stats_manager
sınıfı oluştur.using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } # Her oyuncu için player_stat_tables'ı yönetir ve günceller. player_stats_manager := class():
-
player_stats_manager
ın birkaç görevi yerine getirmesi gerekir. Bir oyuncu için birplayer_stats_table
oluşturması, her oyuncu içinPuan
,Galibiyetler
veMağlubiyetler
i güncellemesi ve bir oyuncu içinplayer_stats_table
ı döndürmesi gerekir. Bunların her birini ayrı fonksiyonlarda ele alacaksınız.player_stats_manager
sınıf tanımına yeni birInitializePlayer()
fonksiyonu ekle. Bu fonksiyon belirtilen oyuncu için istatistikleri başlatır.# Belirtilen oyuncu için istatistikleri başlat. InitializePlayer(Player:player):void=
-
InitializePlayer()
fonksiyonunda, belirtilen oyuncununPlayerStatsMap
içinde zaten var olup olmadığını kontrol et. Yoksa, o oyuncunun haritadaki değerini yeni birplayer_stats_table
a ayarla. TamamladığınInitializePlayer()
fonksiyonu aşağıdaki gibi görünmelidir:# Belirtilen oyuncu için istatistikleri başlat. InitializePlayer(Player:player):void= if: not PlayerStatsMap[Player] set PlayerStatsMap[Player] = player_stats_table{} else: Print("Oyuncu istatistikleri başlatılamıyor")
-
player_stats_manager
sınıf tanımına yeni birInitializeAllPlayers()
fonksiyonu ekle. Bu fonksiyon bir dizi oyuncuyu alır ve tümüneInitializePlayer()
çağrısı yapar. TamamladığınInitializeAllPlayers()
fonksiyonu aşağıdaki gibi görünmelidir:# Mevcut tüm oyuncular için istatistikleri başlat. InitializeAllPlayers(Players:[]player):void = for (Player : Players): InitializePlayer(Player)
-
Belirli bir oyuncunun istatistiklerini döndürmek için, o oyuncunun
player_stats_table
ını döndüren bir fonksiyona ihtiyacın vardır.player_stats_manager
sınıf tanımına bir aracı alan yeni birGetPlayerStats()
fonksiyonu ekle. Bir oyuncunun istatistik tablosunun mevcut olmaması durumunda bu fonksiyonun başarısız olmasına ve geri dönmesine izin vermek için<decides><transacts>
değiştiricisini ekle.GetPlayerStats()
içinde, yeni birplayer_stats_table
değişkeni olanPlayerStats
ı oluştur.# Belirtilen aracı için player_stats_table’ı döndür. GetPlayerStats(Agent:agent)<decides><transacts>:player_stats_table= var PlayerStats:player_stats_table = player_stats_table{}
-
Bir
if
ifadesinde, bu fonksiyona aktarılanAgent
ı birPlayer
a dönüştür ve ardındanPlayerStatsMap
ten bu oyuncu içinplayer_stats_table
ı al. ArdındanMakePlayerStatsTable()
fonksiyonunu çağırarakPlayerStats
ı bu tabloya ata. Son olarak,PlayerStats
ı döndür. TamamladığınGetPlayerStats()
fonksiyonu aşağıdaki gibi görünmelidir:# Belirtilen aracı için player_stats_table’ı döndür. GetPlayerStats(Agent:agent)<decides><transacts>:player_stats_table= var PlayerStats:player_stats_table = player_stats_table{} if: Player := player[Agent] PlayerStatsTable := PlayerStatsMap[Player] set PlayerStats = MakePlayerStatsTable(PlayerStatsTable) PlayerStats
-
Puan, galibiyet ve mağlubiyet istatistiklerinin her birini güncellemek için her istatistiği ayrı ayrı güncelleyecek fonksiyonlar oluşturacaksın.
player_stats_manager
dosyanaAddScore()
adlı yeni bir fonksiyon ekle. Bu fonksiyon, skor ödülü verecek aracıyı ve onlara verilecekint
puan sayısını alır.# Belirtilen aracının skoruna ekleme yapar ve her iki istatistik tablosunu da günceller # istatistikler tablosunu hem de bölümdeki panoyu günceller. AddScore<public>(Agent:agent, NewScore:int):void=
-
Veriler, önce oyuncunun kalıcı
weak_map
içinde geçerli verilere sahip olduğunu doğrulayarak ve ardından bu verileri sınıfın güncellenmiş bir kopyasıyla değiştirerek güncellenir. Puanın işlenmesi için, oyuncunun skorunuPlayerStatsTable
dan al, ardındanPlayerStatsMap
içindeki tabloyuMakeUpdatedPlayerStatsTable()
ile yeni birplayer_stats_table
oluşturmanın sonucuna ayarla ve ardından bu tablodaki skoru yeni skorla topla. Birden fazla alan içeren bir sınıfla çalışırken, sınıf oluşturucusu her güncelleme yapmak istediğinde tüm alanları açıkça kopyalamadan tek bir alanı kolayca güncellemeni sağlar.AddScore()
fonksiyonun şu şekilde görünmelidir:# Belirtilen aracının skoruna ekleme yapar ve her iki istatistik tablosunu da günceller # istatistikler tablosunu hem de bölümdeki panoyu günceller. AddScore<public>(Agent:agent, NewScore:int):void= if: Player := player[Agent] PlayerStatsTable := PlayerStatsMap[Player] CurrentScore := PlayerStatsTable.Score set PlayerStatsMap[Player] = player_stats_table: MakePlayerStatsTable<constructor>(PlayerStatsTable) Score := CurrentScore + NewScore else: Print("Oyuncunun skoru kaydedilemedi")
-
Bu işlemi galibiyet ve mağlubiyetler için tekrarla ve
MakePlayerStatsTable()
fonksiyonunu çağırırken oyuncunun galibiyet veya mağlubiyetlerine sırasıylaNewWins
veNewLosses
ekle.# Belirtilen aracının galibiyetlerine ekler ve her iki istatistik tablosunu da günceller # istatistikler tablosunu hem de bölümdeki panoyu günceller. AddWin<public>(Agent:agent, NewWins:int):void= if: Player := player[Agent] PlayerStatsTable := PlayerStatsMap[Player] CurrentWins := PlayerStatsTable.Wins set PlayerStatsMap[Player] = player_stats_table: MakePlayerStatsTable<constructor>(PlayerStatsTable) Wins := CurrentWins + NewWins else: Print("Oyuncu galibiyetleri kaydedilemiyor") # Belirtilen aracının mağlubiyetlerine ekler ve her iki istatistik tablosunu da günceller # istatistikler tablosunu hem de bölümdeki panoyu günceller. AddLoss<public>(Agent:agent, NewLosses:int):void= if: Player := player[Agent] PlayerStatsTable := PlayerStatsMap[Player] CurrentLosses := PlayerStatsTable.Losses set PlayerStatsMap[Player] = player_stats_table: MakePlayerStatsTable<constructor>(PlayerStatsTable) Losses := CurrentLosses + NewLosses else: Print("Oyuncunun mağlubiyetleri kaydedilemedi")
-
Nihai
player_stats_manager
dosyan şu şekilde görünmelidir.using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } # Her oyuncu için player_stat_tables'ı yönetir ve günceller. player_stats_manager := class(): # Belirtilen aracı için player_stats_table’ı döndür. GetPlayerStats(Agent:agent)<decides><transacts>:player_stats_table= var PlayerStats:player_stats_table = player_stats_table{} if: Player := player[Agent] PlayerStatsTable := PlayerStatsMap[Player] set PlayerStats = MakePlayerStatsTable(PlayerStatsTable) PlayerStats # Mevcut tüm oyuncular için istatistikleri başlat. InitializeAllPlayers(Players:[]player):void = for (Player : Players): InitializePlayer(Player) # Belirtilen oyuncu için istatistikleri başlat. InitializePlayer(Player:player):void= if: not PlayerStatsMap[Player] set PlayerStatsMap[Player] = player_stats_table{} else: Print("Oyuncu istatistikleri başlatılamıyor") # Belirtilen aracının skoruna ekleme yapar ve her iki istatistik tablosunu da günceller # istatistikler tablosunu hem de bölümdeki panoyu günceller. AddScore<public>(Agent:agent, NewScore:int):void= if: Player := player[Agent] PlayerStatsTable := PlayerStatsMap[Player] CurrentScore := PlayerStatsTable.Score set PlayerStatsMap[Player] = player_stats_table: MakePlayerStatsTable<constructor>(PlayerStatsTable) Score := CurrentScore + NewScore else: Print("Oyuncunun skoru kaydedilemedi") # Belirtilen aracının galibiyetlerine ekler ve her iki istatistik tablosunu da günceller # istatistikler tablosunu hem de bölümdeki panoyu günceller. AddWin<public>(Agent:agent, NewWins:int):void= if: Player := player[Agent] PlayerStatsTable := PlayerStatsMap[Player] CurrentWins := PlayerStatsTable.Wins set PlayerStatsMap[Player] = player_stats_table: MakePlayerStatsTable<constructor>(PlayerStatsTable) Wins := CurrentWins + NewWins else: Print("Oyuncu galibiyetleri kaydedilemiyor") # Belirtilen aracının mağlubiyetlerine ekler ve her iki istatistik tablosunu da günceller # istatistikler tablosunu hem de bölümdeki panoyu günceller. AddLoss<public>(Agent:agent, NewLosses:int):void= if: Player := player[Agent] PlayerStatsTable := PlayerStatsMap[Player] CurrentLosses := PlayerStatsTable.Losses set PlayerStatsMap[Player] = player_stats_table: MakePlayerStatsTable<constructor>(PlayerStatsTable) Losses := CurrentLosses + NewLosses else: Print("Oyuncunun mağlubiyetleri kaydedilemedi")
Cihazlarla Kalıcılığı Test Etme
Artık kalıcılık sınıflarını ayarladığına göre, bunları bölümünde test etme zamanı geldi.
-
player_stats_example adındai bir Verse cihazı oluştur. Buna ilişkin adımlar için Verse Kullanarak Kendi Cihazını Oluştur bölümüne bakabilirsin.
-
player_stats_example
sınıf tanımının üst kısmına aşağıdaki alanları ekle:-
ScorePointsButton
adında düzenlenebilir birbutton_device
. Bu buton etkinleştirildiğinde oyuncunun skoruna eklenir.# Etkinleştiren oyuncunun puanına eklenir. @editable ScorePointsButton:button_device = button_device{}
-
StatsBillboard
adında düzenlenebilir birbillboard_device
. Bu, oyuncunun Puanını, Yüksek Puanını, Galibiyetlerini ve Mağlubiyetlerini gösterir.# Oyuncunun Puanını, Yüksek Puanını, Galibiyetlerini ve Mağlubiyetlerini gösterir. @editable StatsBillboard:billboard_device = billboard_device{}
-
CheckWinButton
adında düzenlenebilir bir button_device. Bu düğme her oyuncunun puanını sıfırlar ve oyuncunun puanına bağlı olarak onlara bir galibiyet veya mağlubiyet verir.# Oyuncunun puanını sıfırlar ve mevcut puanının WinScore’dan büyük # olup olmadığına bağlı olarak onlara bir galibiyet veya mağlubiyet verir. @editable CheckWinButton:button_device = button_device{}
-
WinScore
adında düzenlenebilir birint
. Bu,CheckWinButton
etkinleştirildikten sonra oyuncuların bir galibiyet kazanmak için ulaşmaları gereken skordur.# CheckWinButton etkinleştirildikten sonra oyuncuların bir galibiyet kazanmak için # ulaşması gereken puan. @editable WinScore:int = 10
-
AwardScore
adında düzenlenebilir birint
. Bu, butonla etkileşime girdiğinde oyunculara verilen skordur.# Düğmeye basma başına verilecek skor miktarı. @editable AwardScore:int = 1
-
PlayerStatsManager
adında birplayer_stats_manager
. Bu, tüm oyuncular için istatistikleri yönetir ve günceller.# Her oyuncu için istatistikleri yönetir ve günceller. PlayerStatsManager:player_stats_manager = player_stats_manager{}
-
Dört tamsayı (Skor, MaxScore, Galibiyetler ve Mağlubiyetler) alan
StatsMessage
adında bir mesaj. Bu mesajı panoda bir oyuncunun istatistiklerini görüntülemek için kullanacaksın.# Bir oyuncunun istatistiklerini billboardda gösterir. StatsMessage<localizes>(Player:agent, Score:int, Wins:int, Losses:int):message = "{Player}, Stats:\n Score: {Score}\n Wins: {Wins}\n Losses: {Losses}"
-
-
Kodunu derle ve Verse ile yazılmış cihazını adana sürükle. Buna ilişkin adımlar için Verse Cihazını Bölümüne Ekleme bölümüne bakabilirsin.
-
Cihazının Ayrıntılar panelinde, bölümündeki Düğme cihazını ScorePointsButton olarak, Billboard cihazını da StatsBillboard olarak ata.
-
Belirli bir oyuncunun istatistiklerini StatsBillboard'da görüntülemek için,
player_stats_example
sınıf tanımına yeni birUpdateStatsBillboard()
fonksiyonu ekle. Bu fonksiyon, istatistikleri görüntülenecek aracıyı alır.# Belirtilen oyuncunun istatistiklerini alır ve istatistiklerini # StatsBillboard'da görüntüler. UpdateStatsBillboard(Agent:agent):void=
-
UpdateStatsBillboard()
da, istatistik yöneticisinin
GetPlayerStats[]fonksiyonunu çağırarak belirtilen aracının mevcut istatistiklerini al. Ardından yeni bir
StatsMessage()nesnesi geçirerek StatsBillboard üzerinde
SetText()fonksiyonunu çağır. Bu
StatsMessage()nesnesini oluşturmak için, aracının mevcut istatistiklerinden ulaşarak aracının skorunu, galibiyetlerini ve mağlubiyetlerini al. Tamamladığın
UpdateStatsBillboard()` fonksiyonu aşağıdaki gibi görünmelidir:# Belirtilen oyuncunun istatistiklerini alır ve istatistiklerini # StatsBillboard'da görüntüler. UpdateStatsBillboard(Agent:agent):void= if: # Belirtilen aracının mevcut istatistiklerini alır. CurrentPlayerStats := PlayerStatsManager.GetPlayerStats[Agent] then: StatsBillboard.SetText( StatsMessage( Player := Agent, Score:=CurrentPlayerStats.Score.CurrentValue, Wins:=CurrentPlayerStats.Wins.CurrentValue, Losses:=CurrentPlayerStats.Losses.CurrentValue ) )
-
player_stats_manager
sınıf tanımına yeni birInitializeAllPlayers()
fonksiyonu ekle. Bu fonksiyon bir aracıyı alır ve ScorePointsButton ile her etkileşime girdiğinde bu aracının puanına ekleme yapar.# Belirtilen oyuncunun puanına ekleme yapar ve hem PlayerStatsManager'daki # istatistikler tablosunu hem de bölümdeki panoyu günceller. AddScore(Agent:agent):void=
-
AddScore()
da, belirtilen aracının mevcut istatistiklerinin yanı sıra mevcut skorunu da al. Ardından
PlayerStatsManagerdan
AddScore()fonksiyonunu çağır, yeni bir skor vermek aracıyı ve
AwardScoreu aktar. Son olarak, belirtilen aracıyı aktararak
UpdateStatsBillboard()fonksiyonunu çağır. Tamamladığın
AddScore()` fonksiyonu aşağıdaki gibi görünmelidir:# Belirtilen oyuncunun puanına ekleme yapar ve hem PlayerStatsManager'daki # istatistikler tablosunu hem de bölümdeki panoyu günceller. AddScore(Agent:agent):void= if: CurrentPlayerStats := PlayerStatsManager.GetPlayerStats[Agent] CurrentScore := CurrentPlayerStats.Score then: Print("Geçerli skor: {CurrentScore}") PlayerStatsManager.AddScore(Agent, AwardScore) UpdateStatsBillboard(Agent)
-
CheckWin düğmesi ile etkileşime geçildiğinde oyuncuya bir galibiyet veya mağlubiyet vermek için player_stats_manager sınıf tanımına yeni bir
CheckWin()
fonksiyonu ekle.# CheckWinButton ile etkileşime geçtiklerinde oyuncuya # bir galibiyet veya mağlubiyet verir. CheckWin(Agent:agent):void=
-
Öncelikle, aracının geçerli skorunu takip etmek için bir
CurrentScore
değişkeni belirle. Ardından,AddScore()
fonksiyonunda olduğu gibi oyuncu istatistikleri tablosundan geçerli skorlarını al.# CheckWinButton ile etkileşime geçtiklerinde oyuncuya # bir galibiyet veya mağlubiyet verir. CheckWin(Agent:agent):void= var CurrentScore:int = 0 if: PlayerStats := PlayerStatsManager.GetPlayerStats[Agent] set CurrentScore = PlayerStats.Score
-
Aracının mevcut puanı
WinScore
dan büyükse,PlayerStatsManager
a bir galibiyet kaydetmen gerekir. Aksi takdirde, bir mağlubiyet kaydet. Son olarak, negatif birCurrentScore
ileAddScore()
fonksiyonunu çağırarak aracının puanını sıfırla, ardından aracının istatistiklerini istatistik panosunda göster. TamamladığınCheckWin()
fonksiyonu aşağıdaki gibi görünmelidir:# CheckWinButton ile etkileşime geçtiklerinde oyuncuya # bir galibiyet veya mağlubiyet verir. CheckWin(Agent:agent):void= var CurrentScore:int = 0 if: PlayerStats := PlayerStatsManager.GetPlayerStats[Agent] set CurrentScore = PlayerStats.Score then: Print("Geçerli skor: {CurrentScore}") if: CurrentScore > WinScore then: PlayerStatsManager.AddWin(Agent, 1) # Oyuncunun puan durumunu 0 olarak kaydederek puanını sıfırla. PlayerStatsManager.AddScore(Agent, -CurrentScore) else: PlayerStatsManager.AddLoss(Agent, 1) # Oyuncunun puan durumunu 0 olarak kaydederek puanını sıfırla. PlayerStatsManager.AddScore(Agent, -CurrentScore) UpdateStatsBillboard(Agent)
-
OnBegin()
fonksiyonunda,ScorePointsButton.InteractedWithEvent
öğesiniAddScore()
fonksiyonuna veCheckWinButton.InteractedWithEvent
öğesiniCheckWin()
fonksiyonuna bağla. ArdındanGetPlayers()
fonksiyonunu çağırarak oyundaki her oyuncunun dizisini al ve istatistik yöneticisininInitializeAllPlayers()
fonksiyonunu kullanarak tümünü başlat.# Cihaz, çalışmakta olan bir oyunda başlatıldığında çalışır OnBegin<override>()<suspends>:void= # Düğme Olaylarını Kaydet ScorePointsButton.InteractedWithEvent.Subscribe(AddScore) CheckWinButton.InteractedWithEvent.Subscribe(CheckWin) Players := GetPlayspace().GetPlayers() # Oyuncu istatistiklerini başlat PlayerStatsManager.InitializeAllPlayers(Players)
-
Kodunu kaydet ve derle.
Bölümündeki Kalıcılığı Test Etme
Kalıcı verilerini bir editör oturumunda test edebilirsin ancak oturumu kapatıp yeniden başlattığında bu veriler sıfırlanır. Verilerinin oturumlar arasında kalıcı olmasını sağlamak için bir oynanış testi oturumu başlatman ve Ada Ayarları içindeki belirli ayarları değiştirmen gerekir. Kalıcı verileri hem editör hem de oynanış testi oturumlarında test etmek üzere adanı ayarlamayla ilgili bilgi almak için kalıcı veriler sayfasındaki Kalıcı Verilerle Test Etme bölümünü incele.
Oturumunu ayarladıktan sonra, bölümünü oynatarak test ettiğinde, ScorePoints düğmesi ile etkileşim oyuncunun puanına eklenmeli ve bu güncelleme billboardda gösterilmelidir. CheckWin düğmesi ile etkileşim, oyuncunun puanına bağlı olarak oyuncunun galibiyetlerine veya mağlubiyetlerine eklenmelidir. Lobiye döndükten ve adaya yeniden girdikten sonra, oyuncunun istatistikleri devam etmeli ve toplam galibiyetleri / mağlubiyetleri ile yüksek puanları güncellendiğinde billboardda gösterilmelidir.

Kendi Kendine Yapabileceklerin
Bu kılavuzu tamamlayarak, oynanış oturumları boyunca devam eden ve oyuncu başına izlenen kalıcı veriler oluşturmak için Verse’ü nasıl kullanacağını öğrendin. Şimdi kendi deneyimini geliştirmek için kalıcılığı nasıl uyarlayabileceğini keşfetmeye hazır mısın?
- Bir oyuncunun ulaştığı son kontrol noktasını hatırlayan bir kayıt dosyası sistemi oluşturabilir misin?
- Hangi karakterlerle konuştuğunu ve onlarla mevcut ilişkini hatırlayan bir sisteme ne dersin?
- Oyunculara hedeflere ulaşmaları için oturumlar boyunca sadece sınırlı bir süre tanıyan ve başarısız olmaları halinde ilerlemelerini sıfırlayan bir sisteme ne dersin?
Tam Kod
Bu eğitim bölümünde oluşturulan kodun tamamı şöyledir.
player_stats_table.verse
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# Her oyuncu için farklı kalıcı istatistikleri izler.
player_stats_table := class<final><persistable>:
# Geçerli istatistik tablosunun sürümü.
Version<public>:int = 0
# Bir oyuncunun puanı.
Score<public>:int = 0
# Bir oyuncu için galibiyet sayısı.
Wins<public>:int = 0
# Bir oyuncu için mağlubiyet sayısı.
Losses<public>:int = 0
# Önceki player_stats_table ile aynı değerlere sahip yeni bir player_stats_table oluşturur.
MakePlayerStatsTable<constructor>(OldTable:player_stats_table)<transacts> := player_stats_table:
Version := OldTable.Version
Score := OldTable.Score
Wins := OldTable.Wins
Losses := OldTable.Losses
# Oyuncuları, oyuncu istatistiklerinin bir tablosuyla eşleştirir.
var PlayerStatsMap:weak_map(player, player_stats_table) = map{}
player_stats_manager.verse
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# Her oyuncu için player_stat_tables'ı yönetir ve günceller.
player_stats_manager := class():
# Belirtilen aracı için player_stats_table’ı döndür.
GetPlayerStats(Agent:agent)<decides><transacts>:player_stats_table=
var PlayerStats:player_stats_table = player_stats_table{}
if:
Player := player[Agent]
PlayerStatsTable := PlayerStatsMap[Player]
set PlayerStats = MakePlayerStatsTable(PlayerStatsTable)
PlayerStats
# Mevcut tüm oyuncular için istatistikleri başlat.
InitializeAllPlayers(Players:[]player):void =
for (Player : Players):
InitializePlayer(Player)
# Belirtilen oyuncu için istatistikleri başlat.
InitializePlayer(Player:player):void=
if:
not PlayerStatsMap[Player]
set PlayerStatsMap[Player] = player_stats_table{}
else:
Print("Oyuncu istatistikleri başlatılamıyor")
# Belirtilen aracının skoruna ekleme yapar ve her iki istatistik tablosunu da günceller
# istatistikler tablosunu hem de bölümdeki panoyu günceller.
AddScore<public>(Agent:agent, NewScore:int):void=
if:
Player := player[Agent]
PlayerStatsTable := PlayerStatsMap[Player]
CurrentScore := PlayerStatsTable.Score
set PlayerStatsMap[Player] = player_stats_table:
MakePlayerStatsTable<constructor>(PlayerStatsTable)
Score := CurrentScore + NewScore
else:
Print("Oyuncunun skoru kaydedilemedi")
# Belirtilen aracının galibiyetlerine ekler ve her iki istatistik tablosunu da günceller
# istatistikler tablosunu hem de bölümdeki panoyu günceller.
AddWin<public>(Agent:agent, NewWins:int):void=
if:
Player := player[Agent]
PlayerStatsTable := PlayerStatsMap[Player]
CurrentWins := PlayerStatsTable.Wins
set PlayerStatsMap[Player] = player_stats_table:
MakePlayerStatsTable<constructor>(PlayerStatsTable)
Wins := CurrentWins + NewWins
else:
Print("Oyuncu galibiyetleri kaydedilemiyor")
# Belirtilen aracının mağlubiyetlerine ekler ve her iki istatistik tablosunu da günceller
# istatistikler tablosunu hem de bölümdeki panoyu günceller.
AddLoss<public>(Agent:agent, NewLosses:int):void=
if:
Player := player[Agent]
PlayerStatsTable := PlayerStatsMap[Player]
CurrentLosses := PlayerStatsTable.Losses
set PlayerStatsMap[Player] = player_stats_table:
MakePlayerStatsTable<constructor>(PlayerStatsTable)
Losses := CurrentLosses + NewLosses
else:
Print("Oyuncunun mağlubiyetleri kaydedilemedi")
player_stats_example.verse
using { /Fortnite.com/Devices }
using { /Fortnite.com/Game }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# Bir bölüme yerleştirilebilen, Verse ile yazılmış bir Kreatif cihazı
player_stats_example := class(creative_device):
# Etkinleştiren oyuncunun puanına eklenir.
@editable
ScorePointsButton:button_device = button_device{}
# Oyuncunun Puanını, Yüksek Puanını, Galibiyetlerini ve Mağlubiyetlerini gösterir.
@editable
StatsBillboard:billboard_device = billboard_device{}
# Oyuncunun puanını sıfırlar ve mevcut puanının WinScore’dan büyük
# olup olmadığına bağlı olarak onlara bir galibiyet veya mağlubiyet verir.
@editable
CheckWinButton:button_device = button_device{}
# CheckWinButton etkinleştirildikten sonra oyuncuların bir galibiyet kazanmak için
# ulaşması gereken puan.
@editable
WinScore:int = 10
# Düğmeye basma başına verilecek skor miktarı.
@editable
AwardScore:int = 1
# Her oyuncu için istatistikleri yönetir ve günceller.
PlayerStatsManager:player_stats_manager = player_stats_manager{}
# Bir oyuncunun istatistiklerini billboardda gösterir.
StatsMessage<localizes>(Player:agent, Score:int, Wins:int, Losses:int):message = "{Player}, Stats:\n Score: {Score}\n Wins: {Wins}\n Losses: {Losses}"
# Cihaz, çalışmakta olan bir oyunda başlatıldığında çalışır
OnBegin<override>()<suspends>:void=
# Düğme Olaylarını Kaydet
ScorePointsButton.InteractedWithEvent.Subscribe(AddScore)
CheckWinButton.InteractedWithEvent.Subscribe(CheckWin)
Players := GetPlayspace().GetPlayers()
# Oyuncu istatistiklerini başlat
PlayerStatsManager.InitializeAllPlayers(Players)
# Belirtilen oyuncunun puanına ekleme yapar ve hem PlayerStatsManager'daki
# istatistikler tablosunu hem de bölümdeki panoyu günceller.
AddScore(Agent:agent):void=
if:
CurrentPlayerStats := PlayerStatsManager.GetPlayerStats[Agent]
CurrentScore := CurrentPlayerStats.Score
then:
Print("Geçerli skor: {CurrentScore}")
PlayerStatsManager.AddScore(Agent, AwardScore)
UpdateStatsBillboard(Agent)
# Belirtilen oyuncunun istatistiklerini alır ve istatistiklerini
# StatsBillboard'da görüntüler.
UpdateStatsBillboard(Agent:agent):void=
if:
# Belirtilen aracının mevcut istatistiklerini alır.
CurrentPlayerStats := PlayerStatsManager.GetPlayerStats[Agent]
then:
StatsBillboard.SetText(
StatsMessage(
Player := Agent,
Score:=CurrentPlayerStats.Score,
Wins:=CurrentPlayerStats.Wins,
Losses:=CurrentPlayerStats.Losses
)
)
# CheckWinButton ile etkileşime geçtiklerinde oyuncuya
# bir galibiyet veya mağlubiyet verir.
CheckWin(Agent:agent):void=
var CurrentScore:int = 0
if:
PlayerStats := PlayerStatsManager.GetPlayerStats[Agent]
set CurrentScore = PlayerStats.Score
then:
Print("Geçerli skor: {CurrentScore}")
if:
CurrentScore > WinScore
then:
PlayerStatsManager.AddWin(Agent, 1)
# Oyuncunun puan durumunu 0 olarak kaydederek puanını sıfırla.
PlayerStatsManager.AddScore(Agent, -CurrentScore)
else:
PlayerStatsManager.AddLoss(Agent, 1)
# Oyuncunun puan durumunu 0 olarak kaydederek puanını sıfırla.
PlayerStatsManager.AddScore(Agent, -CurrentScore)
UpdateStatsBillboard(Agent)