섬 내 거래의 다양한 요소에 대한 모범 사례와, 상점 테스트 및 디버깅 팁을 알아보겠습니다.
섬 내 거래 Verse 장치 사용하기
섬 내 거래 Verse 장치에는 섬 내 거래를 위한 템플릿이 있습니다. 여기에는 Verse API의 마켓플레이스 모듈 핵심 요소가 모두 구현되어 있습니다. 아이템, 오퍼, 번들 오퍼와 기본 상점 UI를 활용한 구매 처리가 포함되어 있습니다. 이 코드를 빠르게 상점을 구성하기 위한 가이드로 사용하세요.
장치에 액세스하는 방법은 다음과 같습니다.
Verse 익스플로러(Verse Explorer)로 이동합니다.
프로젝트 이름을 우클릭합니다.
프로젝트에 새로운 Verse 파일 추가(Add new Verse file to project)를 선택합니다.
섬 내 거래 장치(In-Island Transactions Device)를 선택합니다.
코드를 바로 사용하려면 Verse 코드로 이동해 다음 항목이 있는 파일을 편집합니다.
아이템 이름
설명
아이콘
권한과 오퍼 이름과 일치하도록 코드의 기본 이름을 교체합니다.
코딩 모범 사례
Verse 코드를 다듬어 코드의 확장성과 섬의 퍼포먼스를 향상할 수 있습니다.
워크플로 정리하기
프로그래밍에서 권장되는 일반적인 방식은 각 요소가 담당하는 작업을 서로 분리하는 것입니다. 파일과 함수는 특정 작업 수행에 집중하도록 하는 것이 좋습니다. 그래야 추후 프로젝트가 더 커질 때 이를 유지관리하기 더 쉬워집니다.
결과적으로 코드 파일 크기가 작아지고 더욱 깔끔히 정리되어 읽고 이해하기가 쉬워져, 디버깅도 간단해집니다.
거래에 이러한 원칙을 적용하는 방법은 다음과 같습니다.
별도 파일에 아이템 정의를 넣습니다.
별도 파일에 오퍼와 번들 오퍼를 넣습니다.
모든 정적 사전 정의 오퍼를 처리하는 장치를 만듭니다.
동적 오퍼만 처리하는 장치를 만듭니다.
구매만 처리하는 장치를 만듭니다.
모듈로 정리하기
모듈은 다수 파일에서 사용하도록 재배포 가능한 최소 단위 코드입니다. 모듈은 시간이 지나면서 변경될 수 있지만, 그래도 모듈이 이미 사용되고 있는 파일에서 종속성이 깨지지 않습니다. 길거나 반복적인 코드 단위(예: 권한 정의)를 다른 파일로 분리하고, using 조건문으로 임포트할 수 있습니다.
모듈 사용 시 큰 이점은 모듈의 멤버 변수를 한 위치에서 한 번만 정의해도 된다는 것입니다. 그러면 이후 모듈을 임포트하고 변수를 참조하는 방식으로 여러 Verse 코드 파일 간에 동일한 데이터를 공유할 수 있습니다. 모듈의 데이터와 관련해 오류가 있을 경우, 모듈의 콘텐츠를 사용한 모든 위치가 아닌 모듈만을 확인하면 되므로 실패 지점을 줄일 수 있습니다.
아래 스니펫은 모듈의 CornSeedPacket에 대한 권한 정보 정의 방법을 보여줍니다.
EntitlementInfo<public> := module:
CornSeedPacket<public> := module:
Name<public><localizes> : message = "Corn seed pack"
Description<public><localizes> : message = "A pack of corn seeds. Opening a pack yields 10 corn seeds for planting."
ShortDescription<public><localizes> : message = "Contains 10 corn seeds for planting."EntitlementInfo 및 CornSeedPacket 모두 모듈로 정의되어 모든 권한 정보를 임포트하고 Name 변수와 같은 CornSeedPacket 멤버 변수에 직접 액세스할 수 있습니다.
이 스니펫은 EntitlementInfo 모듈을 임포트하여 corn_seed_pack 권한을 정의하는 방법을 시연합니다.
CornSeedPacket 모듈에서 변수를 바로 참조할 수 있으므로, Name과 같은 변수 스트링을 다시 입력할 필요가 없습니다. 따라서 오타와 같이 눈에 띌 수 있는 버그의 위험이 줄어듭니다.
Entitlements<public> := module:
using { EntitlementInfo }
# Using custom entitlement class to distinguish your entitlements.
my_island_entitlement<public> := class<abstract><castable>(entitlement){}
corn_seed_pack<public> := class<concrete>(my_island_entitlement):
var Name<override> : message = CornSeedPacket.Name
var Description<override> : message = CornSeedPacket.Description
var ShortDescription<override> : message = CornSeedPacket.ShortDescription
using 조건문에는 임포트하려는 모듈에 대한 파일 경로가 필요하지만, 이 경우에는 모듈이 같은 폴더에 있다고 가정하므로 파일 경로가 필요하지 않습니다.
섬 퍼포먼스 향상하기
<suspends> 이펙트로 아이템 구매 및 지급 메서드를 정의하고 spawn을 통해 호출함으로써 경험의 반응성을 향상할 수 있습니다.
이렇게 하면 다른 게임 로직의 요소가 계속 실행되는 동안에 TryBuyOffer가 비동기식으로 완료되며, 거래가 완료될 때까지 게임이 중지되지 않도록 할 수도 있습니다.
TryBuyOffer(Player:player, Offer:offer)<suspends>:void=
Result := BuyOffer(Player, Offer)
OnButtonInteraction(Agent:agent):void=
if (Player := player[Agent]):
spawn{TryBuyOffer(Player, OfferType)}
아이콘 모범 사례
게임 텍스처를 게임 내에서 제대로 렌더링하려면 특정 요구 사항을 충족해야 합니다. UEFN에서 임포트된 이미지로 텍스처를 만드는 경우, 소스 이미지 파일의 높이와 너비에 2의 거듭제곱을 사용해야 합니다. 그래야 여러 플랫폼에서 섬의 호환성과 안정성을 높일 수 있습니다.
2의 거듭제곱은 저메모리 플랫폼에서 낮은 텍스처 해상도로 텍스처를 스트리밍하는 경우에도 사용됩니다.
텍스처 스트리밍은 다음과 같은 경우 도움이 됩니다.
텍스처의 해상도 변경
게임 로드 속도 결정
게임의 비주얼 퀄리티 향상
GPU 메모리 절약
2의 거듭제곱 규칙 및 텍스처 크기 변경에 대한 자세한 정보는 텍스처 크기 조절을 참고하세요.
UEFN에 커스텀 에셋 임포트에 대한 정보는 에셋 임포트하기를 참고하세요. Verse에서 텍스처와 같은 에셋을 노출하는 방법에 대한 자세한 정보는 에셋 노출하기를 참고하세요.
권한 테스트 및 디버깅
라이브 편집 및 비공개 플레이테스트 세션 모두 디버깅 세션에 해당합니다. 디버그 세션은 거래, 권한, 오퍼 비헤이비어에 다음과 같은 영향이 있습니다.
거래 시 계정에서 V-Bucks가 차감되지 않습니다.
지급되고 구매한 권한은 디버그 세션 종료 시 제거됩니다.
디버그 세션 중에는 디버그 명령(Debug Command) 메뉴에 액세스할 수 있습니다.
섬의 비공개 및 플레이테스트 버전에서 오퍼를 이용할 수 있어야 하며, 테스트 단계에서 모든 팀 구성원이 이에 액세스할 수 있어야 합니다. 오퍼의 아이템은 라이브 상태로 간주되지 않으며, 섬이 퍼블리싱되고 공개 상태일 때 오퍼가 라이브 상태가 됩니다.
디버그 명령 메뉴에 액세스하기
디버그 명령 메뉴는 Esc 키(PC) 또는 시작/옵션 버튼(컨트롤러)를 누르고 메뉴에서 디버그 명령 옵션을 선택해 액세스할 수 있습니다.
상점 디버그 명령
상점 디버그 명령에서 해당 상점을 위한 디버그 명령을 찾을 수 있습니다. 여기에서 다음 명령에 액세스할 수 있습니다.
명령 이름 | 설명 |
스토어 열기 | 이용 가능한 모든 권한 오퍼가 있는 동적 상점 UI를 표시하여 플레이어가 개별 구매할 수 있게 합니다. 이를 통해 테스트하려는 권한을 직접 선택할 수 있습니다. |
모든 권한 지급 | 플레이어 인벤토리에 이용 가능한 권한을 최대 개수만큼 채웁니다. 게임 내 행동을 테스트하여 플레이어가 그래서는 안 되는 지역에서 아이템을 이용할 수 있는지 확인할 수도 있습니다. |
권한 하나 지급 | 플레이어에게 모든 권한을 하나씩 지급합니다. 이를 통해 플레이어 인벤토리에 공간을 남기면서도 대량의 권한을 지급하지만, 최대 수량에 도달하지 않고서도 비내구성 권한의 구매를 계속 테스트할 수 있습니다. 권한 지급 시 게임 내 동작을 테스트하여 플레이어가 액세스할 수 없어야 하는 영역에서 아이템에 액세스할 수 있는지 확인할 수도 있습니다. |
권한 강제 제거 | 플레이어 인벤토리에서 모든 권한을 제거합니다. 이를 통해 플레이어 인벤토리를 초기화하여 오퍼 구매를 계속 테스트할 수 있습니다. 이 명령은 플레이어 인벤토리에서 권한이 제거되는 이 명령은 인벤토리를 빠르게 초기화하므로, 테스트를 빠르게 반복하려는 경우에도 유용합니다. |
보유한 권한 출력 | 보유한 모든 권한을 출력 로그에 출력합니다. |
구매 항상 실패(Purchases Always Fail) | 기본값은 끄기(OFF)입니다. '끄기'로 설정하면 구매가 의도한 대로 작동합니다. 켜기(ON)로 설정하면 구매 성공을 나타내는 조건에 관계없이 구매가 항상 실패합니다. 구매 항상 실패는 구매 시도가 실패했음을 나타내는 |