Bu eğitimde, belirli özellikleri mümkün kılmak için Verse kullanılmaktadır. Bu eğitimde Verse’ü kullanarak şunları yapabilirsin:
Bir oynanış mekaniği oluşturmak için animasyonları aralıklı olarak tetikleyip oynat.
Bir mini oyundaki tüm oyuncular için oyuncunun puan bilgisini günceller.
Oyuncu doğma gecikmeleri ve aralıklı eşya çıkma zamanları oluştur.
Aşağıdaki görevleri yerine getirmek için bu kodu tekrar kullanabilirsin:
Oyun, merkezden oynanışa ve oynanıştan tekrar merkeze geçerken etkin ve devre dışı olan cihazları değiştir.
Kazanan puanı bulmak ve bunu merkezde görüntülemek için oyuncuların puanlarını kontrol et.
Mini oyunun sonunda oyunu bitir ve oyuncuları merkeze geri ışınla.
Verse Cihazını ve Düzenlenebilir Objeleri Ayarlama
Verse cihazını ve düzenlenebilir objelerini ayarlamak için aşağıdaki adımları izle:
tiltnboomadlı yeni bir Verse cihazı oluştur ve bunu bölüme ekle. İzlenecek adımlar için Verse Kullanarak Kendi Cihazını Oluşturma bölümüne bakabilirsin.Dosyanın en üstüne aşağıdaki modülleri ekle:
Verseusing { /Fortnite.com/Characters } using { /Fortnite.com/Devices } using { /Fortnite.com/Game } using { /UnrealEngine.com/Temporary/Diagnostics } using { /Verse.org/Random } using { /Verse.org/Simulation }tiltnboomsınıf tanımına aşağıdaki alanları ekle:İki adet düzenlenebilir
tetikleyicicihazı, ActivateGameTrigger ve EndGameTrigger.ActivateGameTriggerbu oyunu etkinleştirmek için kullanılır. Bu tetikleyici; oyuna Işınlayıcı veya giriş sinematiği sonrası gibi herhangi bir şeyle tetiklenebilir.EndGameTriggerise mini oyunu sonlandırmak ve oyun bittikten sonra tüm kamera ve kontrol cihazlarını oyunculardan kaldırmak için kullanılır.
Verse@editable ActivateGameTrigger:trigger_device = trigger_device{} @editable EndGameTrigger:trigger_device = trigger_device{}GameTimer adlı düzenlenebilir bir Süreölçer Cihazı. Bu cihaz belirli bir süre sonrasında oyunu sonlandırır.
CannonballSequencesadlı bir Sinematik Sekans cihazlarıdizisi. Dizideki her cihaz farklı bir gülle iniş konumu oynatır.DamageVolumes adlı bir dizi Hasar Bölgesi. Bu etki aktörleri oyunun durumuna göre etkinleşir veya devre dışı kalır.
ItemSpawners adlı bir dizi Eşya Çıkma Yeri. Bu çıkma yerleri oyun sırasında rastgele sayıda eşya ortaya çıkarır.
CaptureArea adlı bir Ele Geçirme Alanı Cihazı. Bu cihaz, oyunculara sandalda kaldıkları için puan verir ve oyunun durumuna göre etkinleşir veya devre dışı kalır.
Bir oyun başladığında oyuncuların puanlarını sıfırlayan ve oyunun sonunda kazanan oyuncuyu belirleyen
ScoreManageradlı bir Puan Yöneticisi cihazı.Oyun bittikten sonra herkesi merkeze geri getiren
HUBTeleporteradlı bir Işınlayıcı.PlayerReference adlı bir Oyuncu Referansı. Bu referans, oyunlar arasındayken merkezde kazanan oyuncuyu gösterir.
Verse@editable GameTimer:timer_device = timer_device{} @editable CannonballSequences:[]cinematic_sequence_device = array{} @editable DamageVolumes:[]damage_volume_device = array{} @editable
PlayerSpawnersveHUBSpawnersadlı iki düzenlenebilir Oyuncu Doğma Karesi dizisi. Bunlar mini oyun sona erdiğinde, doğmayı devre dışı bırakır ve sonrasında oyuncuları merkeze geri götürür.Verse@editable PlayerSpawners:[]player_spawner_device = array{} @editable HUBSpawners:[]player_spawner_device = array{}MinimumItemSpawnTimeveMaximumItemSpawnTimeadlı iki düzenlenebilirkayan değer. Bunlar sandalda ortaya çıkan eşyalar arasında beklenecek minimum ve maksimum süreyi belirtir.Verse@editable MinimumItemSpawnTime:float = 5.0 @editable MaximumItemSpawnTime:float = 10.0DelayAfterGameadlı düzenlenebilir birkayan değer. Bu değer, oyun sona erdikten sonra oyuncuların merkeze ışınlanması için beklenen süreyi belirtir.Verse@editable DelayAfterGame:float = 5.0DelayBetweenCannonballSequencesadlı birkayan değer. Bu değer, mini oyun sırasında sekanslar arasında güllelerin ortaya çıkması için beklenen süreyi belirtir.VerseDelayBetweenCannonballSequences:float = 8.0Oyunun aktif olup olmadığını belirlemek için kullanılan
GameActiveadlı bir mantık değişkeni.Versevar GameActive:logic = false
Oyunu Başlatmak
Mini oyun başladığında çeşitli cihazlar etkinleştirilir ve oyuncu puanı sıfırlanır.
tiltnboomsınıf tanımının üzerine, mini oyuna özel mesajlar yazdırmak için bir günlük kanalı ekle. Ardından, günlük kanalıyla birlikte kullanmak için sınıf tanımına bir Günlük Kaydedici ekle.Versetiltnboom_log_channel := class(log_channel){} # A Verse-authored creative device that can be placed in a level tiltnboom := class(creative_device): Logger:log = log{Channel := tiltnboom_log_channel}Bir
InitiatingAgentalan ve oyunu başlatantiltnboomsınıf tanımınaOnTriggeredadında yeni bir metot ekle. Oyun zaten çalışırken tekrar bir oyun başlatmak istemeyeceğinden metoda, oyunun halihazırda aktif olup olmadığını döndüren bir if ifadesi ekle.VerseOnTriggered(InitiatingAgent:?agent):void= if (GameActive?): return spawn{StartGame()}OnBegin()’de, oyunu başlatmak için ActivateGameTrigger’ınTriggeredEvent’iniOnTriggeredfonksiyonuna bağla. Mini oyunun başında etkin olması gereken tüm cihazlar bu olaya bağlanacak ve OnTrigger olayı tetiklendiğinde etkinleşecektir.VerseOnBegin<override>()<suspends>:void= ActivateGameTrigger.TriggeredEvent.Subscribe(OnTriggered)Oyunu başlatma mantığını işleyen
StartGame()adında yeni bir metot ekle. Bu fonksiyonun asenkron bir şekilde çalışabilmesi için ona<suspends>değiştiricisini ekle.İlk olarak, oyunun aktif olduğu sinyalini vermek için
GameActive’itrueolarak ayarla. ArdındanCaptureArea’yı veDamageVolumesdizisindeki her birDamageVolume’ü etkinleştir.Her oyuncu için, eğer oyuncunun puanı 0’dan yüksekse oyuncuya onun mevcut puanının tersini ödül olarak vererek puanını sıfırla. Böylece oyuncunun puanı 0 olarak ayarlanacaktır.
Ardından bir yarış ifadesinde süreölçerin sonlanması, gülle sekansının çalışması ve rastgele eşyaların ortaya çıkması arasında geçiş yap. Gülle sekansı ve rastgele eşya ortaya çıkarma, sonsuz döngülerdir fakat süreölçer sona erdiğinde iptal edilirler.
Oyun sona erdiğinde oyun sonu temizliği için
OnGameFinished()fonksiyonunu çağır.VerseStartGame()<suspends>:void= Logger.Print("Starting game.") set GameActive = true CaptureArea.Enable() for (DamageVolume : DamageVolumes): DamageVolume.Enable() for:
Gülle Döngüsü Oluşturma
Bu bölümde, gülle Sinematik Sekansları oynatan bir fonksiyonun eklenmesi ele alınmaktadır.
tiltnboomsınıf tanımına, gülle bölüm sekanslarını oynatan ve gecikme ifadesini oynatıp gülleler arasına bir gecikme eklemek için bir döngü kullananStartCannonSequence()adında yeni bir metot ekle. Bu fonksiyonun asenkron bir şekilde çalışabilmesi için ona<suspends>değiştiricisini ekle.Bir döngü içinde,
CannonballSequencesdizisiniGetRandomInt()ile dizinleyerek CannonballSequences dizisinde rastgele bir sekans seç. Sekansı oynat, ardından başka bir sekans oynatmadan önceDelayBetweenCannonballSequenceskadar süre boyunca uyut.VerseStartCannonSequence()<suspends>:void= loop: RandomCannonballSequence:int = GetRandomInt(0, CannonballSequences.Length - 1) if (CannonballSequence := CannonballSequences[RandomCannonballSequence]): Logger.Print("Set CannonballSequence to {RandomCannonballSequence}") CannonballSequence.Play()
Rastgele Çıkan Eşya Döngüleri Oluşturma
Bu bölümde, sandalda rastgele konumlarda döngü halinde rastgele eşya çıkmasını sağlayan bir fonksiyon oluşturulması ele alınmaktadır. Bu fonksiyon, oyuncuların mini oyunu kazanma şansını olumlu veya olumsuz etkileyebilir.
titlnboomsınıf tanımınaSpawnRandomItemsadlı yeni bir metot ekle. Bu metot, sandalda çıkan eşyaları kontrol eder.ItemSpawnersdizisindeki eşya sayısını al, ardından dizide döngü kur. Diziden rastgele bir eşya oluşturma yeri almak için rastgele birintkullan ve ardından bunu etkinleştir. Eşya çıkışları arasında rastgele bir süre boyunca uyut.Döngü kaç eşyanın çıkacağına rastgele bir şekilde karar verir ve
NumberOfItemsToSpawnsayıda çıkaracağı eşyayı rastgele bir şekilde seçer.DelayBetweenItemSpawns, çıkmalar arasında önceden belirlenmemiş bir bekleme süresi oluşturur.VerseSpawnRandomItems()<suspends>:void= ItemSpawnerCount:int = ItemSpawners.Length - 1 loop: NumberOfItemsToSpawn:int = GetRandomInt(0, ItemSpawnerCount) # Spawn a randomly selected item, as many times as NumberOfItemsToSpawn. for: CurrentItemSpawnNumber := 0..NumberOfItemsToSpawn
Oyunu Sonlandırma
Mini oyun bittiğinde, kazanan oyuncunun puanını merkeze göndermeli, cihazları devre dışı bırakmalı ve oyuncuları merkeze geri ışınlanmalısın.
tiltnboomsınıf tanımınaOnGameFinishedadlı yeni bir metot ekle. Oyun sona erdiğinde bu fonksiyon, oyunu ve ilgili cihazları devre dışı bırakır.~~~(verse) OnGameFinished()<suspends>:void= Logger.Print("Oyun bitti.") set GameActive = false
CaptureArea.Disable()
for (PlayerSpawner : PlayerSpawners): PlayerSpawner.Disable()
for (DamageVolume : DamageVolumes): DamageVolume.Disable() ~~~
En yüksek puanlı oyuncuyu takip etmek için
HighestScoreint değişkeninive bu oyuncuya yönelikWinningPlayerseçenek değişkeni referansını ekle.Versevar HighestScore:int = -1 var WinningPlayer:?agent = falseBir for/do ifadesinde, oyun alanındaki tüm oyuncuları al ve ardından her biri için
FortCharacter’ı al. Oyuncuların oyunu kutlayabilmesi için ifade kullanmalarına ve dönmelerine olanak sağlamak üzere yeni birstasis_argskümesi iletecek şekilde karakteriPutInStasis()kullanarak yerinde dondur.Versefor: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: FortCharacter.PutInStasis(stasis_args{AllowTurning := true, AllowEmotes := true})Bir
ififadesinde, kazanan puanı bulup merkezdeki Oyuncu Referansı cihazında depolamak için her oyuncunun puanını kontrol et.Verseif (ScoreManager.GetCurrentScore(Player) > HighestScore): set HighestScore = ScoreManager.GetCurrentScore(Player) set WinningPlayer = option{Player}Son olarak başka bir if ifadesinde, kazanan bir puan bulunduğunda herkesi merkeze geri ışınlamak için
TeleportPlayersToHUB()’ı çağır.Verseif(Winner := WinningPlayer?): PlayerReference.Register(Winner) TeleportPlayersToHUB()
Oyuncuları Merkeze Geri Işınlama
Puanlar hesaplanıp kazanan açıklandıktan sonra tüm oyuncular merkeze geri ışınlanmalıdır.
tiltnboom sınıf tanımına
TeleportPlayersToHUB()adında yeni bir metot ekle. Bu metot, merkezdeki tüm oyuncu çıkma yerlerini etkinleştirir, ardından herkesi merkeze geri ışınlamadan önce birkaç saniye bekler. Bu metot, oyunculardan kamera ve kontrol cihazlarını kaldırmak içinEndGameTrigger’ı da tetiklemelidir.VerseTeleportPlayersToHUB()<suspends>:void= for (HUBSpawner : HUBSpawners): HUBSpawner.Enable() Sleep(DelayAfterGame) EndGameTrigger.Trigger()Bir
forifadesinde, her oyuncuyuHUBTeleporter’a geri ışınla ve durağan durumdan çıkar.Versefor: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: HUBTeleporter.Teleport(Player) Sleep(1.0) FortCharacter.ReleaseFromStasis()
Kendi Kendine Yapabileceklerin
Süreölçer Cihazının yapacağı farklı görevler oluşturmak için bu kodu değiştir. Mini oyunun ne kadar uzun olacağını belirlemek yerine, yarışın süresini belirlemek için Süreölçer Cihazını kullanabilirsin.
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Game }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
tiltnboom_log_channel := class(log_channel){}
# A Verse-authored creative device that can be placed in a level