Etiketli Işıklar Bulmacası eğitimindeki bu adımı tamamlayarak oyun devam ederken belirli bir etiketle işaretlenmiş aktörleri bulmak için Oynanış Etiketlerini nasıl kullanacağını öğreneceksin. Oynanış Etiketleri, editörde referanslarını oluşturmak zorunda kalmadan birden fazla cihazla çalışmana olanak tanır. Bu seçenek, örneğin oyuncu oyunda ilerlerken aktif olan cihazları kodunun dinamik olarak değiştirmesi gibi ilgi çekici oynanış fırsatları yaratabilir.
Yeni bir Oynanış Etiketi oluşturmak ve bulmaca bölümündeki tüm ışıklara atamak için aşağıdaki adımları izle:
- Verse Gezgini menüsünü aç ve tagged_lights_puzzle.verse kodunu çift tıklayarak Visual Studio Code ile aç.
- Kod dosyasının en üstünde:
tagsınıfına başvurmak veGetCreativeObjectsWithTag()işlevini kullanmak içinusing { /Verse.org/Simulation/Tags }ekle.- Düzenlenebilir özellikler oluşturabilmek için
using { /Verse.org/Simulation }ekle.
using { /Fortnite.com/Devices } using { /Verse.org/Native } using { /UnrealEngine.com/Temporary/Diagnostics } using { /Verse.org/Simulation/Tags } using { /Verse.org/Simulation } log_tagged_lights_puzzle := class(log_channel){} -
log_tagged_lights_puzzlesınıfının üstünetagsınıfından devralanpuzzle_lightadlı yeni bir alt sınıf ekle. Devralınan sınıf adı, herhangi bir kreatif cihazında kullanman için özel bir oynanış etiketi haline gelir.# Yeni bir oynanış etiketi oluşturmak için Verse.org/Simulation/Tags modülünde `tag` sınıfından türet. puzzle_light := class(tag){} log_tagged_lights_puzzle := class(log_channel){} - UEFN araç çubuğunda Verse Kodları Oluştur (Build Verse Scripts) seçeneğine tıklayarak kodunu ve yeni
puzzle_lightOynanış Etiketini projene derle. - UEFN Anahat Düzenleyici menüsünden bir Özelleştirilebilir Işık Cihazı seçerek Ayrıntılar panelini aç.
- Ayrıntılar panelinde:
- Yeni bileşen ekle seçeneğine tıkla ve Verse etiket işaretleme öğesini seç.
- Arıntılar panelinde ayarlarını görüntülemek için VerseTagMarkup bileşenini seç.
- Oynanış Etiketleri altında Etiketler özelliğini düzenle ve
puzzle_lightetiketini ekle.

Her bir cihazın aynı anda birden fazla gruba ait olabilmesi için aynı cihaza birden fazla etiket eklenebilir. Örneğin,
GetCreativeObjectsWithTag(tag1{})veyaGetCreativeObjectsWithTag(tag2{})çağrıldığındatag1vetag2etiketine sahip bir cihaz bulunacaktır. tagged_lights_puzzlesınıf tanımına iki değişken dizisi alanı ekle:- Tüm ışıkların geçerli durumunu (açık veya kapalı) göstermek için
LightsStateadlı düzenlenebilir birlogicdeğişkeni. Bu değişken, aynı zamanda ışıkların başlangıç durumunu öğe sayısıpuzzle_lightetiketiyle işaretlenmiş ışık sayısıyla eşleşecek şekilde ayarlamak için kullanılır. Bu örnekte varsayılan olarak tüm ışıklar kapalıdır, bu yüzden tüm ışıklar için başlangıç değerifalseşeklindedir.@editable var LightsState : []logic = array{false, false, false, false} puzzle_lightOynanış Etiketi ile etiketlenmiş tüm Özelleştirilebilir Işık cihazlarını depolamak içinLightsadlı düzenlenebilir bircustomizable_light_devicedeğişken dizisi.@editable var Lights : []customizable_light_device = array{}
- Tüm ışıkların geçerli durumunu (açık veya kapalı) göstermek için
- Oyun başladığında cihaz,
LightsStatedizisinde belirtilen başlangıç yapılandırmasıyla eşleşecek şekilde ışıkları ayarlamalı ve referansları, oyun durumu değiştiğinde güncellenebilecek şekildeLightsdizisine kaydetmelidir. Bu işlemSetupPuzzleLights() : voidadlı bir yöntemde yapılacak ve oyun başladığında ışıkların ayarlanması içinOnBegin()yönteminde çağrılacaktır.SetupPuzzleLights() : void = Logger.Print(“Setting up in-game lights”) OnBegin<override>()<suspends> : void = SetupPuzzleLights() SetupPuzzleLights()işlevindeGetCreativeObjectsWithTag(puzzle_light{})çağrısı yaparakpuzzle_lightetiketine sahip tüm cihazları bul veTaggedActorsadlı bir diziye kaydet.TaggedActors, kapsamıSetupPuzzleLights()yönteminde yerel olan sabit bir dizi olduğundan dizi için açıkça bir tür belirtmen gerekmez çünkü bu bağlamda diziye referans verilebilir.SetupPuzzleLights() : void = Logger.Print("Setting up in-game lights") TaggedActors := GetCreativeObjectsWithTag(puzzle_light{})GetCreativeObjectsWithTag()işlevinin farklı çağrıları, cihazları dizi sonucunda farklı sıralara yerleştirebilir çünkü Oynanış Etiketleri ile aktörleri alırken kesin bir sıra yoktur.- Artık
puzzle_lightetiketine sahip tüm cihazları topladığına göre her bir ışığınLightsStatedizisi tarafından belirtilen başlangıç durumuyla eşleştiğinden emin olmalısın. Tüm etiketli cihazlarda yinelemek için birfordöngüsü kullanabilirsin.for: ActorIndex -> TaggedActor : TaggedActors do: TaggedActor GetCreativeObjectsWithTag()işlevicreative_object_interfacetüründe bir dizi döndürür. Bu örnekte ışığı açmak veya kapatmak için her birTaggedActorile bircustomizable_light_deviceolarak etkileşime girmen gerekecektir.NewDeviceReference := device_type_to_cast_to[DeviceReference]sözdizimini kullanarak bir sınıfı alt sınıflarından birine dönüştürebilirsin (tür dönüştürme adı verilir). Bu sözdizimindedevice_type_to_cast_todeğeri istediğin cihazdır ve bu örnektecustomizable_light_deviceşeklindedir. Bu başarısız olabilir bir ifadedir çünkü cihaz o türe dönüştürülemiyorsa (örneğin, farklı bir cihaz türüyse) tür dönüştürme başarısız olacaktır.LightDevice := customizable_light_device[TaggedActor]
GetCreativeObjectsWithTag()işlevi[]creative_object_interfacedönüş türüne sahiptir çünkü işlev farklı türlerde aktörler döndürebilir. Bu nedenle dönüş türü,GetCreativeObjectsWithTag()tarafından döndürülmesi için tüm aktörlerin uygulamak zorunda olduğu arayüzdür. Daha fazla bilgiyi oynanış etiketleri bölümünde bulabilirsin.forifadeleriyle başarısız olabilir ifadeleri bir filtre olarak kullanabilir ve daha sonraforkod bloğunda kullanabileceğin yeni değişkenler oluşturabilirsin. Bu durumda önceki adımda yaptığıncustomizable_light_devicecihazına tür dönüştürmeyi, yineleme ifadesine eklemelisin.for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDevice- Bir kod bloğundaki son ifade, kod bloğunun sonucudur.
forifadesi bir dizideki her bir yinelemeden kod bloğunun sonucunu döndürür. Bu yüzden buforifadesi,puzzle_lightile etiketlenmişcustomize_light_devicereferanslarının bir dizisidir. Bunun anlamı,Lightsdizisini doğrudanforifadesinin sonucuyla güncelleyebileceğindir.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDevice - Bu
fordöngüsü ayrıca ışıklar üzerindeTurnOn()/TurnOff()çağrısı yaparak editördeki başlangıçLightsStateayarıyla eşleştirmelidir.forifadesi, geçerli etiketli cihazı almak için dizini döndürebilir (örnekteActorIndex) ve bu değeri, ışığın açılması veya kapanması gerektiğini görmek içinLightsStatedizisine dizin oluşturmak için kullanabilirsin.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn:= LightsState[ActorIndex] do: LightDevice - Ardından,
ShouldLightBeOndeğerinintrue/falseolmasına göreTurnOn()/TurnOff()işlevini çağır. Bir koşulu temel alarak farklı ifadeler (özellikle başarısız olabilir bir ifade) yürütmek için birififadesi kullanabilirsin. Bu durumda başarısız olabilir ifade,IsLightOnile?işlevini kullanabilir veShouldLightBeOndeğeritrueise başarılı olacak (bu yüzdenTurnOn()çağrısı yapacak) veShouldLightBeOndeğerifalseise başarısız olacaktır (bu yüzdenTurnOff()çağrısı yapacaktır).set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn := LightsState[ActorIndex] do: if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice - Kodunun beklenen şekilde çalıştığını doğrulayabilmen ve bölümde gördüklerinle karşılaştırabilmen için ışık dizinini ve başlangıç değerini yazdırmak da iyi bir fikirdir.
- Biz dizenin ortasında
{}kullandığında önce{}arasındaki ifade değerlendirilir ve değeri dizeye eklenir. Böylece değerleri koşullu olarak eklemek için birififadesini dizenin ortasında kullanabilirsin.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[ActorIndex] ShouldLightBeOn := LightsState[ActorIndex] do: Logger.Print("Adding Light at index {ActorIndex} with State:{if (ShouldLightBeOn?) then "On" else "Off"}") if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice
SetupPuzzleLights()yöntemin şu anda böyle görünmelidir:SetupPuzzleLights() : void = TaggedActors := GetCreativeObjectsWithTag(puzzle_light{}) <# puzzle_light etiketine sahip her bir cihaz için cihazı o türe dönüştürerek bir customizable_light_device olup olmadığını kontrol et. Bir customizable_light_device ise LightDevice cihazına TurnOn() veya TurnOff() fonksiyonunu uygulamak için başlangıçtaki LightState değerini al. Tüm etiketlenmiş customizable_light_device cihazlarını Lights dizisine kaydet. #> set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn := LightsState[ActorIndex] do: Logger.Print("Adding Light at index {ActorIndex} with State:{if (ShouldLightBeOn?) then "On" else "Off"}") if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice- Kodu Visual Studio Code içinde kaydet.
- UEFN araç çubuğunda Verse Kodları Oluştur seçeneğine tıklayarak kodunu derle.
- Bölüme oynanış testi uygulamak için UEFN araç çubuğunda oyna butonuna tıkla.
Bölümüne oynanış testi uyguladığında her bir ışığın başlangıç durumuyla birlikte çıktı günlüğüne yazdırılarak Lights dizisine eklendiğini görmen gerekir.
Sonraki Adım
Bu eğitimin bir sonraki adımında oyuncu butonlara bastığında belirli bir ışık kümesini nasıl açıp kapatacağını öğreneceksin.