Doğrudan Olay Bağlama’ya aşina isen, olaylar kavramı ile Kreatif cihazları için üzerinde çalışmaya alışık olduğun fonksiyonlar Verse için de benzerdir. Olaylar gerçekleştiğinde çalışan kendi fonksiyon ve davranışlarını kodlamak için, Verse’ü kullanabilirsin!
Aşağıdaki bölümlerde, Verse’te Kreatif cihazı olayları üzerinde çalışarak kendi mantığını kodlamanın farklı yolları açıklanmaktadır.
Kreatif Cihazı Olaylarına Fonksiyonları Bağlama
Kreatif cihazlarının API’larında kullanıma sunduğu olaylara bağlanabilirsin. Örneğin, Buton cihazının sınıfı button_device, oyuncu Buton cihazıyla her etkileşime geçtiğinde gerçekleşen InteractedWithEvent’i kullanıma sunar. Olayda Subscribe()’ı çağırabilir ve olayın işareti verildiğinde çağırmak istediğin fonksiyonun tanımlayıcısını aktarabilirsin.
Bağlanma, bir olaya işaret verildiğinde çağrılacak bir fonksiyon belirlemene olanak tanır; buna bir olaya bağlanma denir. Bağlı işleve işleyici adı verilir. Aşağıdaki örnekte, işleyici OnButtonInteractedWith’tir.
Olay tanımına bağlı olarak, işlev imzası, olayın çağırmayı beklediği şeyle eşleşmelidir. Örneğin, button_devicea ilişkin InteractedWithEvent olayına bağlanılması, agent türünde bir parametreye sahip bir fonksiyon verilmesini bekler, dolayısıyla OnButtonInteractedWith fonksiyonu şöyle görünecektir:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
hello_world_device := class(creative_device):
@editable
MyButtonDevice:button_device = button_device{}
OnBegin<override>()<suspends>:void=
# OnButtonInteractedWith fonksiyonunu Buton cihazının InteractedWithEvent’ine bağla
MyButtonDevice.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
OnButtonInteractedWith(InAgent:agent):void=
Print("Oyuncu butonla etkileşime geçti!")
Bir cihaz olayında Subscribe() çağrısı yaptığında fonksiyon bir cancelable sonucu döndürür. Bir cancelable değişkeni üzerinde Cancel() çağrısı yapıldığında olayı işleyen fonksiyonun bağlantısı kaldırılır, böylece olaya işaret verildiğinde fonksiyon artık çağrılmaz.
Tek bir “iptal edilebilir” sonuç saklamak istiyorsan, seçenek gibi bir kapsayıcı kullanabilirsin. Doğrudan “iptal edilebilir” değişken oluşturamazsın, ancak bir aboneliğin sonucunu tutmak için “seçenek” değişkeni ayarlayabilirsin.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
spawner_button := class(creative_device):
@editable
Button:button_device = button_device{}
# Olay aboneliğini saklamak için kapsayıcı
var ButtonSubscription:?cancelable = false
OnBegin<override>()<suspends>:void=
ButtonSubscription := Button.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
# İptal edilebilir sonucu seçenek değişkenindeki değer olarak ayarla.
set ButtonSubscription = option{Subscription}
Print("Butonun InteractedWithEvent'ine abone oldu ve aboneliği ButtonSubscription değişkenine atadı!")
OnButtonInteractedWith(InPlayer:agent):void=
Print("Oyuncu butonla etkileşime geçti!")
# InteractedWithEvent bağlamasına ilişkin iptal edilebilir değişkene erişim sağla.
if(CancelableResult := ButtonSubscription?):
CancelableResult.Cancel()
Print("Bu InteractedWithEvent iptal edildi")
Verse cihazının birden fazla olay bağlaması varsa, her olay bağlamasından gelen tüm cancelable sonuçları daha sonra iptal edebilmen için depolamak amacıyla dizi gibi bir kapsayıcı kullanman iyi bir fikirdir. Subscribe() çağrısı bir cancelable sonucu döndürdüğü için cancelable dizinin değerlerini, olaylara ilk bağlandığında ayarlayabilirsin.
Oyuncu Butona Bastığında Eşya Çıkarma Örneği

Bu bölümde, oyuncu bir butonla etkileşime geçtiğinde eşyasını çıkaran bir eşya çıkma yeri oluşturmayı öğreneceksin.
- Öncelikle bölümüne bir Eşya Çıkma Yeri cihazı ile Buton cihazı yerleştir. Bölümünde nasıl cihaz yerleştireceğine dair bilgiler için Kreatif Kullanıcıları için UEFN Kontrolleri bölümünde Obje Yerleştirme’ye bakabilirsin.
- Eşya Çıkma Yeri cihazı için hangi eşyanın çıkacağını ayarla. Daha fazla bilgi için Eşya Çıkma Yeri Cihazı’na bakabilirsin.
- Buton cihazı ile Eşya Çıkma Yeri cihazı için düzenlenebilir özelliklere sahip bir Verse cihazı oluştur. Bölümündeki bir Kreatif Cihazına Verse Referansı Ekleme sayfasına bak.
- Buton cihazı aboneliğini takip etmek için cihaza bir “cancelable” seçenek değişkeni ekle.
- “InteractedWithEvent”e abone ol, sonucu bir “seçenek”e dönüştür ve “ButtonSubscription” değişkenine ata.
- “InteractedWithEvent”’e ilişkin olay işleyicide “ItemSpawner.SpawnItem()”’ı çağır. Ardından “ButtonSubscription” seçeneğinin içindeki değere erişip “Cancel()” fonksiyonunu çağırarak aboneliği iptal et.
- Oyuncu, Buton cihazıyla etkileşime girdiğinde bir eşya çıkarılmasına yönelik tam Verse kodu aşağıdadır. Buton cihazıyla ikinci kez etkileşime girilmesi başka bir eşyanın çıkarılmasını sağlamaz.
using { /Fortnite.com/Devices } using { /Verse.org/Simulation } spawner_button := class(creative_device): @editable Button:button_device = button_device{} @editable ItemSpawner:item_spawner_device = item_spawner_device{} # Olay aboneliğini saklamak için kapsayıcı var ButtonSubscription:?cancelable = false OnBegin<override>()<suspends>:void= Subscription := Button.InteractedWithEvent.Subscribe(OnButtonInteractedWith) # İptal edilebilir sonucu Bağlamalar dizisindeki bir noktaya ekle. set ButtonSubscription = option{Subscription} Print("Butonun InteractedWithEvent'ine abone oldu ve aboneliği ButtonSubscription değişkenine atadı!") OnButtonInteractedWith(InPlayer:agent):void= ItemSpawner.SpawnItem() # InteractedWithEvent bağlamasına ilişkin iptal edilebilir değişkene erişim sağla. if(CancelableResult := ButtonSubscription?): CancelableResult.Cancel() Print("Bu InteractedWithEvent iptal edildi")Oyununu başlat ve bir eşya çıkarmak için butonla etkileşime geç.
InteractedWithEventolayını iptal ettiğin için buton bir eşyayı yalnızca bir kere çıkarır.
Bu cihaz bağlamasını ve iptalini kullanan bir oyun örneği için Etiketli Işıklar Bulmacası Eğitimi’ne göz at!
Bir Kreatif Cihaz Olayının Beklenmesi
Olaylara bağlanabilirsin, ancak bir olayın gerçekleşmesini beklemenin başka bir yolu da vardır. Bir Kreatif cihazı olayında, asenk. bir fonksiyon çağrısı olan ve tamamlanması zaman alabilen Await() fonksiyonunu çağırabilirsin. Çağrının asenk. olması, onu bir eşzamanlılık ifadesi veya suspends belirticisine sahip bir fonksiyon gibi asenk. bir bağlamda kullanman gerektiği anlamına gelir. Eşzamanlılık hakkında daha fazla bilgi için, Zaman Akışı ve Eşzamanlılık bölümüne göz atabilirsin.
Aşağıdaki örnekte Verse cihazı, başka herhangi bir şeyin gerçekleşebilmesinden önce oyuncunun Tetikleyici cihazı ile etkileşime girmesini bekler. Oyuncu, Tetikleyici cihazından önce Buton cihazlarından herhangi biriyle etkileşime girerse, hiçbir şey olmaz. Oyuncu Tetikleyici cihazı ile etkileşime girdikten sonra bir seçim yapmalı ve iki butondan birini seçmelidir. Oyuncu yalnızca butonlardan biriyle etkileşime girebilir ve bir şeyin gerçekleşmesi için yalnızca bir kez etkileşimde bulunabilir çünkü kod, iki buton olayı arasında yarışmak için bir race ifadesi kullanmaktadır. Bu eşzamanlılık ifadesinin nasıl işlediğine dair daha fazla bilgi için, Yarış’a göz atabilirsin.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
make_a_choice_device:= class(creative_device):
@editable
MakeChoice:trigger_device = trigger_device{}
@editable
RedButton:button_device = button_device{}
@editable
BlueButton:button_device = button_device{}
OnBegin<override>()<suspends>:void=
# Bu, oyuncunun tetikleyicinin üzerine basmasını bekler ve bu gerçekleşene kadar başka herhangi bir kodun burada çalışmasını engeller.
# Buna göre oyuncu, iki buton cihazıyla etkileşime girerse bu olay gerçekleşene kadar hiçbir şey olmayacaktır.
MakeChoice.TriggeredEvent.Await()
Print("Bir seçim yap: kırmızı butonu seçerek harikalar diyarında kal veya mavi butonu seçerek tekrar yatağında uyan.")
# Bu yarış ifadesinde her iki blok ifadesi de aynı anda yürütülür.
# Oyuncu butonlardan biriyle etkileşime girdiğinde diğer butonun etkileşiminin beklenmesi iptal olur.
# Buna göre oyuncu, Buton cihazlarından yalnızca biriyle etkileşime girebilecektir.
race:
block:
RedButton.InteractedWithEvent.Await()
Print("Harikalar diyarında kalmayı seçtin.")
block:
BlueButton.InteractedWithEvent.Await()
Print("Yatağında uyanmayı seçtin.")
# Oyuncu bu noktada cihazlardan herhangi biriyle etkileşime girerse hiçbir şey olmayacaktır. Bunun sebebi, olayların yalnızca bir kez gerçekleşmesini beklemiş olmamızdır.
Bu olaylar yalnızca bir kez bekler. Bu olayları beklemeyi tekrarlamak istiyorsan bu mantığı istediğin kadar tekrarlamak için bir loop ifadesi kullanabilirsin.
Sonraki Adım: Cihazlar Modülü
Burada eşya oluşturma yerleri ve butonlarla nasıl çalışılacağını öğrendin, ancak kullanabileceğin ve kendi cihazından abone olabileceğin daha fazla kreatif cihazı vardır. Bu bilgileri Verse API Başvurusu’nda bulabilirsin. Verse’te çalışabileceğin tüm kreatif cihazlarını görmek için Cihazlar modülüne git.