Verse 파쿠르 템플릿(Verse Parkour Template) 은 플레이어들이 전략적 기동을 통해 장애물을 넘고 플랫폼을 돌아다니면서 배터리를 모으는 게임 모드의 제작 방식을 소개합니다.
이 게임 모드에서는 플레이어가 배터리 4개를 모으면 레벨을 완료합니다. 비밀 배터리를 찾을 경우 시간이 연장됩니다. 시간이 종료되면 플레이어는 시작 지점으로 돌아옵니다.
이 템플릿은 다음과 같은 기본 언어 기능을 선보입니다.
-
for 루프
-
등록
-
배열
-
장치 API
동시성과 같은 복잡한 개념은 이 템플릿에서 사용되지 않습니다.
개요
다음은 이 섬을 다시 생성하는 데 필요한 단계와 이상적인 순서에 대한 개요입니다.
-
새 프로젝트를 생성하고 섬 설정을 수정하여 게임을 구성합니다.
-
아레나를 만듭니다.
-
장치를 구성합니다.
-
Verse 스크립트를 추가합니다.
-
Verse 장치를 구성합니다.
새 프로젝트 생성 및 게임 설정하기
-
UEFN을 실행하여 신규 빈 프로젝트를 생성합니다.
-
아웃라이너(Outliner) 에서 섬 설정(Island Settings) 장치를 선택하여 사용자 옵션 - 게임 규칙(User Options - Game Rules) 을 찾습니다.
-
사용자 옵션을 아래와 같이 수정합니다.
옵션 값 설명 게임 승리 조건(Game Win Condition) 최다 득점 승리(Most Scores Win) 가장 높은 점수를 획득한 플레이어가 게임에서 승리합니다. 곡괭이 파괴력(Pickaxe Destruction) 없음(None) 곡괭이는 환경 피해를 입힐 수 없습니다. 곡괭이를 갖고 시작(Start With Pickaxe) False 플레이어는 곡괭이 없이 게임을 시작합니다. 아이템 자동 줍기(Auto Pickup Items) 켜기(Yes) 플레이어는 자신과 접촉한 아이템을 자동으로 줍습니다. 매달리기/전력질주/슬라이딩/어깨치기 허용(Allow Mantling/Sprinting/Sliding/Shoulder Bashing) True 플레이어가 파쿠르로 환경을 극복할 수 있습니다. 라운드 승리 조건(Round Win Condition) 점수(Score) 가장 높은 점수를 획득한 플레이어가 라운드에서 승리합니다. 점수판 1번째 칸(First Scoreboard Column) 점수(Score) 점수판의 1번째 칸에 점수가 표시됩니다.
아레나 만들기
이 맵은 Fortnite > Galleries > Props 에서 찾을 수 있는 사이버 도시 사물 갤러리(Cyber City Prop Gallery) 를 사용합니다.
이 맵에 플레이어들이 파쿠르로 극복할 플랫폼과 장애물을 추가해 재구성합니다.
장치 구성하기
이 튜토리얼에서는 다음 장치를 사용합니다.
플레이어 생성 패드 장치
플레이어 생성 패드(Player Spawn Pad) 장치를 사용하여 맵에 플레이어를 생성합니다. 맵 시작 시, Fortnite > Devices > Player Spawn Pad 경로의 생성 패드를 플레이어별로 하나씩 배치합니다.
이 장치를 구성하려면 사용자 옵션 을 다음과 같이 구성합니다.
| 옵션 | 값 | 설명 |
|---|---|---|
| 게임 내 표시(Visible In Game) | False | 이 장치가 게임에 표시되지 않습니다. |
아이템 지급 장치
UEFN에서 소모품을 콘텐츠 드로어(Content Drawer) 에서 드래그하면 아이템 생성 장치(Item Spawner) 에 자동으로 배치됩니다. 배터리 아이템을 맵으로 드래그합니다. 배터리는 Fortnite > Items > Battery 에서 찾을 수 있습니다.
이 장치를 구성하려면 사용자 옵션 을 다음과 같이 구성합니다.
| 옵션 | 값 | 설명 |
|---|---|---|
| 생성까지 걸리는 시간(Time Before Spawn) | 0.1 | 아이템이 생성되기까지의 시간을 설정합니다. |
| 타이머 일치 시 아이템 재생성(Respawn Item on Timer) | False | 한번 주운 배터리는 재생성되지 않습니다. |
| 게임 중 베이스 표시(Base Visible During Game) | False | 이 장치가 게임에 표시되지 않습니다. |
| 무기 탄약 추가 지급(Bonus Ammo For Weapons) | False | 무기가 추가 탄약을 지급하지 않습니다. |
| 지나칠 때 줍기(Run Over Pickup) | True | 플레이어는 이 아이템을 자동으로 줍습니다. |
| 아이템 스케일(Item Scale) | 2.0 | 배터리의 크기를 결정합니다. |
이 장치를 4번 복사 및 붙여넣기한 후 맵에 배치합니다.
게임 종료 장치
게임 종료(End Game) 장치를 배치하여 활성화 시 게임을 종료합니다.
이 장치를 구성하려면 사용자 옵션 을 다음과 같이 구성합니다.
| 옵션 | 값 | 설명 |
|---|---|---|
| 커스텀 승리 팝업(Custom Victory Callout) | 텍스트 입력 | 승리한 플레이어에게 표시할 텍스트를 입력합니다. |
피해 볼륨 장치
피해 볼륨(Damage Volume) 장치는 플레이어가 들어가면 피해를 입는 범위입니다. 이 장치를 맵 아래에 배치하고 구역 너비(Zone Width), 깊이(Depth), 높이(Height) 를 조정하여 떨어진 플레이어가 즉시 처치되도록 아레나 하부를 덮습니다.
이 장치를 구성하려면 사용자 옵션 을 다음과 같이 구성합니다.
| 옵션 | 값 | 설명 |
|---|---|---|
| 피해량(Damage) | 500 | 이 장치는 떨어지는 플레이어를 즉시 처치하기에 충분한 피해를 입힙니다. |
타이머 장치
타이머(Timer) 장치를 게임 종료 장치 근처에 배치합니다. 이 장치는 플레이어가 처치되고 다시 시작할 때까지 남은 시간을 카운트다운합니다.
이 장치를 구성하려면 사용자 옵션 을 다음과 같이 구성합니다.
| 옵션 | 값 | 설명 |
|---|---|---|
| 지속 시간(Duration) | 30 | 이 타이머는 30초간 지속됩니다. |
| 게임 시작 시 시작(Start at Game Start) | True | 게임이 시작되면 타이머가 시작됩니다. |
| 적용 대상(Applies To) | 플레이어 | 타이머가 시작되면 특정 플레이어에게 적용됩니다. |
| 타이머 종료 시 성공(Success on Timer End) | False | 타이머가 종료되더라도 성공으로 판정되지 않습니다. |
| 게임 중에 표시(Visible During Game) | 숨김(Hidden) | 이 장치를 게임에서 숨깁니다. |
| 타이머 진행 중 텍스트(Timer Running Text) | 텍스트 입력 | 타이머에 표시할 텍스트를 입력합니다. |
HUD 메시지
HUD 메시지 장치를 사용하여 게임 관련 메시지를 플레이어에게 표시합니다.
이 장치를 구성하려면 사용자 옵션 을 다음과 같이 구성합니다.
| 옵션 | 값 | 설명 |
|---|---|---|
| 표시 시간(Display Time) | 2.0 | 메시지가 2초간 표시된 후 사라집니다. |
| 라운드 시작 시 표시(Show on Round Start) | False | 이 메시지는 라운드 시작 시가 아니라 배터리를 주웠을 때 표시됩니다. |
Verse 스크립트 추가하기
@editable 함수로 장치를 레퍼런스하는 것부터 시작하여 다음 Verse 스크립트를 추가합니다.
작성된 순서대로 코드를 복사할 수 있습니다. 코멘트는 스크립트를 명확하게 설명하기 위해 추가됩니다.
using { /Fortnite.com/Devices }
using { /Fortnite.com/Characters }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
log_parkour := class(log_channel){}
# Verse로 작성하여 레벨에 배치할 수 있는 포크리 장치입니다.
# 이 스크립트 샘플은 파쿠르의 한 예시로, 목표는 타이머 만료 전 4개의 배터리를 수집하는 것입니다.
#
# 시작하기:
# https://dev.epicgames.com/documentation/ko-kr/uefn/learn-programming-with-verse-in-unreal-editor-for-fortnite
parkour_race_script := class(creative_device):
Logger : log = log{Channel:=log_parkour}
# 플레이어 생성 장치에 대한 장치 레퍼런스입니다.
@editable
PlayerSpawnDevice : player_spawner_device = player_spawner_device{}
# 승리 시 게임 종료 장치입니다.
@editable
EndGameVictoryDevice : end_game_device = end_game_device{}
# 이 게임 모드의 타이머입니다.
@editable
TimerDevice : timer_device = timer_device{}
# 플레이어가 배터리 획득 시 HUD 메시지 피드백입니다.
@editable
HUDMessageBattery : hud_message_device = hud_message_device{}
# 보유한 아이템 생성 장치의 배열입니다.
@editable
BatteryItemSpawners : []item_spawner_device = array{}
@editable
SecretBatteryItemSpawner : item_spawner_device = item_spawner_device{}
# 플레이어가 비밀 배터리를 주울 시 추가할 미세조정 가능 시간입니다.
@editable
SecretBatteryTimeReward : float = 10.0
# 지금까지 수집한 배터리 수를 나타내는 integer의 선언입니다.
var BatteriesCollected : int = 0
위 스크립트는 @editable을 사용하여 포크리 장치, 배열, float를 UEFN에 노출시키는 방법을 보여줍니다. 나중에 이걸 자신의 스크립트로 호출하려면, 우선 이 장치들을 Verse로 정의해야 합니다.
# 배터리 수집 시 표시할 메시지입니다.
BatteryCollectedMessage<localizes>(Amount:int) : message = "You collected {Amount} battery"
BatteriesCollectedMessage<localizes>(Amount:int) : message = "You collected {Amount} batteries"
# 비밀 배터리 수집 시 메시지 및 완료 메시지입니다.
AllBatteriesCollectedMessage<localizes> : message = "You collected all of the batteries!"
SecretBatteryCollectedMessage<localizes> : message = "You collected the secret battery, additional time added!"
위 스크립트는 수집한 배터리 수에 따라 파라미터화된 메시지를 반환하는 함수의 정의 방법을 보여줍니다. 또한 모든 배터리와 비밀 배터리를 수집했을 때 표시할 메시지도 정의합니다.
# 실행 중인 게임에서 이 device_script가 시작되면 실행됩니다.
OnBegin<override>()<suspends>:void=
# 이처럼 로그에 출력하여 스크립트가 할 일을 결정할 수 있습니다.
Logger.Print("Parkour Race Script Started!")
# AgentSpawnedEvent에 등록합니다.
# 플레이어 생성 시 함수 'HandleAgentSpawned'가 호출됩니다.
PlayerSpawnDevice.SpawnedEvent.Subscribe(HandleAgentSpawned)
# 타이머도 동일합니다. 만료되는 경우에 등록합니다.
TimerDevice.FailureEvent.Subscribe(HandleTimerExpired)
# batteryItemSpawners 배열 및 각 아이템 생성 장치를 살펴보며, ItemPickupEvent에 등록합니다.
# 각 아이템 생성 장치마다 반복하며, 위에서 AgentSpawnedSubscription 및 TimerExpiredSubscription에서 했던 것처럼 핸들을 저장하지 않습니다.
# 핸들을 저장할 필요는 없지만, 핸들이 없으면 등록을 취소할 수 없으므로 아이템을 주울 때마다 발동됩니다.
for (BatterySpawner : BatteryItemSpawners):
BatterySpawner.ItemPickedUpEvent.Subscribe(HandleBatteryPickedUp)
<# integer를 사용하여 배열을 살펴보는 위의 for 루프를 실행하는 또 다른 방법입니다.
for (i:int := 0..BatteryItemSpawners.Length - 1):
if (Battery := BatteryItemSpawners[i]):
Battery.ItemPickedUpEvent.Subscribe(HandlebatteryPickedUp) #>
SecretBatteryItemSpawner.ItemPickedUpEvent.Subscribe(HandleSecretBatteryPickedUp)
OnBegin 함수는 게임이 시작되면 주운 배터리의 이벤트 for 루프 동안 어떤 일이 벌어지는지 정의합니다.
# 플레이어 생성 패드에서 에이전트 생성 시 호출되는 함수입니다.
HandleAgentSpawned(Agent:agent):void=
Logger.Print("Agent Spawned!")
# 재생성되는 플레이어가 전체 시간을 획득하도록 타이머 장치를 리셋합니다.
TimerDevice.Reset(Agent)
TimerDevice.Start(Agent)
위는 플레이어 생성 시 타이머를 초기화하고 재시작하는 코드입니다.
# 아이템 생성 장치에서 배터리 아이템을 주운 경우 호출되는 함수입니다.
HandleBatteryPickedUp(Agent:agent):void=
# 수집한 배터리 수를 증가시킵니다.
set BatteriesCollected = BatteriesCollected + 1
# 이 방법으로 배터리 수를 로그에 출력합니다. 디버깅에 유용합니다.
Logger.Print("Number of batteries picked up: {BatteriesCollected}")
# 게임 종료 시까지 수집된 배터리가 충분한지 여부를 확인합니다.
if:
BatteriesCollected >= BatteryItemSpawners.Length
then:
# 4개 이상의 배터리를 수집했는지 확인합니다. 4개 이상 수집한 경우, EndGame 함수를 호출합니다.
spawn { EndGame(Agent) }
else:
# 이 코드는 배터리 수가 4개 미만인 경우 실행됩니다. 플레이어를 유인하는 HUD 메시지를 표시합니다.
# 1개의 배터리만 수집된 경우 HUD 메시지는 'battery'입니다. 2개 이상 수집된 경우 'batteries'가 됩니다.
if:
BatteriesCollected = 1
then:
HUDMessageBattery.SetText(BatteryCollectedMessage(BatteriesCollected))
HUDMessageBattery.Show(Agent)
else:
HUDMessageBattery.SetText(BatteriesCollectedMessage(BatteriesCollected))
HUDMessageBattery.Show(Agent)
# 그런 다음 구성한 배열에서 다음 아이템 생성 장치를 얻습니다.
# 이는 배열에 '인덱싱'하는 방법으로 이루어집니다. NextBatterySpawner가 올바르게 레퍼런스되도록 'if' 문 내에 있습니다.
if:
NextBatterySpawner := BatteryItemSpawners[BatteriesCollected]
then:
# 다음 아이템 생성 장치를 얻었다면, 획득할 다음 배터리를 활성화하는 SpawnItem을 호출합니다.
NextBatterySpawner.SpawnItem()
위는 배터리 줍기를 처리하는 코드입니다. 배터리를 전부 주웠다면 EndGame 메서드가 호출됩니다. 그렇지 않으면 플레이어에게 HUD 메시지가 표시되며 다음 배터리가 생성됩니다.
HandleSecretBatteryPickedUp(Agent:agent):void=
Logger.Print("Picked up secret battery")
# 추가 시간을 더할 수 있도록 남은 시간을 얻습니다.
var TimeRemaining:float = TimerDevice.GetActiveDuration( Agent )
var TimeToAdd:float = (TimeRemaining + SecretBatteryTimeReward)
# 타이머 장치에 추가 시간을 더하지만, 초기 시작 시간을 초과하지는 않습니다.
TimerDevice.SetActiveDuration(Min(TimeToAdd, TimerDevice.GetMaxDuration()), Agent )
HUDMessageBattery.SetText(SecretBatteryCollectedMessage)
HUDMessageBattery.Show(Agent)
위는 비밀 배터리를 주웠을 때 타이머 장치에 시간을 추가하는 코드입니다. 타이머 장치의 시작 시간인 30초를 초과하지 않게 설정되어 있습니다. 또한 이 코드는 화면 메시지도 표시합니다.
# 타이머가 만료될 때 호출되는 함수입니다.
HandleTimerExpired(MaybeAgent:?agent):void=
Logger.Print("Timer Ended")
if (Agent := MaybeAgent?):
Agent
# 플레이어를 처치합니다.
if:
FortCharacter:fort_character = Agent.GetFortCharacter[]
then:
FortCharacter.Damage(500.0)
위는 시간 종료 시 플레이어를 처치하는 코드입니다. 그런 다음 플레이어가 부활하고, 타이머는 HandleAgentSpawned 메서드에서 초기화됩니다.
# 게임 종료를 처리하는 비동기화 함수입니다.
EndGame(Agent:agent)<suspends>:void=
HUDMessageBattery.SetText(AllBatteriesCollectedMessage)
HUDMessageBattery.Show(Agent)
# 게임 종료 전 3초 동안 기다립니다.
Sleep(3.0)
EndGameVictoryDevice.Activate(Agent)
# 이 device_script가 정지되거나 게임이 종료되는 경우 실행됩니다.
OnEnd<override>():void=
Logger.Print("Verse device stopped!")
위는 게임을 종료하는 코드입니다. Sleep(3.0) 사용은 비동기 메서드 사용 예시입니다.
Verse 장치 구성하기
Verse 스크립트를 컴파일하고 콘텐츠 드로어 에서 자신의 장치를 찾습니다. Verse 장치를 맵의 미확인 영역으로 드래그하여 세팅을 커스터마이징합니다.
장치의 디테일(Details) 패널에서 각 참조된 장치가 위 사진과 일치하도록 세팅을 환결설정합니다.
이 장치를 구성하려면 사용자 옵션 을 다음과 같이 구성합니다.
| 옵션 | 값 | 설명 | |
|---|---|---|---|
| PlayerSpawnDevice | 플레이어 생성 패드(Player Spawn Pad) | 드롭다운 박스에서 이 옵션을 선택하여 장치를 참조합니다. | |
| EndGameVictoryDevice | 게임 종료 승리 장치(End Game Victory Device) | 드롭다운 박스에서 이 옵션을 선택하여 장치를 참조합니다. | |
| TimerDevice | 타이머(Timer) | 드롭다운 박스에서 이 옵션을 선택하여 장치를 참조합니다. | |
| HUDMessageBattery | HUD 메시지 장치 배터리(HUD Message Device Battery) | 드롭다운 박스에서 이 옵션을 선택하여 장치를 참조합니다. | |
| PlayerSpawnDevice | 플레이어 생성 패드(Player Spawn Pad) | 드롭다운 박스에서 이 옵션을 선택하여 장치를 참조합니다. | |
| BatteryItemSpawners - 0 | 배터리 생성 장치 1(Battery Spawner 4) | 플레이어 생성 패드(Player Spawn Pad) | 드롭다운 박스에서 이 옵션을 선택하여 장치를 참조합니다. |
| BatteryItemSpawners - 1 | 배터리 생성 장치 2(Battery Spawner 4) | 플레이어 생성 패드(Player Spawn Pad) | 드롭다운 박스에서 이 옵션을 선택하여 장치를 참조합니다. |
| BatteryItemSpawners - 2 | 배터리 생성 장치 3(Battery Spawner 4) | 플레이어 생성 패드(Player Spawn Pad) | 드롭다운 박스에서 이 옵션을 선택하여 장치를 참조합니다. |
| BatteryItemSpawners - 3 | 배터리 생성 장치 4(Battery Spawner 4) | 플레이어 생성 패드(Player Spawn Pad) | 드롭다운 박스에서 이 옵션을 선택하여 장치를 참조합니다. |
| SecretBatteryItemSpawner | 배터리 생성 장치 - 비밀(Battery Spawner - Secret) | 드롭다운 박스에서 이 옵션을 선택하여 장치를 참조합니다. | |
| SecretBatteryTimeReward | 10.0 | 비밀 배터리를 수집했을 때의 시간 보상입니다. |
세션 시작(Launch Session) 을 선택하여 완성된 레벨을 테스트합니다.