Etiketli Işıklar Bulmacası eğitiminin bu adımını tamamlayarak bir eşya oluşturabilmek ve bulmacayla daha fazla etkileşim olmasını önlemek için oyuncunun bulmacayı çözdüğünün nasıl algılanacağını öğreneceksin
Çözülmüş Bir Bulmacayı Algılama
Bu bölümde oyuncunun doğru ışık kombinasyonunu bularak bulmacayı çözdüğünün nasıl algılanacağı gösteriliyor. Bulmaca çözüldüğünde Eşya Oluşturma Yeri cihazının eşyasını oluşturabilmesi için etkinleştirilmiş olması gerekir.
Oyuncunun bulmacayı çözdüğünü algılamak için aşağıdaki adımları izle:
tagged_lights_puzzlesınıfına, eşya çıkma yeri cihazını temsil edecekItemSpawneradlı bir düzenlenebiliritem_spawner_devicealanı ekle.@editable ItemSpawner : item_spawner_device = item_spawner_device{}- Ardından, bulmacayı çözmek için ışıkların hangi durumda olması gerektiğini belirle. Işık durumunun gösterimi bir
logicdizisi olduğundan, her ikisini kolayca karşılaştırmak için ışıkların çözülmüş durumu da birlogicdizisi olmalıdır.tagged_lights_puzzlesınıfındaSolvedLightsStateadlı bir düzenlenebilirlogicdizisi oluştur. Bu örnekte oyuncu bulmacayı çözmek için tüm ışıkları açmalıdır, dolayısıyla her öğe ışığın açık olduğunu gösterentruedeğeriyle başlatmalıdır.@editable SolvedLightsState : []logic = array{true, true, true, true} - Dosyayı Visual Studio Code içine kaydet.
- UEFN araç çubuğunda Verse Kodları Oluştur seçeneğine tıklayarak bölümdeki Verse cihazını güncelle.
- Anahat Düzenleyicisi menüsünden tagged_lights_puzzle öğesini seçerek Ayrıntılar panelini aç.
- Ayrıntılar panelinde Eşya Oluşturma Yeri özelliğini bölümdeki Eşya Oluşturma Yeri cihazına ayarla.
- Ardından, geçerli
LightsStatedurumununSolvedLightsStatedurumuyla eşleşip eşleşmediğini kontrol eden kodu geliştir.tagged_lights_puzzlesınıfınaIsPuzzleSolved()adlı yeni bir metot ekle. Bu metot, çağıranına kontrolün sonucunu bildirmek için bulmaca çözülürse başarılı, çözülmezse başarısız olmalıdır. Diğer bir deyişle metot,decidesbelirteci ile birlikte başarısız olabilir şeklinde işaretlenmelidir. Metotdecidesbelirleyicisine sahip olduğundan aynı zamandatransactsbelirleyicisine de sahip olmalıdır. Bunun anlamı, metodun herhangi bir yerinde bir hata olursa bu metot tarafından gerçekleştirilen eylemlerin (eylemler hiç gerçekleştirilmemiş gibi) geri alınabileceğidir.IsPuzzleSolved()<decides><transacts> : void = Logger.Print(“Checking if puzzle is solved”)Verse karar vermek için başarılı/başarısız değerlerini kullanır. Verse’ün başarısızlığı nasıl kullandığı hakkında daha ayrıntılı bilgi için Başarısızlık bölümüne bakabilirsin.
- Cihaz bulmacanın çözülüp çözülmediğini ne zaman kontrol etmeli? En iyi zaman,
ToggleLights()yöntemi içinde gerçekleşen,LightsStatedizisinin güncellendiği zamandır.forifadesiLightsStatedizisini güncellemeyi tamamladığında bulmacanın çözülüp çözülmediğini belirlemek içinIsPuzzleSolved[]yöntemini çağır ve böylece bir eşya oluştur (ItemSpawner.Enable()işlevini çağırarak).IsPuzzleSolved[]bir başarısız olabilir ifade olduğundan (yöntemi çağırdığında()yerine[]olmasının sebebi budur) bir hata bağlamında çağrılmalıdır. Bu örnekte hata bağlamı birififadesi olduğundan ifadeleri bulmacanın çözülüp çözülmediğine göre koşullu olarak yürütebilirsin.ToggleLights(LightIndices : []int) : void = for: LightIndex : LightIndices IsLightOn := LightsState[LightIndex] Light := Lights[LightIndex] do: Logger.Print("{LightIndex} dizinindeki ışık {if (IsLightOn?) then "Kapanıyor" else "Açılıyor"}") NewLightState := if (IsLightOn?): Light.TurnOff() yanlış else: Light.TurnOn() true if (set LightsState[LightIndex] = NewLightState): Logger.Print("Updated the state for light at {LightIndex}") if (IsPuzzleSolved[]): Logger.Print("Puzzle solved!") ItemSpawner.Enable() - Ardından,
IsPuzzleSolved()metoduyla bulmacanın çözülüp çözülmediğini algıla.IsPuzzleSolved()bir hata bağlamı olduğundan metottaki başarısız olabilir ifadeleri birififadesi gibi başka bir hata bağlamına gerek duymadan kullanabilirsin. Bu nedenle her bir ışığın durumunun, çözülmüş bulmaca durumuyla aynı olup olmadığını kontrol etmen gerekir. İkilogicdeğerinin aynı olup olmadığını test etmek için başarısız olabilir bir ifade olan=eşittir işlecini kullanabilirsin. Kontrol ettiğin iki değerin aynı olmadığı ilk durumda ifade başarısız olur, bu durumda metot başarısızdır ve çağıranın bağlamına (bu durumdaToggleLights()metodundakiififadesi) geri döner.IsPuzzleSolved()<decides><transacts> : void = Logger.Print(“Checking if puzzle is solved”) for: LightIndex -> IsLightOn : LightsState IsLightOnInSolution := SolvedLightsState[LightIndex] do: IsLightOn = IsLightOnInSolution - Değişiklikleri 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.
Bu örnekte gösterilen ayarlarla bölümüne oynanış testi uyguladığında tüm butonlarla bir kez etkileşimde bulunmak bulmacayı çözmeli ve eşyayı oluşturmalıdır.

Bulmaca Çözüldüğünde Buton Etkileşimini Kaldırma
Oyuncu bulmacayı tamamladıktan sonra butonlarla etkileşime girememeli veya ışıkları açıp kapatamamalıdır. Bu bölümde bir oyuncu butonla etkileşimde bulunduğunda bir daha olay işleyicinin çağrılmaması için bir olayın aboneliğinden nasıl çıkılacağı gösteriliyor.
Bir cihaz olayında Subscribe() çağrısı yaptığında işlevin bir cancelable sonucu olur. Bir cancelable değişkeni üzerinde Cancel() çağrısı yapıldığında olayı işleyen işlev abonelikten çıkarılır, böylece olay gönderildiğinde işlev artık çağrılmaz.
Bulmaca çözüldükten sonra buton etkileşimlerini kaldırmak için aşağıdaki adımları izle:
- Her bir butonun olayına abone olma sonucunu kaydetmek için
tagged_lights_puzzlesınıfınaButtonSubscriptionsadlı bircancelabledizi değişkeni alanı ekle ve bu alanı boş bir diziyle başlat.var ButtonSubscriptions : []cancelable = array{} - Bu ifade,
foriçin son ifade olduğundan tüm başarılı yinelemeler için dönüş değeri, ifade dönüş türündeki bir dizide toplanır. Daha önce açıklandığı gibi bir olaySubscribeçağrısıcancelableözelliktedir. Bu özellik, ToggleLights metodunu bircancelable([]cancelable) dizisindekiforsonuçlarına yönlendirir. Bu işlemButtonsSubscriptiontürüyle eşleşir, bu yüzdenforifadesinin sonucunuButtonsSubscriptiondizisine atayabilirsin. Bu koduOnBeginfonksiyonundaSetupPuzzleLightsöğesinin sonuna ekle:OnBegin<override>()<suspends> : void = SetupPuzzleLights() set ButtonSubscriptions = for: ButtonIndex -> Button : Buttons LightIndices := ButtonsToLights[ButtonIndex] do: Button.InteractedWithEvent.Subscribe(button_event_handler{Indices := LightIndices, PuzzleDevice := Self}.OnButtonPressed) - Son olarak, oyuncunun
LightsStatedurumunu artık değiştirememesi için butonların devre dışı bırakılması gerektiğini unutma. Her bir butonuncancelableaboneliği çağrılarakInteractedWithEventişleyicilerinin aboneliğinden çıkma yoluyla butonlar devre dışı bırakılabilir. BuButtonSubscriptionsabonelikleri,OnBeginiçinde olay işleyiciler oluşturulduğunda kaydedilir. Bundan sonra tek yapılması gereken, bu dizi aracılığıyla iyileştirme yapmak ve her birButtonSubcriptionaboneliğinde iptal çağrısı yapmaktır:ToggleLights(LightIndices : []int) : void = for: LightIndex : LightIndices IsLightOn := LightsState[LightIndex] Light := Lights[LightIndex] do: Logger.Print("{LightIndex} dizinindeki ışık {if (IsLightOn?) then "Kapanıyor" else "Açılıyor"}") NewLightState := if (IsLightOn?): Light.TurnOff() yanlış else: Light.TurnOn() true if (set LightsState[LightIndex] = NewLightState): Logger.Print("Updated the state for light at {LightIndex}") if (IsPuzzleSolved[]): Logger.Print("Puzzle solved!") ItemSpawner.Enable() for (ButtonSubscription : ButtonSubscriptions): ButtonSubscription.Cancel() - Değişiklikleri 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.
Varsayılan özellikler kullanılarak tüm butonlarla bir kez etkileşimde bulunmak bulmacayı çözmeli, eşyayı oluşturmalı ve daha fazla buton etkileşimini devre dışı bırakmalıdır.
Sonraki Adım
Bu eğitimin son adımında bu eğitimin tam kodunu ve örneği daha fazla değiştirecek fikirleri görebilirsin.