Verse를 사용하여 만들어진 퍼즐이 두 개 있습니다. 첫째는 태그된 라이트 퍼즐입니다. 태그된 라이트 퍼즐은 지하 2층 계단 뒤의 숨겨진 방에서 사용됩니다.
이 튜토리얼의 마지막 섹션에서 코드를 복사하여 붙여넣을 수 있지만, Verse 언어의 작동 원리를 파악할 수 있도록 퍼즐을 하나씩 직접 빌드할 것을 강력히 권장합니다.
두 번째 퍼즐은 하드코딩된 로직 키를 사용하여 각 스위치 장치를 체크함으로써 알맞은 스위치가 올바른 순서대로 트리거되게 합니다.
알맞은 스위치가 트리거되면 성공 사운드가 스위치와 함께 재생됩니다. 마찬가지로 시퀀스 중에 잘못된 스위치가 켜지면 실패 사운드와 메시지가 트리거됩니다. 퍼즐을 풀면 최종 성공 사운드 및 메시지가 재생되고 4개의 아이템 생성 장치가 활성화됩니다.
유효 상태 여부를 체크하고 상태에 연결된 장치를 트리거하기 위해 배열을 사용합니다. 이 예시의 경우, 코딩 입문자들이 해당 코드의 역할을 이해하는 데 도움이 되도록 정답 키가 하드코딩되어 있습니다.
퍼즐 장치 구성
이 퍼즐에는 다음 장치가 필요합니다.
아이템 생성 장치의 이름을 생성할 아이템으로 변경합니다.
스위치 장치
문 옆의 벽에 스위치 장치를 배치하고 옵션을 다음과 같이 설정합니다.
| 옵션 | 값 | 설명 |
|---|---|---|
| 장치 모델(Device Model) | 회로 차단기(Circuit Breaker) | 이 퍼즐에서는 플레이어가 회로 차단기를 뒤집게 합니다. |
| 사운드(Sound) | False | 오디오 장치는 유효, 유효하지 않음, 성공 퍼즐 상태마다 다른 사운드 큐를 재생합니다. |
| 상호작용 시간(Interaction Time) | 0.1 | 상호작용은 즉시 이뤄져야 합니다. |
| 상호작용 반경(Interaction Radius) | 1.0 | 플레이어는 스위치 앞의 1타일 공간 내에 서 있어야 스위치와 상호작용 가능합니다. |
| 게임 시작 시 상태 확인(Check State at Game Start) | False | 대신 Verse 장치에서 이 확인을 실행합니다. |
벽에서 스위치 장치를 3개 더 복사하고 나란히 배치합니다.
오디오 장치
사각형 중앙에 오디오 장치를 배치합니다. 오디오 옵션을 다음과 같이 설정합니다.
| 옵션 | 값 | 설명 |
|---|---|---|
| 활성화 시 음향 재시작(Restart Audio when Activated) | True | 오디오를 한 번 이상 재생 가능하게 하고 매번 처음부터 시작되게 합니다. |
| 타격 시 재생(Play on Hit) | False | Verse 장치에서 오디오 장치를 트리거합니다. |
오디오 장치를 2개 더 복사합니다. 장치 이름을 변경하고 각각에 다음 사운드 큐를 추가합니다.
-
유효 - 유효한 오디오 장치 플레이를 위해 Match_Round_Change_01_Cue를 추가합니다.
-
유효하지 않음 - 유효하지 않은 오디오 장치 플레이를 위해 Player_Checkpoint_Trigger_Cue를 추가합니다.
-
완료 - 완료된 오디오 장치 플레이를 위해 CTF_Return_Team_Cue를 추가합니다.
트리거 장치
스위치 오른쪽에 트리거 장치를 배치하고 옵션을 다음과 같이 설정합니다.
| 옵션 | 값 | 설명 |
|---|---|---|
| 게임 내 표시(Visible in Game) | False | 이 장치는 게임 중에 표시될 필요가 없습니다. |
| 게임 시작 시 활성화(Enabled on Game Start) | False | Verse 장치에서 트리거 장치를 제어합니다. |
| 플레이어로 트리거(Triggered by Players) | False | Verse 장치에서 트리거 장치를 제어합니다. |
| 탈것으로 트리거(Triggered by Vehicles) | False | Verse 장치에서 트리거 장치를 제어합니다. |
| 시퀀서로 트리거(Triggered by Sequencers) | False | Verse 장치에서 트리거 장치를 제어합니다. |
| 물로 트리거(Triggered by Water) | False | Verse 장치에서 트리거 장치를 제어합니다. |
| 트리거 가능 횟수(Times Can Trigger) | true, 10 | 트리거를 퍼즐에서 한 번 이상 사용 가능하게 합니다. |
| VFX 트리거 | False | 비주얼 이펙트는 필요하지 않습니다. |
| SFX 트리거 | False | 오디오 장치가 사운드를 제어합니다. |
유효하지 않음 트리거 장치의 이름을 변경합니다.
HUD 메시지 장치
첫 HUD 메시지 장치를 다음 옵션으로 구성합니다.
| 옵션 | 값 | 설명 |
|---|---|---|
| 메시지(Message) | 유효하지 않음 HUD 메시지:
아이템 찾기 HUD 메시지:
|
퍼즐에 대한 메시지로, 실패 및 성공 상태를 다룹니다. |
| 표시 시간(Display Time) | 유효하지 않음 HUD 메시지 - 3.0 완료 HUD 메시지 - 5.0 |
메시지가 표시되는 시간 길이입니다. |
이후 HUD 메시지 장치를 지하실 벽 밖으로 옮겨서 방 안에서는 보이지 않게 하고 복사합니다.
각 HUD 메시지 장치의 이름을 다음과 같이 변경합니다.
-
아이템 찾기 HUD 메시지
-
유효하지 않음 HUD 메시지
Verse 장치
이제 퍼즐을 제어하는 Verse 프로그램을 만들 준비가 됐습니다. Verse 익스플로러로 switch_state_puzzle 이라는 새 Verse 장치를 만들어 레벨로 드래그합니다. 새 Verse 장치를 생성하는 단계별 방법은 Verse를 사용하여 나만의 장치 만들기를 참조하세요.
퍼즐 디자인
올바른 순서로 스위치를 켜면 플레이어가 방 탈출에서 이 지점을 통과할 수 있습니다.
플레이어가 스위치를 올바른 순서로 켜면 벨이 울립니다. 스위치를 잘못 켜면 버저 소리가 나며 스위치가 리셋됩니다. 유효하지 않음 상태는 메시지를 표시합니다. 성공적으로 퍼즐을 완료하면 성공 사운드가 재생되고 유용한 메시지가 표시되며 아이템이 생성됩니다.
아래 흐름도를 사용하여 퍼즐 로직을 시각화할 수 있습니다.
이미지를 클릭하면 확대됩니다.
퍼즐 해답은 아래 테이블에서 볼 수 있습니다.
| 퍼즐 해답 매트릭스(Puzzle Solution Matrix) | ||||
|---|---|---|---|---|
| 스위치(Switches) | 2 | 3 | 1 | 4 |
| 1 | X | |||
| 2 | X | X | ||
| 3 | X | X | X | |
| 4 | X | X | X | X |
사용된 Verse 언어 기능
-
if,then,else:if,then,else표현식을 사용하면 각 스위치 장치 또는 기타 장치의 상태에 따라 각 장치에 대한 유효 및 유효하지 않음 상태를 찾을 수 있습니다. -
failure: 실패 컨텍스트는 퍼즐의 현재 상태와 그 해답을 결정하는 데 사용됩니다. -
for: *for:for표현식은 퍼즐에서 각 스위치를 반복하고 스위치에서 연산을 수행하는 데 사용됩니다.
사용된 API
-
편집 가능 프로퍼티: Verse로 제작한 장치 프로퍼티 다수는 UEFN에 노출되므로 에디터에서 커스터마이징할 수 있습니다. 이 프로퍼티를 변경하여 새 퍼즐 환경설정을 생성할 수 있습니다.
-
장치 이벤트:
InteractedWithEvent버튼은 게임 상태를 제어하는 데 사용됩니다.
스위치 상호작용
퍼즐 실행에 필요한 단계에 대해 생각합니다. 우선 플레이어가 박스를 체크할 때 Verse 장치가 이벤트를 등록하는지 확인합니다. 이를 달성하려면 의사 코드를 먼저 작성하여 상호작용 콘셉트를 검증합니다.
-
switch_state_puzzle 클래스 정의 아래에서 다음과 같은 편집 가능 필드를 추가합니다.
-
편집 가능
switch_device타입 배열인Switches. 이는 퍼즐 내의 모든 스위치를 가리킵니다. -
cancelable타입의 변수 배열SwitchSubscriptions. 이는 스위치 리셋에 사용할 수 있는 각 switch_device 구독에 대한 레퍼런스를 저장합니다.
-
switch_state_puzzle := class(creative_device):
@editable
Switches : []switch_device = array{} #플레이어가 상호작용할 수 있는 스위치를 참조함
var SwitchSubscriptions : []cancelable = array{}
-
같은 파일에서
switch_event_handler라는 새 클래스를 생성합니다. 이 클래스에서 Verse 장치와 스위치를 식별할 것입니다. -
새 메서드
OnSwitchPressed()를switch_event_handler클래스에 추가합니다. 이 메서드는item_switch_puzzle클래스에서CheckSequence()를 호출함으로써 플레이어 상호작용에 대한 Verse 장치를 검사합니다. 또한 스위치가 상호작용할 때마다 클릭됨(Clicked) 을 프린트합니다.
## 스위치 상호작용을 처리하는 이벤트 핸들러 클래스
## 이 이벤트 핸들러는 위 루프의 이벤트에 어태치됨
switch_event_handler := class():
PuzzleDevice : item_switch_puzzle
Switch : switch_device
OnSwitchPressed(InPlayer : agent) : void =
Print("Clicked")
PuzzleDevice.CheckSequence(InPlayer)
프린트 로거 추가
코드의 성공 여부를 확인하는 방법 중 하나는 로그를 출력하는 것입니다. 그러면 메시지 출력을 통해 코드에서 어떤 부분이 계획대로 작동하는지 시각적으로 확인할 수 있습니다. 포크리 장치 클래스 위에 프린트 로거를 추가하세요.
Print<native><public>(Message:[]char, Level:log_level):void
참조 스위치
이제 퍼즐에서 스위치 장치를 참조할 방법이 필요합니다. 스위치 장치 참조를 통해 게임 실행 중 모든 스위치를 루프하고 각 스위치에 대한 이벤트 핸들러를 추가할 수 있습니다.
-
switch_state_puzzle클래스의OnBegin()에서for표현식을 추가하여Switches배열의 각Switch를 반복작업합니다. 각Switch의 인덱스를 가져와SwitchIndex변수에 저장합니다. -
for 표현식 아래에 Print 함수를 추가하고 Print 명령에 스위치 {SwitchIndex} 추가됨 을 입력하여 실행 도중 상호작용되는 스위치를 식별합니다.
-
퍼즐 해답은 스위치 상태의 특정 순서를 기반으로 하므로 스위치 상태가 변경될 때마다 퍼즐이 풀렸는지 확인해야 합니다. 이를 위해 앞서 정의한
switch_event_handler클래스를 사용하여 스위치당 두 개의 이벤트를 수신합니다. 각 스위치마다 두 개의 구독을 만듭니다. 하나는TurnedOnEvent스위치, 또 하나는TurnedOffEvent스위치에 대한 것입니다. 두 이벤트로switch_event_handler클래스의OnSwitchPressed()함수를 구독합니다. 두switch_state_puzzle레퍼런스에 현재Switch를 전달합니다.
## 실행 중인 게임에서 장치 시작 시 실행
OnBegin<override>()<suspends>:void=
Print("Loading Switch Puzzle")
# 각 스위치를 루프하고 각 스위치에 대한 이벤트 핸들러 추가
for (SwitchIndex -> Switch : Switches):
Print("Switch {SwitchIndex} added")
Switch.TurnedOnEvent.Subscribe(switch_event_handler{PuzzleDevice := Self, Switch := Switch}.OnSwitchPressed)
Switch.TurnedOffEvent.Subscribe(switch_event_handler{PuzzleDevice := Self, Switch := Switch}.OnSwitchPressed)
- Visual Script Code에서 스크립트를 저장하고 UEFN에서 Verse -> Verse 코드 빌드(Build Verse Code) 를 클릭합니다.
레벨을 테스트할 때 스위치를 켜거나 끌 때마다 상호작용한 스위치의 인덱스와 Clicked 라는 단어가 출력되는 것을 볼 수 있습니다.
퍼즐 상태
퍼즐의 각 스위치는 유효 및 유효하지 않음의 두 가지 상태를 갖습니다.
퍼즐을 풀려면 플레이어는 스위치를 특정 순서대로 토글해야 합니다. 코드에서 이 순서를 구현하려면 각 스위치의 유효한 상태 순서를 정의하고 플레이어가 스위치 상태를 업데이트할 때마다 이 순서를 확인해야 합니다.
-
새 메서드
ValidState()를switch_state_puzzle클래스에 추가합니다. 이 메서드는 스트링을 받으며 플레이어가 스위치를 유효 상태로 뒤집을 때마다 오디오 클립을 재생하여 플레이어에게 잘하고 있다는 오디오 피드백을 제공합니다. -
ValidState()에서 전달된State스트링을 출력하고 앞서 구성한ValidAudioPlayer에서Play()를 호출합니다.
# 상태가 유효할 때 수행할 액션
ValidState(State : string) : void =
#유효 사운드 재생
Print("Valid {State}")
ValidAudioPlayer.Play()
- 새 메서드
InvalidState()를switch_state_puzzle클래스에 추가합니다. 이 메서드는 플레이어가 유효하지 않은 상태를 트리거할 때 사운드를 재생한 후 모든 스위치를 리셋합니다.
# 상태가 유효하지 않을 때 수행할 액션
InvalidState(InPlayer : agent) : void =
#버저 사운드 재생
#모든 스위치 지우기
Print("Invalid")
InvalidState()에서는 유효하지 않음 을 출력하고 앞서 구성한InvalidAudioPlayer에서Play()를 호출하여 오디오 클립을 재생함으로써 플레이어에게 유효하지 않은 상태를 트리거했음을 알립니다.InvalidTrigger에서도Trigger()를 호출하고InvalidHUDMessage를Show()해야 합니다.
# 상태가 유효하지 않을 때 수행할 액션
InvalidState(InPlayer : agent) : void =
#버저 사운드 재생
#모든 스위치 지우기
Print("Invalid")
InvalidAudioPlayer.Play()
InvalidTrigger.Trigger()
InvalidHUDMessage.Show()
스위치 장치의 이벤트를 구독하는 for 루프를 생성합니다. print 문은 플레이어가 뒤집는 스위치와 스위치가 뒤집힌 시퀀스를 식별합니다.
# 각 스위치를 루프하고 각 스위치에 대한 이벤트 핸들러 추가
for (SwitchIndex -> Switch : Switches):
Print("Switch {SwitchIndex} added")
Switch.TurnedOnEvent.Subscribe(switch_event_handler{PuzzleDevice := Self, Switch := Switch}.OnSwitchPressed)
Switch.TurnedOffEvent.Subscribe(switch_event_handler{PuzzleDevice := Self, Switch := Switch}.OnSwitchPressed)
for 루프에서 모든 스위치를 루프하고 각 스위치를 끕니다. 스위치의 TurnOff() 메서드에는 플레이어 작동자가 필요하므로 유효하지 않음 상태를 트리거한 플레이어를 전달합니다.
## 모든 스위치를 루프하고 각 스위치 끄기
for (SwitchIndex -> Switch : Switches):
Switch.TurnOff(InPlayer)
- 코드를 저장 하고 UEFN으로 돌아가서 Verse > Verse 코드 빌드 를 선택합니다.
다음으로 item_switch_puzzle 에서 각 스위치를 루프하는 로직을 만들고 퍼즐 매트릭스에 대해 그 상태의 유효성을 검사하여 스위치 뒤집기가 어떤 상태(유효 또는 유효하지 않음)에 해당하는지 판정해야 합니다.
스위치 상태 정렬
스위치 뒤집기의 유효성을 검사하려면 스위치의 현재 상태를 확인하기 위해 for 표현식을 사용하는 CheckSequence 메서드를 만들어야 합니다. 스위치의 상태 변경이 유효한지 여부를 정의하려면 if 문을 사용하여 스위치 뒤집기가 순서에서 유효한지 아닌지 정의합니다.
- 새 메서드
CheckSequence()를 추가합니다. 이 메서드는 스위치 상태 변경 작동자인 플레이어와 스위치 상태에 대응하는 논리 값의 배열을 받습니다.CheckSequence()에서for루프를 생성하여Switches배열의 각 스위치를 반복작업합니다. 배열의 각 스위치 인덱스를 구하고SwitchIndex변수에 저장합니다. for 루프에서GetCurrentState[]를 호출하여 각 스위치 상태를 확인합니다. 그런 다음 스위치 상태를 로그로 출력합니다.
# 스위치의 시퀀스를 유효성 검사하는 함수
CheckSequence(InPlayer : agent) : void =
for (SwitchIndex -> Switch : Switches):
if(Switch.GetCurrentState[]) then Print("{SwitchIndex} On") else Print("{SwitchIndex} Off")
이제 CheckSequence() 를 사용하여 확인할 상태 순서를 만들어야 합니다. 그렇게 하려면 switch_event_handler 의 OnSwitchPressed() 메서드에 새 기능을 추가해야 합니다.
상태 순서
배열을 사용하여 스위치 상태 순서를 생성합니다. 각 배열은 스위치가 뒤집히는 순서의 유효성을 검사합니다. 프린트 로거를 사용하여 플레이어의 스위치 액션 순서를 로깅하고 순서 번호를 로거로 출력(1, 2, 3, 4)함으로써 스위치가 클릭됐는지, 순서가 유효한지 로깅합니다.
OnSwitchPressed()의if문에서CheckSequence()를 호출하고 플레이어와 새 논리 값 배열을 모두 전달합니다. 이 새 배열은 스위치 순서와 일치해야 하며false값은 꺼짐 스위치,true값은 켜짐 스위치를 나타냅니다. 플레이어가 처음 눌러야 하는 스위치를true로 설정하고 나머지 모든 값을 false로 설정합니다.CheckSequence[]호출이 성공하면ValidState()를 호출하여 '1'을 전달하고 첫 번째 스위치가 눌렸음을 나타냅니다.
OnSwitchPressed(InPlayer : agent) : void =
Print("Clicked")
PuzzleDevice.CheckSequence(InPlayer)
- 퍼즐 내 각 스위치의 스위치 뒤집기에 대한 정답 키를 누르려는 순서대로 하드코딩합니다.
if:
# 유효한 상태를 확인하고 상태 유효성 검사를 하드코딩합니다.
# 상태 1 [off],[off],[on],[off]
not Switches[0].GetCurrentState[]
not Switches[1].GetCurrentState[]
Switches[2].GetCurrentState[]
not Switches[3].GetCurrentState[]
then:
ValidState("One")
else if:
# 유효한 상태 확인
#상태 2 [On], [Off], [On], [Off]
Switches[0].GetCurrentState[]
not Switches[1].GetCurrentState[]
Switches[2].GetCurrentState[]
not Switches[3].GetCurrentState[]
then:
ValidState("Two")
else if:
# 유효한 상태 확인
#상태 3 [On], [On], [On], [Off]
Switches[0].GetCurrentState[]
Switches[1].GetCurrentState[]
Switches[2].GetCurrentState[]
not Switches[3].GetCurrentState[]
then:
ValidState("Three")
else if:
# 유효한 상태 확인
#상태 4 [On], [On], [On], [On], 퍼즐 완료됨
Switches[0].GetCurrentState[]
Switches[1].GetCurrentState[]
Switches[2].GetCurrentState[]
Switches[3].GetCurrentState[]
then:
CompletedState()
- 마지막으로
else표현식을 끝에 추가하여InvalidState()를 호출합니다.CheckSequence[]호출이 하나라도 실패하면 else 문이 실행됩니다.
else:
# 유효한 상태가 아니므로 유효하지 않음
InvalidState(InPlayer)
- 이제
switch_event_handler코드는 다음과 같게 됩니다.
# 스위치의 시퀀스를 유효성 검사하는 함수
CheckSequence(InPlayer : agent) : void =
for (SwitchIndex -> Switch : Switches):
if(Switch.GetCurrentState[]) then Print("{SwitchIndex} On") else Print("{SwitchIndex} Off")
if:
# 유효한 상태를 확인하고 상태 유효성 검사를 하드코딩합니다.
# 상태 1 [off],[off],[on],[off]
not Switches[0].GetCurrentState[]
not Switches[1].GetCurrentState[]
Switches[2].GetCurrentState[]
not Switches[3].GetCurrentState[]
then:
ValidState("One")
else if:
# 유효한 상태 확인
#상태 2 [On], [Off], [On], [Off]
Switches[0].GetCurrentState[]
not Switches[1].GetCurrentState[]
Switches[2].GetCurrentState[]
not Switches[3].GetCurrentState[]
then:
ValidState("Two")
else if:
# 유효한 상태 확인
#상태 3 [On], [On], [On], [Off]
Switches[0].GetCurrentState[]
Switches[1].GetCurrentState[]
Switches[2].GetCurrentState[]
not Switches[3].GetCurrentState[]
then:
ValidState("Three")
else if:
# 유효한 상태 확인
#상태 4 [On], [On], [On], [On], 퍼즐 완료됨
Switches[0].GetCurrentState[]
Switches[1].GetCurrentState[]
Switches[2].GetCurrentState[]
Switches[3].GetCurrentState[]
then:
CompletedState()
else:
# 유효한 상태가 아니므로 유효하지 않음
InvalidState(InPlayer)
- 코드를 저장 하고 UEFN으로 돌아가서 Verse > Verse 코드 빌드 를 선택합니다.
이제 게임에서 스위치를 켜면 다음과 같은 로그가 출력될 것입니다.
-
퍼즐 스위치 로딩 중(Loading Switch Puzzle) - 게임 시작 시
-
스위치 {SwitchIndex} 추가됨 - 스위치가 루프에 추가될 때
-
클릭됨 - 플레이어가 스위치를 켤 때
-
유효 {State} - 플레이어가 알맞은 스위치를 순서대로 켜는 경우
-
유효하지 않음 - 플레이어가 잘못된 스위치를 켜는 경우
로그가 스위치 뒤집기를 올바르게 보고한다면 편집 가능 장치를 item_switch_puzzle 클래스에 더 추가하여 각 상태가 특정 작업을 수행하게 만들 준비가 된 것입니다.
장치 추가하기
플레이어가 퍼즐을 성공적으로 완료하고 퍼즐이 스위치의 ValidStates를 CompletedState까지 루프하면 성공 결과는 아이템 지급 등 특정 작업을 수행해야 합니다.
InvalidStates의 경우도 마찬가지입니다. 플레이어가 퍼즐을 틀리면 스크립트가 이를 처리해서 플레이어에게 다시 해야 함을 알립니다. 이를 완료하려면 item_switch_puzzle 클래스에 장치를 추가해야 합니다.
스크립트에 편집 가능 장치를 추가하면 장치가 Verse 장치의 사용자 옵션에 표시됩니다. 여기서 장치를 Verse 장치에 연결하여 Verse 스크립트에 작성된 대로 게임에서 기능하게 할 수 있습니다.
- item_switch_puzzle 아래에 다음 @editable 장치를 추가합니다.
@editable
InvalidTrigger : trigger_device = trigger_device{}
@editable
InvalidHUDMessage : hud_message_device = hud_message_device{}
@editable
InvalidAudioPlayer : audio_player_device = audio_player_device{}
@editable
ValidAudioPlayer : audio_player_device = audio_player_device{}
@editable
FindItemsHUDMessage : hud_message_device = hud_message_device{}
@editable
CompletedAudioPlayer : audio_player_device = audio_player_device{}
@editable
ItemSpawners : item_spawner_device = item_spawner_device{} #이는 이 퍼즐과 연결된 모든 아이템 생성 장치를 선택합니다.
- 새 메서드
CompletedState()를item_switch_puzzle클래스에 추가합니다. 이 메서드는 퍼즐이 완료될 때 수행할 액션을 처리합니다.
## 퍼즐 완료 시 수행할 액션
CompletedState() : void =
# 성공 사운드 재생
# 모든 스위치 비활성화 설정
# 어태치된 아이템 생성 장치에서 아이템 생성
Print("Completed")
1. CompletedState() 메서드에 ItemSpawners 의 각 아이템 생성 장치를 반복작업하는 for 표현식을 추가합니다. Enable() 로 각 아이템 생성 장치를 활성화한 다음 SpawnItem() 을 호출하여 플레이어에게 퍼즐 해결 보상을 제공합니다.
## 각 아이템 생성 장치를 호출하여 아이템 생성을 활성화하도록 허용하는 아이템 생성 장치 루핑
for (ItemSpawnerIndex -> ItemSpawner : ItemSpawners):
ItemSpawner.Enable()
ItemSpawner.SpawnItem()
- 퍼즐이 성공적으로 완료되면 앞서 구성한
CompletedAudioPlayer에서Play()를 호출하고,ItemSpawnerIndex와 호출Enable1및SpawnItem을 사용하여 아이템 생성 장치에서 금속 조각을 생성해야 합니다.FindItemsHUDMessage에서Show()를 호출하여 플레이어에게 새로 생성된 아이템을 찾아야 한다고 알립니다. 또한, 플레이어가 스위치와 계속해서 상호작용하는 것을 원치 않으므로 두 번째 for 표현식을 추가하여Switches의 각 스위치를 루프하고Disable()을 호출하여 비활성화합니다.
# 퍼즐 완료 시 수행할 액션
CompletedState() : void =
# 성공 사운드 재생
# 모든 스위치 비활성화 설정
# 어태치된 아이템 생성 장치에서 아이템 생성
Print("Completed")
# 각 아이템 생성 장치를 호출하여 아이템 생성을 활성화하도록 허용하는 아이템 생성 장치 루핑
for (ItemSpawnerIndex -> ItemSpawner : ItemSpawners):
ItemSpawner.Enable()
ItemSpawner.SpawnItem()
# 퍼즐 시퀀스 완료를 위한 특수 오디오 재생
CompletedAudioPlayer.Play()
# 플레이어에게 새로 생성된 아이템을 찾도록 알리는 HUD 메시지 재생
FindItemsHUDMessage.Show()
# 성공적으로 퍼즐 완료 시 모든 스위치 비활성화
for (SwitchIndex -> Switch : Switches):
Switch.Disable()
- 코드를 저장 하고 UEFN으로 돌아가서 Verse > Verse 코드 빌드 를 선택합니다.
이제 장치가 UEFN의 아이템 스위치 퍼즐 장치에 추가됩니다.
장치 선택
모든 @editable 장치가 Verse 장치에 추가됐습니다. 이제 가져온 장치를 Verse 장치에 어태치하여 퍼즐을 생성해야 합니다. 그렇게 하려면 아웃라이너(Outliner) 에서 item_switch_puzzle을 선택합니다. 그러면 디테일(Details) 패널에서 모든 장치 슬롯이 표시됩니다. 장치를 슬롯에 연결하기만 하면 됩니다.
-
퍼즐 스위치 장치를 아이템 스위치 퍼즐 아래의 스위치 배열 엘리먼트에 추가합니다.
-
유효하지 않음 트리거 를 InvalidTrigger 슬롯에 추가합니다.
-
유효하지 않음 HUD 메시지 를 InvalidHUDMessage 슬롯에 추가합니다.
-
유효하지 않음 오디오 플레이어를 InvalidAudioPlayer 슬롯에 추가합니다.
-
유효 오디오 플레이어 를 ValidAudioPlayer 슬롯에 추가합니다.
-
찾기 HUD 메시지 장치를 FindHUDMessage 슬롯에 추가합니다.
-
완료 오디오 플레이어 를 CompletedAudioPlayer 슬롯에 추가합니다.
-
아이템 생성 장치 를 ItemSpawners 배열 엘리먼트에 추가합니다.
-
게임 내 표시(Visible in Game) 옵션을 체크 해제하여 게임 중에 Verse 장치를 숨깁니다.
이제 레벨을 플레이테스트하여 퍼즐이 방 탈출 경험을 어떻게 향상하는지 확인할 수 있습니다.
다음 섹션
스위치 상태 퍼즐이 작동하면 플레이어가 오프닝 시네마틱 종료 시 오두막 지하 2층의 대기실로 이동하는 자동 순간이동 Verse 스크립트를 만들 준비가 된 것입니다.