Bir geri sayım süreölçerini çalıştıran Süreölçer cihazını kullanabilirsin, ancak Verse’te kendi geri sayım süreölçerini oluşturman halinde bu süreölçerin davranışını tam olarak ihtiyacın olan şeye uyacak şekilde özelleştirmen mümkün olacaktır.
Bu eğitim sana Verse ile kendi süreölçerini nasıl oluşturacağını ve geri sayıma zaman eklendiğinde nasıl çıkma kullanacağını gösterecek. Önce basit işlemlerle başla, daha sonra bunları bir projeden diğerine geçerken geliştirmenin yollarını bulacaksın.
Kullanılan Verse Dili Özellikleri
if:
ififadesi, koşulları test eder ve başarısız olabilecek değerlere erişir.block: Bu örnekte, geri sayım süreölçeri oluşturulduğunda kullanıcı arayüzünü başlatmak için
blockifadesi kullanılır.loop:
loopifadesi, kullanıcı arayüzünü günceller ve geri sayım sıfıra ulaştığında sona erer.spawn: Bir
spawnifadesi, herhangi bir bağlamda asenkron bir ifade başlatır.message: Mesaj türü, metnin yerelleştirilebileceği anlamına gelmekte olup bir mesaj değişkenini başlatmak için kullandığın dize, mesaj için varsayılan metin ve dildir.
class: Bu örnek, geri sayımı yöneten ve görüntüleyen bir Verse sınıfı oluşturur.
constructor: Oluşturucu, ilişkili olduğu sınıfın bir örneğini oluşturan özel bir fonksiyondur.
Erişim belirleyicileri: Kodunun erişim seviyesini ayarlamak için erişim belirleyicilerini kullanabilirsin.
Kullanılan Verse API’leri
Uyku:
Sleep()API’si ile, kullanıcı arayüzü güncellemeleri arasındaki süreyi seçebilirsin.Olaylar: Verse’te kendi olaylarını oluşturabilir ve bunlar meydana geldiğinde özel fonksiyonlar ekleyebilirsin.
Verse Kullanıcı Arayüzü: Oyuncu ve oyun ile ilgili bilgileri görüntülemek için özel bir oyun içi kullanıcı arayüzü oluştur.
Talimatlar
Kendi özel süreölçerini nasıl oluşturacağını öğrenmek için bu adımları izle. Tam kod, referans olması için bu kılavuzun sonuna eklenmiştir.
Bölümü Kurmak
Bu örnekte aşağıdaki nesne ve cihazlar kullanılıyor.
1 adet Düğme Cihazı: Oyuncu cihazla etkileşime geçtiğinde geri sayıma daha fazla zaman eklenir.
1 adet Oyunu Sonlandırma cihazı: Geri sayım sona erdiğinde bu cihaz oyunun bitmesine neden olur.
Bölümünü ayarlamak için şu adımları izle:
Bölümüne bir Buton cihazıyla Oyunu Sonlandırma cihazı ekle.
Yeni bir Verse cihazı oluştur ve Verse Explorer kullanarak cihazı,
countdown_timer_exampleolarak adlandır. İzlenecek adımlar için Verse Kullanarak Kendi Cihazını Oluştur kısmına bakabilirsin.countdown_timer_exampleiçindeki Buton cihazına düzenlenebilir bir referans ekle ve bunuAddMoreTimeButtonolarak adlandır. Buna ilişkin adımlar için Cihaz Özelliklerini Özelleştir kısmına bakabilirsin.Versecountdown_timer_example := class(creative_device): @editable AddMoreTimeButton : button_device = button_device{}countdown_timer_exampleiçindeki Oyunu Sonlandırma cihazına düzenlenebilir bir referans ekle ve bunuEndGameolarak adlandır.Versecountdown_timer_example := class(creative_device): @editable AddMoreTimeButton : button_device = button_device{} @editable EndGame : end_game_device = end_game_device{}Cihazında yaptığın değişiklikleri ayrıntılar panelinde görmek için Verse dosyanı kaydet ve UEFN ana menüsünde Verse > Verse Kodu Oluştur kısmını seçerek bölümde cihazını güncelle.
Geri Sayımı Başlatma
Bu örnekte kendi kullanıcı arayüzünü çizen ve kendi geri sayımını yöneten bir Verse sınıfı oluşturacaksın.
Özel geri sayım süreölçerini yapmak için şu adımları izle:
Boş bir Verse dosyası oluştur ve bunu countdown_timer.verse olarak adlandır.
Dosyanın en üstüne aşağıdaki Verse modüllerini ekle:
Verseusing { /UnrealEngine.com/Temporary/UI } using { /UnrealEngine.com/Temporary/SpatialMath } using { /Fortnite.com/UI } using { /Verse.org/Colors } using { /Verse.org/Simulation }Bir sınıf oluştur ve bunu
countdown_timerolarak adlandır, ardından aşağıdaki değişkenleri ekle:RemainingTimeadlı ve0,0olarak başlatılan bir kayan değişken.Versevar RemainingTime : float = 0.0Canvasadlı bir tuval widget değişkeni.Versevar Canvas : canvas = canvas{}Varsayılan beyaz metin renginde,
RemainingTimeWidgetadlı bir metin widget’ı.VerseRemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}RemainingTime’ın temsil ettiği değeri görüntülemek üzere bir tamsayı parametresi alan veRemainingTimeTextadlı bir mesaj döndüren bir fonksiyon.VerseRemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"MaybePlayerUIadlı vefalseolarak başlatılan isteğe bağlı bir oyuncu kullanıcı arayüzü.VerseMaybePlayerUI : ?player_ui = false
Sınıfın şöyle görünmelidir:
Versecountdown_timer := class: MaybePlayerUI : ?player_ui = false var RemainingTime : float = 0.0 var Canvas : canvas = canvas{} RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White} RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"Ekranın üst orta kısmında zamanın göründüğü kullanıcı arayüzünü oluşturmak için bir
blockifadesi ekle. Bir block ifadesi yalnızca sınıf oluşturduğunda çalışır, böylece kullanıcı arayüzünü bublockifadesinde bir kez oluşturabiliriz.Versecountdown_timer := class: block: set Canvas = canvas: Slots := array: canvas_slot: Anchors := anchors: Minimum := vector2{X := 0.5, Y := 0.05} Maximum := vector2{X := 0.5, Y := 0.05} Alignment := vector2{X := 0.5, Y := 0.0} Offsets := margin{Top := 0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}Kullanıcı arayüzünü görüntülemek için
StartCountdown()fonksiyonunu ekle.VerseStartCountdown() : void = Print("Starting countdown") if (PlayerUI := MaybePlayerUI?): PlayerUI.AddWidget(Canvas)countdown_timer_example.verse’te oyuncuya dair kullanıcı arayüzüne ve ilk geri sayım süresine yönelik bir referansla bir
countdown_timerörneği oluştur. Oyun başlar başlamaz geri sayımın görünmesi içinOnBegin()’deStartCountdown()’u çağır.Verseusing { /Verse.org/Simulation } using { /Fortnite.com/Devices } countdown_timer_example := class(creative_device): @editable AddMoreTimeButton : button_device = button_device{} @editable EndGame : end_game_device = end_game_device{}Şu anda oynanış testi yaparsan kullanıcı arayüzü, geri sayım başladığında kalan süreyi göstermez, bu nedenle countdown_timer.verse içinde kullanıcı arayüzündeki geçerli geri sayım değerini güncelleyen bir fonksiyon oluştur ve bunu
UpdateUI()olarak adlandır.StartCountdown()’daUpdateUI()fonksiyonunu çağır.VerseStartCountdown() : void = Print("Starting countdown") if (PlayerUI := MaybePlayerUI?): PlayerUI.AddWidget(Canvas) # Update the UI when we start the timer to see the initial RemainingTime on screen UpdateUI() UpdateUI() : void =Şimdi, ilk geri sayım kullanıcı arayüzünde görünür, ancak değer her saniye güncellenmez. Bunu yapmak için:
Kullanıcı arayüzünün saniye cinsinden ne sıklıkta güncelleneceğini temsil etmesi için
TimerTickPeriodkayan değişkenini ekle. Bu örnekte bir saniye kullanılmaktadır.VerseTimerTickPeriod : float = 1.0 # The timer "precision": how often, in seconds, it ticks.suspends belirleyicisine sahip bir fonksiyon oluşturarak buna
RunCountdown()adını ver ve fonksiyonuStartCountdown()’dan çağır. Kullanıcı arayüzünü güncellemeden önceRunCountdown()değeriniTimerTickPeriodkadar beklet ve bunu döngüde tekrarla. Döngüyü sona erecek şekilde ayarla ve geri sayım0,0değerine ulaştığında geri sayımın kullanıcı arayüzünden kaybolmasını sağla.VerseStartCountdown() : void = Print("Starting countdown") if (PlayerUI := MaybePlayerUI?): PlayerUI.AddWidget(Canvas) # Update the UI when we start the timer to see the initial RemainingTime on screen UpdateUI() spawn:
Oynanış testi yaptığında, geri sayımın 30'da başladığını ve süreölçer 0'a ulaşana ve geri sayım kullanıcı arayüzünden kaybolana kadar her saniye güncellendiğini görmen gerekir.
Daha Fazla Süre Ekleme
Bu geri sayım süreölçeriyle, daha fazla zaman eklemek ve eklenen zamanı çağırmak için özel bir yol eklemek isteyeceksin. Bu örnek, geri sayıma nasıl daha fazla süre ekleneceğini ve oyuncu Buton cihazıyla etkileşime geçtiğinde eklenen sürenin nasıl görüntüleneceğini gösterir.
Oyuncu Buton cihazıyla etkileşime geçtiğinde geri sayım süreölçerine daha fazla süre eklemek için şu adımları izle:
countdown_timer.verse içinde
RemainingTimedeğişkeniniTimeadlı kayan parametredeki fonksiyona iletilen değerle güncelleyen, ardından kalan yeni süreyi göstermek için kullanıcı arayüzünü güncelleyenAddRemainingTime()adlı yeni bir fonksiyon oluştur.VerseAddRemainingTime(Time : float) : void = set RemainingTime += Time # Immediately update the UI for better player feedback when time is added. UpdateUI()countdown_timer_example.verse içinde, Buton cihazının
InteractedWithEvent’ine abone ol ve oyuncu Buton cihazıyla etkileşime geçtiğindeAddRemainingTime()’ı çağır.Verseusing { /Verse.org/Simulation } using { /Fortnite.com/Devices } countdown_timer_example := class(creative_device): @editable AddMoreTimeButton : button_device = button_device{} @editable EndGame : end_game_device = end_game_device{}Oyuncu düğmeyle etkileşime geçtiğinde geri sayıma eklenen süreyi çağırmak için
countdown_timersınıfına bir widget ekle.VerseAddedTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White} AddedTimeText<localizes>(AddedTime : int) : message = " +{AddedTime}!"Yeni AddedTimeWidget için RemainingTime widget'ıyla aynı konumlandırma değerlerini kullan, ancak çıkma süresinin geri sayım zamanlayıcısının sağ üst tarafında görüntülenebilmesi için aşağıdaki değerleri değiştir:
AddedTimeWidget için ofsetlerdeki sol kenar boşluğunu
50,0olarak ayarla.RemainingTimeWidget için ofsetlerdeki üst kenar boşluğunu
25,0olarak ayarla.Versecountdown_timer := class: <# This block runs for each instance of the countdown_timer class. We can setup the canvas once here. #> block: set Canvas = canvas: Slots := array: canvas_slot: Anchors := anchors: Minimum := vector2{X := 0.5, Y := 0.05} Maximum := vector2{X := 0.5, Y := 0.05}
AddedTimeWidget’taki değeri güncelleyen ve widget’ı tekrar gizlemeden önce çıkmayı iki saniye boyunca görüntüleyen
AddedTimeCallout()adlı yeni bir fonksiyon oluştur.AddRemainingTime()içindeAddedTimeCallout()çağrısı yap.VerseAddRemainingTime(Time : float) : void = set RemainingTime += Time # Immediately update the UI for better player feedback when time is added. UpdateUI() # Fire a simple callout to show the time being added. spawn: AddedTimeCallout(Time)Oynanış testi yaptığında, geri sayımın 30'da başladığını ve süreölçer 0'a ulaşana ve geri sayım kullanıcı arayüzünden kaybolana kadar her saniye güncellendiğini görmen gerekir. Oyuncu butonla etkileşime geçtiğinde, geri sayıma yirmi saniye eklenir ve iki saniye boyunca eklenen ilave süreyi gösteren bir çıkma görünür.
Geri Sayım Süreölçeri Bitiş Sinyali
Bu eğitimde daha önce, oyuncunun butona ne zaman bastığını ve geri sayım süreölçerine daha fazla zaman eklediğini anlamak için InteractedWithEvent Buton cihazını kullanmıştın. Ancak kodunda bir şey olduğunda başkalarının da bunu anlamak için kullanabileceği kendi özel olaylarını da oluşturabilirsin.
Bu örnek, özel olayların aşağıdaki davranışlarının nasıl kullanılacağını gösterir:
Signal(): Bu fonksiyon, olayı bekleyen herkesin olayın gerçekleştiğini öğrenmesini sağlar.Await(): Bu asenkron fonksiyon, olay sinyali verilene kadar kendisinin kapsayan bağlamının yürütülmesini engeller.
Bu örnekte, Oyunu Sonlandırma cihazını etkinleştirebilmen için, geri sayım süreölçerine geri sayım bittiğinde sinyal verecek bir olay ekleyeceksin.
Geri sayım bitişine bir olay eklemek için şu adımları izle.
countdown_timersınıfınaCountdownEndedEventadlı bir olay alanı ekle:VerseCountdownEndedEvent : event() = event(){}event(), parametrik türdedir, yani bir değer veya obje örneği yerine bir sınıf veya arayüz döndürür. Türünevent()olmasının ve bir sınıf örneğini nasıl oluşturduğunu taklit etmek içinCountdownEndedEventsabitinievent(){}ile başlatmana dair gerekliliğin sebebi de budur.RunCountdown()’u,CountdownEndedEvent’e sinyal verecek şekilde güncelle. Böylece CountdownEndedEvent, diğer kod döngüden çıkmadan önce bu kodun geri sayımın sona erdiğini öğrenmesini sağlayacaktır.VerseRunCountdown()<suspends> : void = # We loop with the TimerTickPeriod. # The UI is also updated each time. loop: Sleep(TimerTickPeriod) set RemainingTime -= TimerTickPeriod UpdateUI() # Timer End if (RemainingTime <= 0.0):countdown_timer_example.verse dosyasında
CountdownTimerile ilişkiliCountdownEndedEventdeğerini bekle, ardından Oyunu Sonlandırma cihazını etkinleştir çünkü olay gerçekleştiğinde geri sayımın bittiğini biliyoruz.VerseOnBegin<override()<suspends> : void = AddMoreTimeButton.InteractedWithEvent.Subscribe(OnButtonInteractedWith) if: FirstPlayer := Self.GetPlayspace().GetPlayers()[0] PlayerUI := GetPlayerUI[player[FirstPlayer]] then: set CountdownTimer = countdown_timer{MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime} CountdownTimer.StartCountdown() CountdownTimer.CountdownEndedEvent.Await()Oynanış testi yaptığında, geri sayımın 30'da başladığını ve süreölçer 0'a ulaşana kadar her saniye güncellendiğini görmen gerekir. Geri sayım biter bitmez kullanıcı arayüzünden kaybolur ve oyun sona erer. Oyuncu butonla etkileşime geçtiğinde, geri sayıma yirmi saniye eklenir ve iki saniye boyunca eklenen süreyi gösteren bir açıklama balonu görünür.
Sınıfını Diğer Kodlar Tarafından Kullanılmak Üzere Hazırlama
Artık kendi özel geri sayım süreölçeri sınıfını oluşturdun ve süreölçerin örneğini oluşturmak ve süreölçeri denetlemek için Verse tarafından yazılan bir cihaz kullandın.
Kendi özel sınıflarını (ve aslında herhangi bir kodu) oluşturduğunda, oluşturduklarına kimlerin erişebileceğini belirlemen önemlidir. Örneğin, kullanıcı arayüzünü yalnızca geri sayım süreölçeri oluşturabilmeli ve değiştirebilmelidir. Verse’te kodunun erişim seviyesini ayarlamak için erişim belirleyicileri kullanabilirsin.
Başkalarının erişmesini istediğin tanımlayıcılara public belirleyicisini ekle çünkü herkese açık (public), tanımlayıcının evrensel olarak erişilebilir olduğu anlamına gelir. Bu örnekte aşağıdakilerin tamamı countdown_timer_example cihazında kullanılmıştır, bu yüzden herkese açık bir erişime sahip olmalıdır:
CountdownEndedEvent<public> : event() = event(){}StartCountdown<public>() : void =AddRemainingTime<public>(Time : float) : void =
Başkalarının erişmesini istemediğin tanımlayıcılara private belirleyicisini ekle çünkü özel (private), tanımlayıcıya yalnızca geçerli, o anki durumu barındıran kapsamda (bu durumda söz konusu kapsam countdown_timer sınıfıdır) erişilebileceği anlamına gelir.
Bu örnekte, aşağıdakiler özel erişime sahip olmalıdırlar:
RemainingTimeWidget<private> : text_block = text_block{DefaultTextColor := NamedColors.White}AddedTimeWidget<private> : text_block = text_block{DefaultTextColor := NamedColors.White}AddedTimeText<localizes><private>(AddedTime : int) : message = " +{AddedTime}!"RemainingTimeText<localizes><private>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"var Canvas<private> : canvas = canvas{}TimerTickPeriod<private> : float = 1.0RunCountdown<private>()<suspends> : void =AddedTimeCallout<private>(Time : float)<suspends> : void =UpdateUI<private>() : void =
Kodlarını erişime göre gruplandırmak iyi bir fikirdir. Kodlarını en yüksek miktarda erişimden en düşük miktarda erişime doğru sıralamanı öneririz:
herkese açık
Dahili
korunan
özel
Bir sınıfın değişkenlerini kullanıma açmadan yeni bir sınıf örneğinin başlangıç değerlerini ayarlamak için bir oluşturucu kullanabilirsin. Oluşturucu, ilişkili olduğu sınıfın bir örneğini oluşturan özel bir fonksiyondur.
RemainingTime ve MaybePlayerUI değişkenlerini güncelleyen countdown_timer sınıfı için bir oluşturucu yarat.
MakeCountdownTimer<constructor><public>(MaxTime : float, InPlayer : agent) := countdown_timer:
RemainingTime := MaxTime
MaybePlayerUI := option{GetPlayerUI[player[InPlayer]]}
Oluşturucuda ayarlanan RemainingTime ve MaybePlayerUI değişkenleri herkese açık erişime sahip olmamalıdır, ancak bir oluşturucuda ayarlanmışlarsa özel erişime sahip olamazlar. Bu değişkenler için internal belirleyicisini kullanabilirsin. Buna göre, tanımlayıcıya yalnızca geçerli, o anki durumu barındıran modülde erişilebilecektir.
MaybePlayerUI<internal> : ?player_ui = falsevar RemainingTime<internal> : float = 0.0
Tam Kod
Aşağıdaki kod, özel bir geri sayım süreölçeri oluşturmak için tam koddur.
Bu örnekte iki Verse dosyası oluşturulmuştur.
countdown_timer.verse
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/UI }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Simulation }
using { /Fortnite.com/UI }
MakeCountdownTimer<constructor><public>(MaxTime : float, InPlayer : agent) := countdown_timer:
RemainingTime := MaxTime
MaybePlayerUI := option{GetPlayerUI[player[InPlayer]]}
countdown_timer_example.verse
using { /Verse.org/Simulation }
using { /Fortnite.com/Devices }
using { /UnrealEngine.com/Temporary/UI }
countdown_timer_example := class(creative_device):
@editable
AddMoreTimeButton : button_device = button_device{}
@editable
Kendi Kendine Yapabileceklerin
Bu kılavuzu tamamlayarak özel bir geri sayım süreölçeri oluşturmayı öğrenmiş oldun.
Öğrendiklerini kullanarak aşağıdakileri yapmayı dene:
Süreölçer tik oranını değiştir ve her tik için bir olay ekle.
Süreölçere duraklatma, sürdürme ve yeniden başlatma işlevlerini ekle.