이 기능은 실험단계이므로, 사용해 보면서 피드백을 제공하고 에픽에서 구상 중인 부분을 살펴볼 수 있습니다. 현재 커스텀 인벤토리 및 아이템을 사용하는 프로젝트는 퍼블리싱할 수 없습니다.
실험단계에서 생성된 에셋은 이전 버전과의 호환성이 보장되지 않는다는 점에 유의하세요. 실험단계 기능의 API는 변경될 수 있으며, 에픽게임즈의 재량에 따라 전체 실험단계 기능 또는 특정 기능이 제거될 수도 있습니다. 이 기능으로 작업을 시작하기 전에 알려진 문제 목록을 확인해 보세요.
이 튜토리얼은 씬 그래프와 Verse에서 커스텀 인벤토리 및 아이템 시스템을 사용하여 커스텀 키카드 아이템을 만드는 방법을 보여줍니다.
다음 예시를 따라 커스텀 키카드를 만드는 방법을 알아보고 나면, 키카드를 찾고 사용해 잠긴 구역에 액세스하는 목표가 있는 게임에서 커스텀 키카드를 활용해 볼 수 있습니다. 다음은 몇 가지 예입니다.
강탈용 오브젝트가 들어 있는 잠긴 방
게임의 다음 영역
보스를 물리친 후 얻는 보물이나 보상
시작하기 전에
이 튜토리얼을 성공적으로 완료하기 위해서는 UEFN, 씬 그래프, Verse 코드를 익숙하게 다룰 수 있어야 합니다.
프로젝트 구성하기
다음 단계를 따라 프로젝트를 구성하고 커스텀 인벤토리 및 아이템을 활성화합니다.
UEFN을 열고 원하는 섬 템플릿에서 프로젝트를 생성합니다. 섬 템플릿에서, 평평한 영역 위에서 작업하고 싶은 경우 기본(Blank) 프로젝트를 사용할 수 있습니다. 새 프로젝트를 명명하고 생성(Create)을 클릭하여 에디터에서 엽니다.
툴바에서 프로젝트(Project)를 클릭하고 프로젝트 세팅(Project Settings)을 선택합니다.
실험단계 액세스(Experimental Access) 섹션으로 스크롤을 내리고 인벤토리 시스템(Inventory System) 체크 박스를 선택합니다. 그러면 커스텀 인벤토리 및 아이템이 활성화됩니다.
방 만들기
먼저 이 예시에 사용할 방을 만들어야 하는데, 이 예시는 두 개의 잠긴 문을 비교하면서 시연해 보는 식으로 구성되어 있습니다.
첫 번째 문은 잠금 장치가 있는 문을 포트나이트 키카드로 여는 방법을 보여주며, 조건부 버튼 장치를 사용하여 플레이어가 키카드를 가지고 있는지를 확인합니다.
두 번째 문은 기존 포트나이트 키카드 아이템이 아닌 커스텀 키카드를 사용하는 방법을 보여주며, Verse를 사용하여 플레이어가 커스텀 키카드를 가지고 있는지를 확인합니다.
예시를 위한 방을 만드는 데 다음 포트나이트 에셋을 사용할 수 있습니다.
방: 콘텐츠 브라우저에서 Fortnite > Graybox Assets > Demo로 이동합니다. 이 예시에서는 DemoRoom 에셋을 사용합니다.
데모 부스: 콘텐츠 브라우저에서 Fortnite > Graybox Assets > Demo로 이동합니다. DemoDisplay 에셋을 사용합니다.
문:
초록색 벽의 문: Fortnite > Galleries > Building > Tilted Towers Wall Gallery N으로 이동합니다. 첫 번째 행 끝에서 교외 내부 문 C 02(Suburban Interior Door C 02) a8a9d603을 찾습니다.
상단에 어두운 트림이 있는 황갈색 벽의 문: 위와 같은 갤러리의 왼쪽에 있는 교외 내부 문 C 02 a9577d9d를 찾습니다.
테이블: Fortnite > Props > Super로 이동합니다. 훈련소 원형 테이블 A(Academy Round Table A) 13a04066을 찾습니다.
장치 구성하기
필요한 장치:
1 x 플레이어 생성 장치
2 x 잠금 장치
1 x 조건부 버튼 장치
2 x 볼륨 장치
1 x 아이템 배치 장치(어쏘리티 키카드 아이템)
포트나이트 키카드를 위한 문 구성하기
포트나이트의 일반적인 잠긴 문을 구성할 문 하나를 선택합니다. 다음 단계를 따라 첫 번째 문의 장치를 구성합니다.
문 옆의 벽에 잠금 장치 하나를 배치합니다. 디테일 패널에서 다음과 같이 장치 옵션을 커스터마이징합니다. 여기에 없는 옵션은 기본값으로 두면 됩니다.
옵션
값
설명
게임 중에 표시(Visible During Game)
False(선택 해제됨)
게임 실행 중에 플레이어가 볼 수 없도록 잠금 장치를 숨깁니다.
잠김 상태로 시작(Starts Locked)
잠김
게임 시작 시 문을 잠김 상태로 설정합니다.
잠겼을 때 상호작용 숨기기(Hide Interaction When Locked)
True(선택됨)
문이 잠겼을 때 상호작용 프롬프트를 숨깁니다.
초기 문 위치(Initial Door Position)
닫힘(Closed)
문의 기본 시작 위치를 닫힘으로 설정합니다.
사용자 옵션(User Options) - 기능(Functions)에서 잠금 장치의 다음 기능을 설정합니다.
아래 3단계에서 볼륨 장치를 배치하기 전에는 잠금 기능을 설정하지 못할 수도 있습니다.
기능
대상 장치
바인딩할 이벤트
설명
잠금 해제(Unlock)
조건부 버튼
활성화 시
조건부 버튼이 활성화될 때 문이 잠금 해제됩니다.
잠금(Lock)
볼륨
OnExit
플레이어가 포트나이트 장치 문의 볼륨에서 나갈 때 문이 잠깁니다.
문 자체의 중앙에 볼륨 장치를 하나 배치합니다. 디테일 패널에서 다음과 같이 장치 옵션을 커스터마이징합니다. 여기에 없는 옵션은 기본값으로 두면 됩니다.
옵션
값
설명
볼륨 셰이프
원기둥
볼륨 형태를 설정합니다.
볼륨 높이
0.25x
볼륨 원기둥의 높이를 설정합니다.
볼륨 반경
0.9x
장치의 위치에서 얼마나 가깝거나 먼지를 결정하는 볼륨 원기둥의 반경을 설정합니다. 플레이어가 볼륨에 들어가려면 문에 가까이 가야 하도록 반경을 비교적 작게 설정합니다.
문 옆, 잠금 장치 아래에 조건부 버튼 장치를 배치합니다. 아래와 같이 옵션을 커스터마이징합니다. 여기에 없는 옵션은 기본값으로 두면 됩니다.
옵션
값
설명
열쇠 아이템 필요(Key Items Required)
True(선택됨), 1
조건을 통과하려면 열쇠 아이템이 필요한 것으로 지정하려면 이 항목을 선택합니다. 하나의 키카드만 필요하도록 지정하려면 필드에 1을 입력합니다.
열쇠 아이템 1(Key Item 1)
어쏘리티 키카드(Authority Keycard, 게임 내 이름) 또는 AGID_CP_Keycard_Agency(아이템 ID)
필요한 아이템을 선택하려면 드롭다운을 클릭하고 'keycard'를 검색합니다. 몇 가지 키카드 아이템이 있지만, 이 예시에서는 '어쏘리티 키카드' 아이템을 사용합니다.
사용자 옵션 - 기능에서 조건부 버튼 장치의 다음 기능을 설정합니다.
기능
대상 장치
바인딩할 이벤트
설명
활성화(Activate)
볼륨
입장 시(On Enter)
플레이어가 포트나이트 장치 문의 볼륨에 들어가면 조건부 버튼이 활성화됩니다. 플레이어가 어쏘리티 키카드를 가지고 있는지 여부를 확인합니다.
커스텀 키카드를 위한 문 구성하기
두 번째 문에서는 다음 단계를 따라 장치를 구성합니다.
두 잠금 장치의 옵션은 동일하므로, 첫 번째 잠금 장치를 복사하여 레벨에 사본을 붙여 넣어도 됩니다. 첫 번째 장치와 구분되도록 장치의 이름을 변경하는 것이 좋습니다.
사용자 옵션(User Options) - 기능(Functions)에서 잠금 장치의 다음 기능을 설정합니다.
플레이어 생성 장치를 배치하기 전에는 이 기능을 설정하지 못할 수도 있습니다.
기능
대상 장치
바인딩할 이벤트
설명
잠금(Lock)
플레이어 1 생성 패드(Player 1 Spawn Pad)
플레이어 생성 시
플레이어가 플레이어 1 생성 패드에서 생성되면 잠금 장치가 활성화되고 문이 잠깁니다.
두 볼륨 장치의 옵션이 동일하므로, 첫 번째 볼륨을 복사하여 레벨에 사본을 붙여 넣어도 됩니다. 첫 번째 장치와 구분되도록 장치의 이름을 변경하는 것이 좋습니다.
키카드를 위한 테이블 구성하기
포트나이트 키카드와 커스텀 키카드로 테이블을 구성하려면 다음 단계를 따릅니다.
장치만을 사용하는 잠긴 문과 테이블에서 가장 가까운 쪽에 아이템 배치 장치를 놓습니다.
디테일 패널에서 아래와 같이 아이템 배치 장치의 장치 옵션을 커스터마이징합니다.
옵션
값
설명
아이템 목록(Item List)
어쏘리티 키카드(Authority Keycard)
+를 클릭하여 배열 엘리먼트를 추가한 다음 드롭다운을 클릭하고 'keycard'를 검색합니다. 그런 다음 어쏘리티 키카드 아이템을 선택합니다.
콘텐츠 브라우저에서 커스텀 키카드 아이템을 찾은 후 레벨로 드래그합니다. 커스텀 키카드를 위해 구성된 잠긴 문과 테이블에서 가장 가까운 쪽에 커스텀 키카드를 놓습니다.
keycard_gameplay_device를 생성한 후에는 콘텐츠 브라우저에서 Verse 장치를 찾아 레벨로 드래그합니다.
플레이어 생성 장치 구성하기
마지막으로 플레이어 생성 장치를 배치해야 합니다. 이 예시에서는 플레이어 생성 장치가 하나만 필요합니다. 여러 플레이어가 참여하는 게임을 만드는 경우 다음 단계를 따라 더 많은 플레이어 생성 장치를 구성할 수 있습니다. 아니면 자신이 원하는 섬 경험에 따라 장치를 다르게 구성해도 됩니다.
플레이어가 테이블과 두 개의 문을 바로 볼 수 있는 곳에 플레이어 생성 장치를 배치합니다.
아래와 같이 장치 옵션을 커스터마이징합니다.
옵션
값
설명
게임 내 표시
False(선택 해제됨)
이 예시에서는 플레이어 생성 장치가 보이지 않습니다.
방과 장치를 구성했으니, 이제 커스텀 키카드를 만들 수 있습니다.
커스텀 아이템 엔티티 프리팹 만들기
콘텐츠 브라우저에서 우클릭하여 컨텍스트 메뉴를 연 후 엔티티 프리팹 정의(Entity Prefab Definition)를 선택합니다. 그러면 콘텐츠 브라우저에 새로운 씬 그래프 엔티티 프리팹이 추가됩니다.
프리팹의 이름을 Item_Keycard로 변경합니다.
새 프리팹의 인스턴스를 뷰포트로 드래그하여 월드에 놓습니다. 그러면 아웃라이너에서 이를 선택할 수 있게 됩니다.
Item_Keycard 프리팹이 선택된 상태로 디테일 패널에서 +컴포넌트(+Component)를 클릭한 다음 item_component를 선택합니다. 목록에서 스크롤하여 찾을 수도 있고, 검색창에 'item'을 입력하여 결과 범위를 좁히면 더 빠르게 찾을 수 있습니다.
+컴포넌트를 다시 클릭하고 item_details_component를 선택합니다. 이 컴포넌트가 아이템에 대한 텍스트 데이터를 저장합니다.
item_details 컴포넌트는 디테일 패널에서 세 개의 프로퍼티 필드, 이름(Name), 설명(Description), 짧은 설명(ShortDescription)을 갖고 있습니다. 해당 필드에 아이템의 이름, 설명 및 짧은 설명 라벨을 입력합니다.
+컴포넌트를 다시 클릭하고 item_icon_component를 선택합니다.
디테일 패널에서 item_icon_component를 펼칩니다. 이미지로 2D 이미지를 선택해야 하는데, 이 이미지가 게임의 UI(예: 플레이어 인벤토리)에 표시되어 아이템을 나타냅니다.
없음(None) 타일 옆의 드롭다운을 클릭하여 컨텍스트 메뉴를 열고 검색창에 이미지 이름의 일부를 입력합니다. 이 예시에서는 이름이 T_Icon_Keycard.png인 PNG 이미지를 사용합니다.
검색 결과에서 이미지를 선택합니다.
+컴포넌트를 다시 클릭하고 mesh_component를 선택합니다. 이 예시에서는 평면(Plane)을 선택합니다.
그러면 아이템에 평면 메시가 추가됩니다. 설정에 따라 처음에 이 평면이 매우 클 수 있습니다. 다음 단계를 따라 평면의 크기를 키카드 크기에 맞게 변경합니다.
뷰포트 상단의 툴바에서 스케일(Scale) 툴을 선택합니다. 또는 R을 눌러 스케일 툴로 변경할 수도 있습니다.
스케일 툴에서 더 오른쪽에 있는 스케일용 프리셋 비율(Preset Ratio for Scale) 설정의 드롭다운을 클릭합니다. 이 값을 0.0625로 설정합니다. 그러면 평면이 매우 작은 크기로 줄어들어 키카드 크기에 맞게 됩니다.
+컴포넌트를 다시 클릭하고 fort_item_pickup_component를 선택합니다. 이 컴포넌트를 추가하면 포트나이트 아이템의 다음과 같은 모든 기능이 추가됩니다.
아이템 줍기 애니메이션 및 아이템 드롭 애니메이션
인벤토리에 아이템을 추가하는 상호작용
플레이어가 아이템을 볼 때 표시되는 기본 아이템 위젯
아이템 주울 시 아이템의 메시 비활성화
아이템 드롭 시 아이템의 메시 활성화
이제 기본적인 커스텀 키카드 프리팹이 완성되었습니다. 이제 커스텀 Verse 컴포넌트를 생성해 이 아이템을 고유하게 만들어야, Verse 코드로 이 키카드가 특정한 잠긴 문을 열 수 있는지 확인할 수 있게 됩니다.
커스텀 Verse 컴포넌트 만들기
Verse 코드 파일이 많은 대형 프로젝트의 경우, 일반적으로 커스텀 컴포넌트를 위한 새 Verse 파일을 생성해야 할 수 있습니다. 이렇게 하려면 다음 단계를 따르세요.
이 튜토리얼의 예시는 규모가 작기 때문에, 커스텀 keycard_item_component가 커스텀 keycard_gameplay_device를 위한 Verse 파일에 정의되어 있습니다. 방법은 게임플레이를 위한 Verse 코드 작성하기 섹션을 참고하세요.
새 키카드 아이템이 선택된 상태로 디테일 패널에서 +컴포넌트를 클릭하고 새 Verse 컴포넌트(New Verse Component)를 선택합니다. Verse 컴포넌트 생성 창이 열립니다.
Verse 익스플로러로 새 Verse 파일을 추가하여 Verse 컴포넌트를 만들 수도 있습니다.
템플릿 선택(Choose a Template)에서 씬 그래프 컴포넌트(Scene Graph Component)를 선택합니다.
하단의 컴포넌트 이름(Component Name) 필드에 keycard_item_component를 입력합니다. 그런 다음 생성을 클릭합니다.
디테일 패널에서 +컴포넌트를 클릭한 후 검색창에 'keycard'를 입력합니다. 이제 새로 만든 Verse 컴포넌트가 목록에 표시되므로 이를 선택하여 커스텀 키카드 아이템에 추가합니다.
메뉴 바에서 Verse > Verse 익스플로러(Verse Explorer)를 클릭합니다. 새 Verse 컴포넌트를 찾아 우클릭한 후 Visual Studio Code에서 열기(Open in Visual Studio Code)를 선택합니다.
게임플레이를 위한 Verse 코드 작성하기
커스텀 아이템(키카드)을 만들고 있으며 플레이어의 인벤토리에 커스텀 키카드가 있을 때 장치를 트리거하려고 하므로, 이를 구현하기 위한 Verse 장치를 만들어야 합니다.
메뉴 바에서 Verse > Verse 익스플로러로 이동합니다. 아웃라이너 옆의 탭에 Verse 익스플로러가 열립니다.
Verse 익스플로러에서 프로젝트 이름을 우클릭하고 프로젝트에 새로운 Verse 파일 추가(Add new Verse file to project)를 선택하여 Verse 스크립트 생성(Create Verse Script) 창을 엽니다.
Verse 스크립트 창의 템플릿 선택에서 Verse 장치(Verse Device)를 클릭하여 선택합니다. 장치 이름(Device Name) 필드에 keycard_gameplay_device를 입력합니다. 그런 다음 생성을 클릭하여 Verse 파일을 생성합니다.
Verse 익스플로러에서 새 Verse 장치를 더블클릭하여 Visual Studio(VS) Code에서 파일을 엽니다. 다음 항목이 모두 코드의 상단 줄에 추가되어 있는지 확인합니다.
Verseusing { /Fortnite.com/Devices } using { /Fortnite.com/Itemization } using { /Verse.org/Simulation } using { /Verse.org/SceneGraph } using { /Verse.org/Random } using { /UnrealEngine.com/Itemization } using { /UnrealEngine.com/Temporary/Diagnostics }다음으로, 커스텀 아이템 컴포넌트를 정의하는 코드를 추가합니다.
Verse# KEYCARD ITEM COMPONENT keycard_item_component := class(item_component) :대상 에이전트의 루트 인벤토리를 찾는 데 도움이 되는 헬퍼 함수를 추가할 수도 있습니다.
Verse# Helper function that gets the first descendant inventory component from an agent. # This will be the root inventory. GetAgentInventory(Agent:agent)<decides><transacts>:inventory_component= TargetInventory := (for (I : Agent.FindDescendantComponents(inventory_component)) { I })[0]다음으로, 커스텀 Verse 장치를
creative_device의 서브클래스로 정의합니다. 그 아래에 볼륨 및 잠금 장치의 편집 가능 프로퍼티를 구성합니다. 그러면 에디터에서 볼륨 또는 잠금 장치의 특정 인스턴스를 선택할 수 있습니다(2개의 볼륨 장치와 2개의 잠금 장치가 있으므로 중요함).Verse# DEVICE //// GAMEPLAY keycard_gameplay_device := class(creative_device) : # Use a volume_device to be able to check when a player approaches @editable VolumeDevice:?volume_device = false # The lock device is attached to a wall/door prop. This can be activated to lock/unlock the door it is attached to. @editable LockDevice:?lock_device = false이제 쿼리를 사용하여 볼륨 장치가 있는지를 확인하고, 볼륨 장치의 에이전트 입장 시(On Agent Enters) 및 에이전트 나갈 시(On Agent Exits) 이벤트를 등록합니다.
Verse# Subscribe to the entry and exit events on the Volume to determine when a player/agent approaches. OnBegin<override>()<suspends>:void= if: TargetVolume := VolumeDevice? then: TargetVolume.AgentEntersEvent.Subscribe(OnAgentEntersEvent) TargetVolume.AgentExitsEvent.Subscribe(OnAgentExitsEvent)플레이어의 인벤토리를 확인하여 인벤토리에 커스텀 키카드가 있는지를 확인해야 하는데, 이는
keycard_item_component를 가진 항목을 모두 확인하는 방식으로 구현됩니다. 잠금 장치를 열기 위해 이 코드에는 또한keycard_item_component가 있어야 합니다.VerseOnAgentEntersEvent(Agent:agent):void= # Get the inventory from the player that is entering. if(TargetInventory := GetAgentInventory[Agent]): # Check the item in the inventory, if it has the keycard_item_component, proceed for(item : TargetInventory.FindItems(), KeycardComponent := item.GetComponent[keycard_item_component]) # If there is a valid lock_device, then this opens the door. if(TargetDoorLock := LockDevice?):마지막으로, 플레이어가 한 명 이상 있고 그중 한 명이 키카드를 가지고 있는 경우 이 코드는 잠금 장치가 열린 상태를 유지하도록 합니다. 하지만 키카드를 가진 플레이어가 볼륨에서 나가면 잠금 장치는 다시 닫힙니다.
VerseOnAgentExitsEvent(Agent:agent):void= # Start by assuming that no one has the required keycard_item_component. var AgentWithKeycardInVolume:logic = false if(TargetVolume := VolumeDevice?): # Get the Agents that are inside the volume_device as an array. for(TargetAgent:TargetVolume.GetAgentsInVolume()): # Use the same check to see if any of the agents in the volume_device have a keycard_item_component.
전체 Verse 코드 스니펫은 다음과 같습니다.
using { /Fortnite.com/Devices }
using { /Fortnite.com/Itemization }
using { /Verse.org/Simulation }
using { /Verse.org/SceneGraph }
using { /UnrealEngine.com/Itemization }
using { /UnrealEngine.com/Temporary/Diagnostics }
# KEYCARD ITEM COMPONENT
keycard_item_component := class(item_component) :