Bu sayfa, Scene Graph varlıklarıyla oluşturulmuş bir bulmacayı yöneten puzzle_component adlı yeni bir Scene Graph bileşeni oluştururken sana rehberlik eder. Oluşturduktan sonra puzzle_component bileşenini bir Scene Graph varlığına yerleştirerek, bulmaca parçaları olarak belirtilen tetiklenebilir bileşenlere sahip alt Scene Graph varlıklarından oluşan bir bulmacanın çözülüp çözülmediğini belirle.
Örneğin, aşağıdaki görsel, bu eğitimin son bölümünde oluşturacağın basit bir bulmacadır.
Bu bulmacanın karşılık gelen Anahat Düzenleyicisi sonraki görselde gösterilmektedir.
Prefab_PuzzleManager alt varlıklarının her biri, Prefab_PuzzleManager’ın karşılık gelen puzzle_component bileşeni tarafından yönetilen bulmacanın bir parçasıdır. puzzle_component:
Bir bulmaca parçası çözülmüş yapılandırmaya geçirildiğinde olaylar alır.
Bulmacanın ne zaman çözüldüğünü belirler.
Bulmaca çözüldüğünde çözüme karşılık gelen eylemleri tetiklemek için Scene Graph hiyerarşisine olaylar gönderir.
Oyuncu platformlara ayak basıp her iki ışığı da açtığında örgü animasyon uygular ve dönüşür.
Bu sayfada kullanılan Verse dili özellikleri hakkında daha fazla bilgi için bkz.:
Bulmaca Çözüldü olayını tanımlama
İlk olarak Verse Gezgini’ne git, proje adına sağ tıkla ve Projeye yeni Verse dosyası ekle’yi seç.
Scene Graph Bileşeni şablonunu seç ve Bileşen Adı’nı puzzle_component olarak değiştir.
puzzle_solved_eventolayını tanımla. Bu olay, bulmaca çözüldüğünde bir kapının açılması veya oyuncunun bulmaca tarafından çevrili alanın ötesine geçebilmesi için köprüyü uzatmak gibi bir eylemi tetiklemek üzere Scene Graph hiyerarşisi aracılığıyla iletilir.puzzle_solved_eventolayınıscene_eventolayının bir alt sınıfı olarak tanımla. Bu olay, hiyerarşide herhangi bir parametrenin aktarılmasını gerektirmez.Versepuzzle_solved_event<public> := class(scene_event){}
Bulmaca bileşenini tanımlama
Ardından, bulmacayı yöneten ve bulmacanın çözülüp çözülmediğini belirleyen alan ve fonksiyonlarla birlikte puzzle_component bileşenini tanımla.
Bulmacanın çözülüp çözülmediğini, çözülen yapılandırmada hangi bulmaca parçalarının olduğunu ve bulmaca çözüldükten sonra bulmaca parçalarının tetiklenmeye devam edip etmediğini takip etmek için alanlar ekle:
Versepuzzle_component := class<final_super>(component): # Is this puzzle component solved var<private> Solved<public>:logic = false # Map of puzzle pieces and whether they have been "solved" var<private> TriggerableEntities<private>:[]entity = array{} # Disable puzzle pieces triggering once puzzle is solved @editableBu bulmacanın parçası olan tüm bulmaca parçalarının listesini başlatmak için
InitializeTriggerableDescendantEntitiesadlı bir fonksiyon ekle. Bu fonksiyon, bulmaca parçası olarak işaretlenmiş tüm tetiklenebilir varlıkları bulmak için Scene Graph hiyerarşisinde gezinir ve bunlarıTriggerableEntitiesdizisine ekler.Verse# Initialize array of triggerable entities InitializeTriggereableDescendantEntities<private>()<transacts>:void= for: DescendantEntity : Entity.FindDescendantEntities(entity) DescendantEntityComponent : DescendantEntity.GetComponents() CastToTriggerable := triggerable[DescendantEntityComponent] CastToTriggerable.PuzzlePiece? do: set TriggerableEntities += array{DescendantEntity}Alt varlıklarda tetiklenebilir bileşenleri devre dışı bırakmak için
DisableTriggerableComponentsadlı bir fonksiyon ekle.Verse# Disable puzzle pieces DisableTriggerableComponents<private>():void= for: DescendantEntity : Entity.FindDescendantEntities(entity) DescendantEntityComponent : DescendantEntity.GetComponents() CastToTriggerable := triggerable[DescendantEntityComponent] CastToTriggerable.PuzzlePiece? CastToEnableable := enableable[DescendantEntityComponent] do: CastToEnableable.Disable()Bulmacanın çözülmüş durumda olup olmadığına karar veren
IsPuzzleSolvedadlı bir fonksiyon ekle. Bu işlem,tetiklenebilirarayüzü uygulayan bir bileşenle daha önce bulunan tüm alt varlıklar yinelenerek, ilişkili varlığın bir bulmaca parçası olarak işaretlenip işaretlenmediği ve varlığıntetiklenebiliruygulayan bileşeninin çözülmüş durumda olup olmadığı kontrol edilerek yapılır.Verse# Decides whether puzzle is solved IsPuzzleSolved<private>()<decides><transacts>:void= for: TriggerableEntity : TriggerableEntities TriggerableEntityComponent : TriggerableEntity.GetComponents() CastToTriggerable := triggerable[TriggerableEntityComponent] CastToTriggerable.PuzzlePiece? do: CastToTriggerable.InSolvedState[]Bulmacanın çözüldüğü belirlendikten sonra gerekli tüm eylemleri gerçekleştirmek için
HandlePuzzleSolvedadlı bir fonksiyon ekle. Gerekli eylemlere, bu sınıf üzerindeÇözüldüalanının ayarlanması,DisablePuzzleTriggerablesWhenSolvedsınıf alanına göre tetiklenebilir bulmaca öğelerinin devre dışı bırakılması vepuzzle_solved_eventolayının Scene Graph hiyerarşisine gönderilmesi dahildir.Verse# Handle all necessary actions once puzzle is known to be solved HandlePuzzleSolved<private>():void= set Solved = true if (DisablePuzzleTriggerablesWhenSolved?): DisableTriggerableComponents() Entity.SendDown(puzzle_solved_event{})Ardından
CheckPuzzleSolutionadlı bir fonksiyon ekle. Bu, bulmacanınIsPuzzleSolvedile çözülüp çözülmediğini belirlemeye yönelik asenkron bir sarmalayıcı fonksiyondur ve çözülmüşse bulmaca çözüldüğünde gerekli eylemleri gerçekleştirmek içinHandlePuzzleSolvedçağrısı da yapar.Verse# Async wrapper for determining whether puzzle is solved CheckPuzzleSolved()<suspends>:void= Sleep(0.25) if (not Solved?, IsPuzzleSolved[]): HandlePuzzleSolved()Scene Graph bileşen sınıfı
OnReceivefonksiyonu için bir geçersiz kılma ekle.Verse# Handle triggered events sent through the Scene Graph hierarchy OnReceive<override>(SceneEvent:scene_event):logic= if (TriggeredEvent := triggered_event[SceneEvent], TriggeredEntity := TriggeredEvent.TriggeredEntity?): spawn{CheckPuzzleSolved()} true falseBileşenin
OnBeginSimulationfonksiyonuna birInitializeTriggerableDescendantEntitiesçağrısı ekle.Verse# Runs when the component should start simulating in a running game. OnBeginSimulation<override>():void = # Run OnBeginSimulation from the parent class before # running this component's OnBeginSimulation logic (super:)OnBeginSimulation() InitializeTriggereableDescendantEntities()
Sonraki Adımlar
Ardından, tetikleyici bileşenini ve tetiklenebilir arayüzü uygulayan tetiklenebilir bileşenleri oluştur.
Puzzle.verse için Nihai Kod
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/SceneGraph }
using { Logging }
puzzle_solved_event<public> := class(scene_event){}
# Scene Graph component handling puzzle component triggered events and when the puzzle is solved.
puzzle_component := class<final_super>(component):