이 프로젝트에서는 액션에 의해 트리거되는 서로 다른 여러 씬 그래프 컴포넌트를 사용합니다. 여기에는 이벤트에 의해 트리거되는 다음과 같은 액션이 포함됩니다.
예를 들어 위 이미지의 모든 스피어 조명은 triggerable_light_component 컴포넌트가 있는 씬 그래프 엔티티로, 이는 triggerable 인터페이스를 구현하는 컴포넌트 클래스입니다. 플레이어가 서로 다른 흰색 받침대를 밟으면 여러 조합의 엔티티가 트리거됩니다.
Verse 인터페이스를 사용하여 관련 없는 오브젝트나 액션 간에 공통 기능을 정의할 수 있습니다. 여기에서는 공통 기능을 통해 액션을 트리거하며, 관련 없는 오브젝트나 액션은 메시 비저빌리티, 메시 트랜스폼, 조명 켜기 또는 끄기입니다.
이 페이지에서 사용된 Verse 언어 기능에 대한 자세한 내용은 다음을 참조하세요.
트리거 가능 인터페이스 정의하기
새로운 빈 Verse 파일 Triggerable.verse를 생성하여 시작합니다. triggerable 인터페이스를 정의합니다. 인터페이스를 사용하여 기본 기능 및 필드 값을 정의하거나, 자손 클래스에서 정의 및 구현하도록 그냥 둘 수 있습니다. 그런 다음 트리거 가능한 인터페이스에서 상속하는 컴포넌트가 있는 씬 그래프 엔티티가 트리거되었는지를 알리는 데 사용되는 이벤트를 정의합니다.
이 파일에서는 다양한 인터페이스 필드에서
@editable어트리뷰트를 사용합니다. 이를 위해 /Verse.org/Simulation 모듈을 포함시킵니다.Verseusing { /Verse.org/Simulation }Verse의 인터페이스는 자손 클래스가 구현하는 액션을 나타내므로 형용사처럼 상태를 설명합니다.
triggerable이라는 이름의 새 인터페이스를 생성합니다.Versetriggerable<public> := interface:예를 들어 조명이 켜져 있는지나 메시가 표시되는지와 같이, 트리거 가능한 오브젝트가 트리거되었는지를 추적할 수 있습니다. 한 번에 하나의 액션만 트리거할 수도 있습니다. 이를 추적하려면 다음과 같은 로직 필드를
triggerable에 추가합니다.Versevar<protected> Triggered<public>:logic @editable OnlyTriggerOnce<protected>:logic = false var<protected> HasBeenTriggered<protected>:logic = false트리거 가능한 오브젝트는 이 튜토리얼에서 나중에 만들 퍼즐의 조각으로 사용됩니다. 또한, 퍼즐에서 액션에 의해 트리거되는 유인용 조각으로 트리거 가능한 오브젝트를 사용하고, 조각이 퍼즐의 일부인 것처럼 동작하지만 트리거된 상태가 퍼즐을 푸는 데 기여하거나 영향을 미치지 않도록 할 수 있습니다. 이 트리거 가능한 오브젝트가 퍼즐 조각인지 여부를 추적하는
PuzzlePiece로직 필드를 추가합니다.Verse@editable PuzzlePiece:logic = false더 자유롭게 퍼즐을 구성하고 싶으면, 일부 조명은 켜지고 일부 조명은 꺼지게 하여 퍼즐이 해결된 것으로 보이는 퍼즐을 만들 수도 있습니다. 트리거 여부에 따라 이 트리거 가능한 오브젝트 퍼즐 조각을 푼 것으로 간주되는지를 나타내는
SolvedStateTriggered로직 필드를 추가합니다.Verse@editable SolvedStateTriggered:logic = true세 개의 함수
PerformAction,PerformReverseAction,PostTrigger를 선언합니다.triggerable은 인터페이스이고 인터페이스는 이 함수에 대한 기본 구현을 제공하지 않으므로,triggerable의 자손 클래스에서 세 함수 각각에 대해 자체 구현을 제공해야 합니다.Verse# Action performed when transitioning from not triggered to triggered state PerformAction():void # Action performed when transitioning from triggered to not triggered state PerformReverseAction():void # Action performed after PerformAction or PerformReverseAction is called PostTrigger():void세 개의 추가 함수
Trigger,InSolvedState,SetInitialTriggeredState를 정의합니다. 이 함수 세 개는 모두triggerable인터페이스에서 제공되는 기본 구현을 갖고 있습니다.Trigger는 이 인터페이스를 구현하는 컴포넌트의 액션을 트리거하고,InSolvedState는 컴포넌트가 해결 및 트리거된 상태인지를 판단하며,SetInitialTriggeredState는 플레이 시작 시 컴포넌트의 트리거된 초기 상태를 결정합니다.Verse# Trigger the appropriate action Trigger():void = if: (OnlyTriggerOnce? and not HasBeenTriggeredOnce?) or (not OnlyTriggerOnce?) then: if (Triggered?): PerformReverseAction() else: PerformAction() PostTrigger()
트리거된 이벤트 정의하기
또한 이 퍼즐 프로젝트에서는 씬 이벤트를 사용하여 씬 그래프 계층구조에서 상위 또는 하위로 이벤트를 전달함으로써 메시 트랜스폼 또는 조명 켜기/끄기 등의 액션을 트리거합니다. 여기에서는 트리거 가능한 오브젝트가 트리거되었을 때 씬 그래프 계층구조에서 상위로 전달되는 triggered_event 이벤트를 정의합니다. 이 이벤트는 씬 그래프 컴포넌트에서 처리되어 퍼즐이 풀렸는지를 판단합니다.
씬 이벤트에는 씬 그래프 API가 필요합니다. 씬 그래프 API를 사용하려면 /Verse.org/SceneGraph 모듈을 포함시킵니다.
Verseusing { /Verse.org/SceneGraph }triggered_event로 명명된 씬 이벤트를 추가합니다.
Versetriggered_event<public> := class(scene_event):트리거된 엔티티를 나타내는 선택 사항 필드 한 개와, 이 엔티티가 트리거되었는지를 나타내는 로직 필드 한 개를 추가합니다.
VerseTriggeredEntity:?entity = false Triggered:logic = false
다음 단계
다음으로, 퍼즐을 관리하고 퍼즐이 풀렸는지를 판단하는 퍼즐 컴포넌트를 생성해 보겠습니다.
Triggerable.verse의 최종 코드
<#
Interface for triggering an action on a component.
Any component that you want to be triggered when the touch_component has it's Touch function called
must implement this interface.
#>
using { /Verse.org/Simulation }
OnlyTriggerOnceToolTip<public><localizes>:message="Whether this triggerable component should only ever be triggered once."
SolvedStateTriggeredToolTip<public><localizes>:message="Whether this puzzle pieces solved state is the triggered state. Note: Only relevant if PuzzlePiece is set to true."
PuzzlePieceToolTip<public><localizes>:message="Whether this entity is part of a puzzle solution."