关于场景图的教程,在这一部分的链接中,有错误。不和官方能否修改一下?
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/SceneGraph }
using { Logging }
puzzle_solved_event := class(scene_event){}
Scene Graph component handling puzzle component triggered events and when the puzzle is solved.
puzzle_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
@editable
DisablePuzzleTriggerablesWhenSolved<private>:logic = false
# 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}
# Decides whether puzzle is solved
IsPuzzleSolved<private>()<decides><transacts>:void=
for:
TriggerableEntity : TriggerableEntities
TriggerableEntityComponent : TriggerableEntity.GetComponents()
CastToTriggerable := triggerable[TriggerableEntityComponent]
CastToTriggerable.PuzzlePiece?
do:
CastToTriggerable.InSolvedState[]
# Clean up or subsequent events after puzzle is solved
HandlePuzzleSolved<private>():void=
set Solved = true
Log("Puzzle Solved!", LogPuzzleComponent, ?Level:=log_level.Normal)
if (DisablePuzzleTriggerablesWhenSolved?):
DisableTriggerableComponents()
Log("Sending down solved event", LogPuzzleComponent, ?Level:=log_level.Normal)
Entity.SendDown(puzzle_solved_event{})
# Async wrapper for determining whether puzzle is solved
CheckPuzzleSolved()<suspends>:void=
Sleep(0.25)
if (not Solved?, IsPuzzleSolved[]):
HandlePuzzleSolved()
# 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()
# Handle triggered events sent up from child entities
OnReceive<override>(SceneEvent:scene_event):logic=
Log("Received scene event.", LogPuzzleComponent, ?Level:=log_level.Normal)
if (TriggeredEvent := triggered_event[SceneEvent], TriggeredEntity := TriggeredEvent.TriggeredEntity?):
spawn{CheckPuzzleSolved()}
true
false
# 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()