Bu sayfa, trigger_component adlı yeni bir Scene Graph bileşeni oluştururken sana yol gösterir. Bu bileşen, tetiklenebilir arayüzü uygulayan bir Scene Graph bileşeninin bulunduğu varlıklar üzerinde eylemler tetikler. trigger_component, aracıların bir volume_device aracılığıyla Scene Graph ile etkileşime girmesini sağlar. Bir aracı volume_device cihazına girdiğinde veya cihazdan çıkış yaptığında karşılık gelen AgentEnteredEvent ve AgentExitedEvent olayı sinyal verilir ve Scene Graph bileşenleri ile varlıkları üzerinde eylem gerçekleştirmek üzere karşılık gelen geri çağırmalar yapılır.
Aşağıdaki görüntüde yerde bulunan beyaz platform, trigger_component bileşenine ve platformun etrafında görünmez volume_device cihazına sahip olan bir Scene Graph varlığıdır.
Oyuncu platforma bastığında trigger_component en sağdaki iki ışığı tetikler.
Oyuncu platformdan ayağını kaldırıp volume_device cihazından ayrıldığında ışıklar açık durumda kalır.
Bu sayfada kullanılan Verse dili özellikleri hakkında daha fazla bilgi için bkz.:
Tetikleyici Bileşenini Tanımlama
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ı trigger_component olarak değiştir.
trigger_componentsınıfını tanımla ve bu bileşenin yalnızca alt öğeleri veya tüm tetiklenebilir alt öğeleri tetiklediğinden bağımsız olarak, ilişkilivolume_devicecihazına referans veren tüm alanları ve bu bileşenle etkileşimde bulunan tüm aracılara referans veren bir dizi ekle.Versetrigger_component := class<final_super>(component): # volume_device associated with this trigger_component @editable InteractionVolume<private>:volume_device = volume_device{} # whether or not this triggers on components on child entities @editable OnlyTriggerChildren:logic = falseBir aracı bu bileşenin ilişkili
volume_devicecihazına girip çıktığında ne olacağını tanımlayanOnAgentEntersVolumeveOnAgentExitsVolumeadlı fonksiyonlar ekle. Bir aracı etki aktörüne girdiğinde etkileşimdeki aracıyı kaydet vetriggerablearayüzünü uygulayan bir bileşene sahip olan alt varlıkları ara, ardından bu varlıklar üzerinde bileşeni tetikle. Bir aracı etki aktörüne girdiğinde etkileşimde bulunan aracıyı bu etki aktörüyle etkileşimde bulunan aracılar listesinden kaldır.Verse# Event that is triggered when an Agent enters the InteractionVolume OnAgentEntersVolume(Agent:agent):void= for: ChosenEntity : Entity.FindDescendantEntities(entity) ChosenEntityComponent : ChosenEntity.GetComponents() CastToInterface := triggerable[ChosenEntityComponent] do: if (OnlyTriggerChildren?): if (Entity = ChosenEntity.GetParent[]): CastToInterface.Trigger()OnAgentEntersVolumeveOnAgentExitsVolumefonksiyonlarını, bu bileşeninOnSimulatefonksiyonundaAgentEntersEventveAgentExitsEventiçin geri çağırma fonksiyonları olarak kaydederekvolume_devicecihazına bağla.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() # Runs when the component should start simulating in a running game. # Can be suspended throughout the lifetime of the component. Suspensions # will be automatically cancelled when the component is disposed or the # game ends.
Tetiklenebilir Bileşenleri Tanımlama
Ardından, daha önce oluşturulan tetiklenebilir arayüzü uygulayan bileşenleri tanımla. Bunlar puzzle_component bileşenine sahip bir varlığın alt öğeleri olan ve trigger_component bileşenine sahip bir üst varlık tarafından tetiklenen Scene Graph varlıklarına eklenen bileşenlerdir. Bu eğitimde üç farklı tetiklenebilir bileşen tanımlanır:
triggerable_mesh_component: Varlığınmesh_componentbileşeninin görünürlüğünü açıp kapatır.triggerable_light_component: Varlığınsphere_light_componentbileşenini açıp kapatır ve varlığınmesh_componentbileşenini, ışığın açık veya kapalı olmasına bağlı olarak, yayıcı renk olan veya olmayan bir bileşenle değiştirir.triggerable_movement_component:keyframed_movement_componentkullanarak varlığınmesh_componentbileşeninde bir dönüşüm tetikler.
Bu üç farklı bileşenin çok sayıda işlevselliği ortaktır ve fonksiyonların çoğu aynı şekilde tanımlanır. Başlangıçta TriggerableComponents.verse adlı yeni, boş bir Verse dosyası oluştur.
Aşağıdaki modülleri ekle:
/Verse.org/SceneGraph bileşeni çünkü bu dosya Scene Graph bileşenlerini ve Sahne Olaylarını kullanır.
/Verse.org/SceneGraph/KeyframedMovement çünkü bu dosya keyframed_movement_delta kullanır.
/Verse.org/Simulation çünkü bu dosya @editable özniteliğini kullanır.
/Verse.org/SpatialMath çünkü bu dosya Verse dönüşümleri kullanır.
Verseusing { /Verse.org/SceneGraph } using { /Verse.org/SceneGraph/KeyframedMovement } using { /Verse.org/Simulation } using { /Verse.org/SpatialMath }triggerable_mesh_component,triggerable_light_componentvetriggerable_movement_componentbileşenlerini tanımla. Bu bileşenlerin tümü, temelbileşensınıfından devralır ve tetiklenebilir arayüzü uygular.Üç bileşen de aynı üç olayı uygular:
OnReceive: Bu bileşen bir Sahne Olayı aldığında çağrılır.OnBeginSimulation: Bileşenin simülasyona başlaması gerektiğinde çağrılır.OnSimulate: Bileşen simülasyona başladığında çağrılır.
Üç bileşenin tümüne aşağıdaki uygulamaları ekle.
Verse# Runs when this component receives a scene event OnReceive<override>(SceneEvent:scene_event):logic= if (PuzzleSolvedEvent := puzzle_solved_event[SceneEvent], not PuzzlePiece?): Trigger() true false # Runs when the component should start simulating in a running game. OnBeginSimulation<override>():void = # Run OnBeginSimulation from the parent class beforeTetiklenebilirbileşen bir bulmaca parçasıysa üç bileşenin tamamı birtriggered_eventgöndererektetiklenebilirarayüzPostTriggergeçersiz kılmasını aynı şekilde uygular. Bunutetiklenebilirarayüzün kendi içinde yapamazsın çünkü Verse’ün hangivarlığıntetiklendiğini bilmesi gerekir veVarlıkalanı,bileşensınıfının bir parçasıdır vebileşensınıfına daha fazla bağımlılık olmadantetiklenebilirarayüz tarafından kullanılamaz.VersePostTrigger<override>():void = if (PuzzlePiece?): Event := triggered_event: Triggered := Triggered TriggeredEntity := option{Entity} Entity.SendUp(Event)
Tetiklenebilir Örgü Bileşeni
triggerable_mesh_component, bir varlık üzerinde mesh_component görünürlüğünü açıp kapatır. Bunun için aşağıdaki tetiklenebilir arayüz fonksiyonlarına yönelik geçersiz kılmaların sağlanması gerekir:
SetInitialTriggeredStatePerformActionPerformReverseAction
İlk tetiklenme durumu, örgü bileşeninin ayrıntılar panelinde ayarlandığı gibi örgünün oyun dünyasında görünür şekilde başlayıp başlamadığı kontrol edilerek belirlenir.
triggerable_mesh_componenteylemi,mesh_componentörgüsünü görünür yapmaktır. Bunu yapmak için karşılık gelen varlığa ilişkinmesh_componentöğesini al, örgüyü görünür olarak ayarla, ardındantriggerable_mesh_componentbileşenini tetiklenmiş duruma ayarla.Verse# Determine the initial triggered state of this component SetInitialTriggeredState<override>():void= if (MeshComponent := Entity.GetComponent[mesh_component], MeshComponent.Visible?): set Triggered = trueTersine
triggerable_mesh_componenteylemi,mesh_componentörgüsünü görünmez yapmaktır. Bunu yapmak için karşılık gelen varlığa ilişkinmesh_componentöğesini al, örgüyü görünmez olarak ayarla, ardındantriggerable_mesh_componentbileşenini tetiklenmemiş duruma ayarla.VersePerformReverseAction<override>():void = if (MeshComponent := Entity.GetComponent[mesh_component]): if (MeshComponent.Visible?): set MeshComponent.Visible = false set Triggered = false
Tetiklenebilir Hareket Bileşeni
triggerable_movement_component, bir varlığı keyframed_movement_component kullanarak bir konumdan başka bir konuma sırayla hareket edecek şekilde tetikler. Bunun için aşağıdaki tetiklenebilir arayüz fonksiyonlarına yönelik geçersiz kılmaların sağlanması gerekir:
SetInitialTriggeredStatePerformActionPerformReverseAction
Ayrıca bu bileşen birkaç yardımcı fonksiyon kullanır:
GetMovementStates: Bu varlık için dönüşüm serisini tanımlayan alt varlıkların dönüşümlerini al.MakeDeltaTransform: İki girdi dönüşümü arasında bir delta dönüşüm oluştur.ConstructKeyframeDeltas:keyframed_movement_componentgirdisi içinkeyframed_movement_deltaobjelerinden oluşan bir dizi oluştur.SetAndPlayAnimation: Anahtar kareleri ata ve hareket animasyonunu oynat.
Bu sınıfa anahtar kareli animasyonun ne kadar süreceğini belirleyen bir kayan sayı ekle.
Verse@editable Duration:float = 2.0Bu sınıf,
tetiklenebilirarayüzü uygular, bu nedenle varsayılan uygulamaları olmayanPerformActionvePerformReverseActionfonksiyonları için geçersiz kılmaların sağlanması gerekir. Başlangıçta bir tetiklenme durumu olmadığından ve eylem konumlar arasında bir hareket olduğundan varsayılan başlangıçta tetiklenme durumu false olur. Temel uygulamanıntetiklenebilirarayüzde yaptığı şey budur, dolayısıyla bu fonksiyon bu bileşen sınıfında bir geçersiz kılma gerektirmez.triggerable_movement_componenteylemi, varlığı alt varlıklar tarafından tanımlanan dönüşüm serisi boyunca taşımaktır.VersePerformAction<override>():void = MovementStates := GetMovementStates() AnimationFrames:[]keyframed_movement_delta = ConstructKeyframeDeltas(MovementStates) SetAndPlayAnimation(AnimationFrames)Tersine
Triggerable_movement_componenteylemi, varlığı alt varlıklar tarafından tanımlanan dönüşüm serisi boyunca ters yönde taşımaktır. Bu fonksiyon, dönüşüm dizisinin ters sırada olması dışındaPerformActionile benzerdir.VersePerformReverseAction<override>():void = MovementStates := GetMovementStates() ReversedMovementStates := for: Index := 0..MovementStates.Length - 1 ReversedElement := MovementStates[MovementStates.Length - 1 - Index] do: ReversedElement AnimationFrames := ConstructKeyframeDeltas(ReversedMovementStates) SetAndPlayAnimation(AnimationFrames)Bu bileşenin kullandığı yardımcı fonksiyonları tanımla. İlk olarak, bu hareketin yöneldiği dönüşümleri almak için
GetMovementStatesadlı bir fonksiyon oluştur.VerseGetMovementStates():[]transform= for (ChildEntity : Entity.FindDescendantEntities(entity), Entity = ChildEntity.GetParent[]): ChildEntity.GetGlobalTransform()İki dönüşüm arasında delta dönüşüm oluşturan
MakeDeltaTransformadlı bir yardımcı fonksiyon tanımla. A dönüşümünden B dönüşümüne D delta dönüşümü, D dönüşümü A dönüşümüne uygulandığında sonucun B dönüşümü olduğu bir dönüşümdür.Bu tanımı genişletmek için, geçerli A dönüşümüne sahip bir Scene Graph varlığın olduğunu, ancak varlığı B dönüşümüne sahip olacak şekilde ölçeklendirmek, döndürmek ve taşımak istediğini varsayalım. D delta dönüşümü, bir
keyframed_movement_deltavarlığının A dönüşümünden B dönüşümüne geçiş hareketine animasyon uygulamak için gereken dönüşümdür.VerseMakeDeltaTransform(InTransformOne:transform, InTransformTwo:transform):transform = transform: Translation := InTransformTwo.Translation - InTransformOne.Translation Rotation := MakeComponentWiseDeltaRotation(InTransformOne.Rotation, InTransformTwo.Rotation) Scale := vector3: Forward := InTransformTwo.Scale.Forward / InTransformOne.Scale.Forward Right := InTransformTwo.Scale.Right / InTransformOne.Scale.Right Up := InTransformTwo.Scale.Up / InTransformTwo.Scale.Upkeyframed_movement_componentanimasyonunun girdisi olarak birkeyframed_movement_deltaobje dizisi oluşturanConstructKeyframeDeltaadlı bir yardımcı tanımla.VerseConstructKeyframeDeltas<public>(MovementStates:[]transform):[]keyframed_movement_delta = var LastTransform:transform = Entity.GetGlobalTransform() for (EntityIndex -> CurrentTransform : MovementStates): DeltaTransform := MakeDeltaTransform(LastTransform, CurrentTransform) set LastTransform = CurrentTransform keyframed_movement_delta: Transform := DeltaTransform Duration := Duration Easing := if (MovementStates.Length > 1): if (EntityIndex = 0):keyframed_movement_deltadizisinikeyframed_movement_componentanimasyonuna atayan ve oynatanSetAndPlayAnimationadlı bir fonksiyon oluştur.VerseSetAndPlayAnimation<private>(Frames:[]keyframed_movement_delta):void = if (KeyframedMovementComponent := Entity.GetComponent[keyframed_movement_component]): KeyframedMovementComponent.SetKeyframes(Frames, oneshot_keyframed_movement_playback_mode{}) KeyframedMovementComponent.Play()
Tetiklenebilir Işık Bileşeni
triggerable_light_component bir ışığı açar ve kapatır. Bunun için aşağıdaki tetiklenebilir arayüz fonksiyonlarına yönelik geçersiz kılmaların sağlanması gerekir:
SetInitialTriggeredStatePerformActionPerformReverseAction
Işığın başlangıçtaki tetiklenmiş durumu, ışığın açık olup olmadığına göre belirlenir, bu nedenle
SetInitialTriggeredStateışığın zaten açık olup olmadığını kontrol eder ve açıksa başlangıçta tetiklendi olarak ayarlar.Verse# Determine the initial triggered state of this light SetInitialTriggeredState<override>():void= for: DescendantEntity : Entity.FindDescendantEntities(entity) Entity = DescendantEntity.GetParent[] MeshComponent := DescendantEntity.GetComponent[mesh_component] LightComponent := DescendantEntity.GetComponent[light_component] MeshComponent.IsEnabled[] LightComponent.IsEnabled[] do:triggerable_light_componenttarafından gerçekleştirilen eylem, ışığı açmak ve ışığın açık olduğunu gösteren bir örgüye geçmektir.VersePerformAction<override>():void= if (not IsLightOn?): for (DescendantEntity:Entity.FindDescendantEntities(entity), Entity = DescendantEntity.GetParent[]): if (MeshComponent := DescendantEntity.GetComponent[mesh_component]): if (LightComponent := DescendantEntity.GetComponent[light_component]): MeshComponent.Enable() LightComponent.Enable() else: MeshComponent.Disable() set IsLightOn = truetriggerable_light_componenttarafından gerçekleştirilen eylem, ışığı kapatmak ve yayıcı olmayanmesh_componentbileşenini görünür olarak ayarlamaktır.VersePerformReverseAction<override>():void= if (IsLightOn?): for (DescendantEntity:Entity.FindDescendantEntities(entity), Entity = DescendantEntity.GetParent[]): if (MeshComponent := DescendantEntity.GetComponent[mesh_component]): if (LightComponent := DescendantEntity.GetComponent[light_component]): MeshComponent.Disable() LightComponent.Disable() else: MeshComponent.Enable() set IsLightOn = false
Sonraki Adımlar
Verse kodunun tamamı yazıldığına göre artık Verse kodunu oluştur. Ardından, kendi bulmaca deneyimini oluşturmak için temel varlıklar ve bileşenlerle UEFN’de yeniden kullanabileceğin prefablar inşa et.
Nihai Kod
TriggerComponent.verse
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /Verse.org/SceneGraph }
using { Logging }
trigger_component<public> := class<final_super>(component):
@editable
InteractionVolume<private>:volume_device = volume_device{}
TriggerableComponents.verse
using { /Verse.org/SceneGraph }
using { /Verse.org/SceneGraph/KeyframedMovement }
using { /Verse.org/Simulation }
using { /Verse.org/SpatialMath }
EnabledToolTip<public><localizes>:message = "Whether or not this component is enabled."
triggerable_mesh_component<public> := class<final_super>(component, triggerable):
<# Triggerable interface #>