Unreal Engine의 일반적인 Level과 Landscape는 평면 공간을 중심으로 제작됩니다. 때문에 우주에서 행성을 바라보다가 그대로 지표면까지 이동하는 게임을 만들려면 원거리 행성 표현, 실제 Ground Level, 좌표 변환과 전환 과정을 별도로 구현해야 합니다.
PlanetX는 기존 Ground Level을 그대로 활용하면서, 해당 영역을 행성 표면의 Section으로 연결합니다. Orbit에서는 가볍게 제작된 Proxy와 행성 표면을 보여주고, 플레이어가 지표면으로 접근하면 실제 Ground 콘텐츠로 자연스럽게 이어지도록 구성할 수 있습니다.
PlanetX의 행성 제작, Proxy Bake, Planet Asset Editor의 Preview 탭 등의 제작 도구는 Unreal Editor에서 사용합니다.
완성된 게임에서는 필요한 Planet Asset과 Bake된 행성 및 Proxy 데이터를 Runtime에서 사용합니다.
PlanetX는 Unreal Engine Editor 위에서 동작하므로 CPU와 GPU는 기본적으로 Unreal Engine 5.8의 권장 시스템 사양 이상을 권장합니다.
다만 Proxy Bake와 Planet Asset Editor의 Preview 탭에서는 큰 Level의 Geometry와 중간 생성 데이터를 메모리에 유지하는 작업이 발생할 수 있으므로, 일반적인 Unreal Engine 프로젝트보다 충분한 시스템 메모리를 확보하는 것을 권장합니다.
항목
최소 사양
권장 사양
CPU
Unreal Engine 5.8 권장 사양 기준
Unreal Engine 5.8 권장 사양 이상
GPU
Unreal Engine 5.8 권장 사양 기준
Unreal Engine 5.8 권장 사양 이상
시스템 메모리
32 GB RAM
64 GB RAM 이상
실제 필요한 메모리는 Source Level의 크기와 복잡도, Proxy Bake 대상 수, Landscape 해상도와 Visual 설정에 따라 달라질 수 있습니다.
대규모 Level의 Proxy Bake에서는 지나치게 큰 단일 결과물이 생성되지 않도록 출력 크기를 제한합니다.
개별 Proxy Bake 처리 조각의 중간 데이터는 일반적으로 128 MiB 이하를 목표로 합니다.
생성되는 개별 Package가 512 MiB를 초과하면 경고가 표시됩니다.
개별 Package가 1 GiB를 초과하면 해당 결과를 게시할 수 없습니다.
복잡한 대규모 Level에서는 Proxy의 Detail과 Bake 대상 범위를 적절하게 조정하는 것을 권장합니다.
설치와 첫 작업
여기서 시작 — Same World 빠른 시작
이 문서는 공식 첫 사용 및 제품 검토 경로입니다. Unreal Engine의 기본 Open World Level 템플릿으로 시작해 Level을 GroundLevel로 저장하고, 이를 PlanetX의 Same World Section으로 연결한 뒤 실제 Ground 콘텐츠와의 런타임 전환을 확인합니다.
미리 준비한 Ground Level은 필요하지 않습니다. 2단계에서 Unreal Engine의 기본 Open World 템플릿으로 새 Level을 만들고 GroundLevel로 저장합니다. 이 템플릿의 Landscape를 재현 가능한 Source로 사용하며, 런타임 전환 테스트에 필요한 Player Actor는 11단계에서 준비합니다.
동일한 결과를 재현하려면 다음 값을 그대로 사용하세요.
설정
값
Ground Level
Open World 템플릿으로 만든 GroundLevel
Planet ID
FirstPlanet
Planet Radius
100 km
Planet Asset
PA_FirstPlanet
2단계에서 GroundLevel을 만들고 저장하기 전에는 Proxy Bake를 열지 마세요. Proxy Bake에는 Untitled 또는 /Temp Level이 아닌 저장된 Level을 사용해야 합니다.
또한 PIE 또는 Simulate가 실행 중이라면 먼저 종료하세요. Proxy Bake는 Editor의 Ground Source를 기준으로 작업하므로 PIE 중에는 실행하지 않습니다.
Content Browser > Add > Miscellaneous > Planet Asset을 선택합니다. 이 문서에서는 Planet ID FirstPlanet, Planet Radius 100 km, 기본 Coordinate Convention을 사용하고 Asset을 PA_FirstPlanet으로 저장합니다. 각 설정의 개념 설명이 필요한 경우에만 첫 Planet Asset 만들기를 참고하세요.
Section은 아직 직접 만들 필요가 없습니다.
처음 Proxy Bake를 실행하면 현재 Ground Level을 기준으로 필요한 Section과 Level Pair가 자동으로 생성됩니다.
File > New Level을 선택하고 Unreal Engine의 기본 Open World 템플릿을 연 뒤 즉시 GroundLevel로 저장합니다.
Open World 템플릿에는 World Partition Landscape가 포함되어 있으며, 이 빠른 시작에서는 동일한 결과를 재현하기 위한 Ground Source로 사용합니다. 이 흐름을 성공한 뒤에는 프로젝트의 실제 Gameplay Level에서도 같은 과정을 반복할 수 있습니다.
Proxy Bake를 열기 전에 Level 탭이 Untitled가 아니라 GroundLevel인지 확인하고 한 번 더 저장하세요.
첫 Bake에서는 Unreal Editor의 Tools 메뉴에서 PlanetX 영역을 찾고 Proxy Bake Editor를 선택합니다. 이 경로가 공식 첫 사용 경로입니다.
Planet Asset Editor > Sections에서 Proxy Bake를 여는 방식은 기존 Section 작업 경로이며 Section이 이미 생성된 뒤에만 사용합니다.
Proxy Bake Editor가 열리면 먼저 상단의 Basic 모드를 사용하면 됩니다. 빠른 시작에서는 Advanced 설정을 변경할 필요가 없습니다.
PlanetX는 각 Planet에 하나의 Environment Manager를 사용합니다.
Environment Manager를 추가하고 연결하기 전에는 PlanetX가 이 Level에 대기, 구름과 우주 배경 환경을 아직 적용하지 않았기 때문에 행성이 어둡게 보일 수 있습니다. 이 상태를 Material 오류로 판단하지 말고 Environment Manager 설정을 먼저 완료하세요.
PlanetX Mode에서 Environment Palette를 엽니다.
단축키는 Alt+5입니다.
Environment Manager가 아직 없다면 다음 메시지가 표시됩니다.
text
Environment Manager is not assigned to this Planet.
Add Manager를 클릭합니다.
text
Add Manager
PlanetX가 현재 활성 Planet에 연결된 PlanetXEnvironmentManager를 Level에 생성합니다.
처음에는 별도의 Level Override를 설정하지 않아도 됩니다. Planet Asset에서 작성한 Environment 설정이 기본값으로 사용됩니다.
Manager를 추가한 직후 GroundLevel을 저장합니다. 대기나 구름이 이상하게 보인다면 먼저 Level을 저장한 뒤 Planet View를 다시 확인하세요. 저장하면 Environment가 다시 평가되기 전에 Manager와 Level Binding이 유지됩니다.
Manager가 생성되었다면 Validate를 눌러 현재 Planet과 올바르게 연결되었는지 확인합니다.
여기서는 현재 PlayerController가 View Target으로 사용하는 Actor를 수정해야 합니다. 이 튜토리얼에서는 Ground Level에 배치하고 Auto Possess Player 0으로 설정한 Pawn 또는 Character Instance를 사용합니다.
GroundLevel에 해당 Actor가 없다면 지금 Pawn 또는 Character를 배치하고 Auto Possess Player를 Player 0으로 설정한 뒤, 활성 Camera Component가 PlayerController의 View Target을 제공하는지 확인합니다.
Component를 추가한 뒤 Blueprint를 Compile하고 Ground Level로 돌아갑니다. Level에 배치한 Player Actor Instance를 선택하고 해당 Instance의 Component Details에서 PlanetX Reference를 다음과 같이 설정합니다.
Reference Planet Actor에는 이 Level에 배치한 PlanetX Planet Instance를 지정합니다.
그 다음 Reference Section Id에서 앞의 Proxy Bake가 생성한 Same World Section을 선택합니다.
처음 테스트에서는 Section을 자동 검색하게 두기보다 명시적으로 지정하는 것을 권장합니다.
PIE가 시작되면 실제로 Possess된 Pawn이 여기서 설정한 Actor와 같은지 확인하세요. World Outliner에 별도의 DefaultPawn0가 생성되고 그 Pawn이 Possess된다면, 배치된 BP_Player가 조작된다고 가정하지 말고 실제 Pawn을 설정하거나 GameMode의 Default Pawn Class를 변경해야 합니다.
최종적으로 다음 관계가 되어야 합니다.
text
Player Actor
└─ PlanetX Coordinate Component
├─ Reference Planet Actor → 배치한 PlanetX Planet
└─ Reference Section Id → Bake로 생성된 Same World Section
Reference Planet Actor가 설정되어 있다면 Planet ID는 해당 Actor의 Planet Asset에서 자동으로 결정됩니다.
Runtime Palette에서는 현재 Planet 등록 상태와 Transition 상태를 확인할 수 있습니다.
플레이어를 Ground 방향으로 이동시키면서 Transition 상태를 확인하세요.
정상적인 경우 상태가 다음과 같이 변합니다.
text
Orbit
→ Transition
→ Ground
Ground 상태에 도달하면 PlanetX가 Same World Section의 실제 Ground 위치로 플레이어 상태를 연결합니다.
다시 Ground에서 멀어지면 다음 순서로 복귀합니다.
text
Ground
→ Transition
→ Orbit
전환 과정에서 다음 항목을 확인하세요.
Section Proxy와 실제 Ground가 크게 어긋나지 않는지
플레이어 위치가 갑자기 엉뚱한 장소로 이동하지 않는지
카메라 방향이 정상적으로 유지되는지
Ground 진입 후 기존 Gameplay가 정상적으로 동작하는지
Orbit으로 돌아갈 때 이동 흐름이 자연스럽게 이어지는지
아래 예시는 완성된 행성 비주얼이 표시된 상태로 GroundLevel이 실제 PIE에서 실행 중인 화면입니다. 이 이미지는 PIE 렌더링 결과를 확인하는 용도이며, 실제 Orbit, Transition, Ground 상태 순서는 앞에서 설명한 Runtime Palette에서 별도로 확인하세요.
예시 화면의 노란색 Placement 안내는 배치 편집 대상으로 선택된 Actor가 없다는 뜻이며 Validation Error가 아닙니다.
또한 Planet Component의 Gravity Settings는 Planet Asset이 아니라 각 Planet Actor가 소유하므로 Ground World에서 PlanetX 중력을 사용할 경우 Ground 쪽 Planet Actor의 중력 설정도 별도로 구성해야 합니다.
이 추가 구성은 기본적인 Level Handoff pose 복원을 위한 필수 조건은 아닙니다.
같은 Planet Asset이 Orbit World와 Ground World에 사용될 수 있습니다. 동일 Planet ID의 Planet Actor가 한 World에 여러 개면 자동 선택은 모호해질 수 있으므로 API의 AdvancedDisplay에 있는 Planet Binding ID를 전달하세요.
FPlanetXSectionPlacement은 표면상의 위치, tangent 방향, 크기와 배치 Transform을 결정합니다. Canonical north-pole anchor로 선택된 Same World Section은 자동 배치가 제한될 수 있습니다. 편집기는 Visual, coordinate-containment, transition rectangle을 하나의 bounds contract로 검증합니다.
Section ID를 명시하면 저장, Capture, Sequencer가 같은 Frame을 재현합니다. ID가 None일 때 자동 Section resolve는 현재 Planet Local 위치와 Asset 배열 순서를 사용하므로 영속 데이터에는 권장하지 않습니다.
Section별 Ground proxy visibility는 Orbit, Ground, transition 시 원본 Actor와 프록시 중 무엇이 보일지 결정합니다. PlanetX Mode의 Planet/Compare/Level view는 runtime 계약을 변경하지 않고 편집 중 표현만 비교합니다.
위치는 점 변환이고 이동 입력은 벡터 변환입니다. ConvertCoordinateVectorToWorld에서 Surface Frame을 사용하면 X/Y/Z를 East/North/Up으로 해석할 수 있습니다. 지표 이동은 bProjectToSurfaceTangent를 켜 Up 성분을 제거할 수 있습니다.
Transform과 Query 함수는 bool만 보지 말고 FPlanetXTransformResolveResult 또는 상세 Status를 확인하세요. 잘못된 버전, 미등록 Planet, 모호한 Binding, 지원하지 않는 Planet scale, 유효하지 않은 Section이 구분됩니다.
데이터 모델과 핵심 개념
표현 영역과 런타임 로드
PlanetX는 Actor가 어느 표현에 속하는지와 World Partition에서 어떻게 로드되는지를 별도 정책으로 취급합니다.
ShouldForceOwnerAlwaysLoaded로 현재 정책의 결과를 확인하고 ApplySpatialLoadingPolicyToOwner로 Owner에 적용합니다. 적용 함수는 Editor에서도 호출할 수 있습니다. 적용 후 Actor, World Partition과 Data Layer 설정을 프로젝트 기준으로 다시 확인하세요.
보이지 않는 것과 로드되지 않은 것은 다릅니다. Planet proxy visibility, Section proxy residency, Runtime Preview residency는 별도 상태입니다. Runtime Monitor에서 등록 여부, realized component 수, renderable 상태를 함께 확인해야 합니다.
데이터 모델과 핵심 개념
전환 모델
PlanetX 전환은 표시 Alpha만 바꾸는 효과가 아니라 Section, runtime context, Actor pose와 travel state를 연결하는 수명 주기입니다.
같은 World 안에서 Orbit Actor가 Ground pose로 이동합니다. 자동 진입은 Coordinate Component의 Spatial Entry policy가 켜진 참가 Actor에만 적용됩니다. 반환 정책은 captured pose 또는 현재 Section-relative pose 중 선택할 수 있습니다.
서로 다른 World 사이에서는 BeginLevelHandoff 또는 PrepareTravel이 Ticket을 만들고, 게임 코드가 OpenLevel과 Pawn 정책을 소유합니다. 도착 World에서 ResumePendingTravel 또는 정확한 Ticket을 사용하는 CompleteLevelHandoff가 pose를 적용합니다.
Ticket generation이 오래됐거나 현재 World에 matching pending travel이 여러 개면 적용하지 않습니다. Journey ID는 왕복 상태를 이어주며 완료된 Journey도 진단을 위해 조회할 수 있습니다.
기본 레이아웃에서는 중앙의 Preview와 오른쪽의 Configuration이 열립니다. Overview, Sections, Diagnostics는 명령을 실행하기 전까지 닫혀 있을 수 있습니다. 탭이 보이지 않으면 Window > Planet Asset에서 다시 여세요.
Configuration에서는 EnvironmentSettings가 숨겨집니다. 환경 프로필의 단일 제작 표면은 Preview > Advanced > Environment입니다.
새 Planet Asset에서는 상태 요약이 필요할 때 Overview를 열고, 저장된 Ground Level에서 Proxy Bake를 엽니다. Section을 먼저 만들거나 선택하지 마세요. 첫 번째 성공한 Proxy Bake가 Section과 Level Pair를 생성합니다. Bake가 끝난 뒤 Sections에서 Linked 상태를 확인하고 Preview에서 비주얼을 조정한 다음 Diagnostics에서 Full Validate를 통과시킵니다.
기존 Planet Asset에서는 Sections에서 작업할 Section을 선택한 뒤 해당 Section의 Proxy Bake 진입점을 사용합니다. Section 선택으로 시작하는 흐름은 기존 Section 작업뿐입니다.
에디터 워크플로
PlanetX Mode
PlanetX Mode는 현재 World의 Planet Actor, Section, 참가 Actor, 환경과 전환을 한 화면에서 연결해 보는 Level Editor mode입니다.
Scene Tree는 Planet, Section, Endpoint, Environment, 참가 Actor 연결을 표시합니다. 같은 Planet에 중복 Endpoint나 Environment Manager가 있거나 Section placement/topology가 잘못되면 경고가 표시됩니다.
Placement 도구로 Actor를 이동할 때 Coordinate Component의 Reference Planet/Section과 representation domain을 먼저 확인하세요. 저장 가능한 위치는 명시 Section ID를 권장합니다.
External Bake 확인 창에서 Open Bake Monitor in browser를 활성화하면 Stage, 진행률, ETA, 리소스 사용량, 경고와 제한된 로그 tail을 로컬 브라우저에서 볼 수 있습니다. Monitor는 관찰 도구이므로 서비스 또는 브라우저를 열지 못하더라도 External Bake는 계속되며 결과도 달라지지 않습니다.
Loopback Monitor 서비스는 PlanetXEditor 모듈에 포함되어 활성 Editor 또는 Direct Worker 프로세스 내부에서 실행됩니다. PlanetX는 별도의 Monitor 실행 파일을 설치하거나 실행하지 않습니다. 서비스는 로컬 연결만 허용하며 세션별 token으로 브라우저 페이지를 인증합니다. 전체 Monitor URL을 공유하거나 게시하지 마세요.
External Bake가 진행되는 동안에는 Direct Worker가 Monitor를 호스팅합니다. Worker가 종료되면 해당 서비스도 종료되므로 기존 탭의 연결이 끊길 수 있습니다. Unreal Editor가 다시 실행된 뒤 Open External Bake Monitor를 사용하면 최신 durable result를 다시 호스팅할 수 있습니다. 새 서비스는 Job artifact에서 상태를 복원하며 이전 브라우저 탭을 자동으로 이전하지는 않습니다.
브라우저 탭을 닫아도 Bake는 취소되지 않습니다. 안전한 checkpoint에서 취소를 요청하려면 Monitor의 Cancel Bake 또는 Editor의 취소 기능을 사용하세요. 취소를 요청해도 부분 결과는 게시되지 않습니다.
Editor는 Auto, ProxyGeometry, LandscapeProxy, InstanceBatch, Discard, ManualReview, Unsupported 역할을 표시합니다. Source group은 Actor, Folder, Data Layer, Level/Level Instance 단위로 볼 수 있습니다.
C++ 태그 API는 BakeSource, NoBake, Preview, Generated를 제공합니다. 명시적 제외는 omission을 숨기는 수단이 아니라 의도된 소스 정책으로 사용하세요.
PlanetX Mode의 Validate palette는 현재 World와 연결 Asset을 함께 검사합니다. Fix All Safe는 결과가 결정적이고 추가 선택이 필요 없는 Warning만 수정합니다. 파괴적 작업이나 사용자 결정을 요구하는 finding은 자동으로 바꾸지 않습니다.
Full Validate 결과는 LogPlanetXValidation에 안정적인 Surface/Operation/Subject 형태로 기록됩니다. Visual Edit 문제는 PlanetX.VisualEdit.Dump, proxy 표현은 PlanetX.ProxyStats.Dump로 추가 상태를 확인하세요.
런타임 통합
런타임 통합
런타임 통합의 공개 facade는 Game Instance Subsystem인 UPlanetXSubsystem입니다. World별 registry와 서비스는 내부 구현이며 gameplay 코드는 facade와 공개 Component를 사용합니다.
Planet Actor가 먼저 등록되고 참가 Actor가 runtime context를 resolve할 수 있어야 합니다. Streaming으로 순서가 늦어질 수 있으면 RefreshRuntimeRegistration, RefreshRuntimeContext 또는 Travel Receiver의 retry 정책을 사용합니다.
FPlanetXSurfaceQueryInput에는 ray origin/direction과 선택 조건이 들어갑니다. QuerySurfaceAtWorldRayDetailed은 Hit/Miss 외에 InvalidInput과 RuntimeUnavailable을 구분하므로 gameplay 분기에 권장됩니다.
Geo 또는 FPlanetXTransform에서도 표면을 조회할 수 있습니다. 결과 FPlanetXSurfaceQueryResult에는 Planet, Section, hit 위치, normal과 좌표 정보가 포함됩니다.
Movement Component의 UpdatedComponent가 유효해야 합니다. Reference Coordinate Component와 Planet gravity 설정을 확인하고 ValidateMovementConfiguration으로 오류 메시지를 받습니다.
FPlanetXNativeMovementSettings은 가속, 감속, 속도와 ballistic 동작을 정의합니다. FPlanetXGravitySettings은 행성 중심 방향의 가속을 정의하고 Planet Component의 GetGravityAccelerationAtWorldLocation으로 조회할 수 있습니다.
World나 Movement Component를 교체할 때 velocity를 직접 복사하지 말고 Movement Handoff API를 사용하세요. frame continuity policy가 linear/angular velocity를 새 표면 frame에 맞춰 해석합니다.
런타임 통합
Same World 이동
Same World 이동은 Orbit과 Ground가 같은 World package에 있을 때 Actor를 Section의 Ground pose로 옮기고 다시 Orbit pose로 반환합니다.
Coordinate Component에서 automatic same-world entry/return을 켤 수 있습니다. Runtime은 viewpoint/participant가 transition 경계를 넘는지 평가하고 안전한 시점에 pose를 적용합니다.
Return Pose Policy는 캡처한 Orbit pose 또는 현재 Ground Section-relative pose에서 복원하는 방식을 선택합니다. 현재 pose 기반 반환은 Ground에서 움직인 결과를 Orbit Section frame에 이어야 할 때 사용합니다.
Surface Query가 다른 Section/Planet이거나 Actor의 context가 모호하면 실패합니다. 자동 반환은 Orbit 표현이 준비될 때까지 기다릴 수 있습니다. GetTransitionJourney와 managed actor state로 상태를 확인하세요.
런타임 통합
Level Handoff
Level Handoff는 서로 다른 World package 사이에서 PlanetX pose와 Journey 상태를 전달합니다. 게임 코드는 레벨 로딩과 Pawn 생성 정책을 계속 소유합니다.
고급 API는 BeginLevelHandoff → CompleteLevelHandoff → BeginReturnLevelHandoff(JourneyId) → CompleteLevelHandoff 흐름을 제공합니다. PrepareTravel은 명시 route를 사용해 Ground에서 Orbit으로 직접 돌아갈 수도 있습니다.
APlanetXRuntimePreviewActor의 residency state는 Idle, LoadingRoot, LoadingPayloads, LoadingResources, Realizing, WaitingForRender, Resident, Failed 순으로 진행될 수 있습니다.
Game Instance facade는 다음을 제공합니다.
LoadRuntimePreview
SetRuntimePreviewVisible
UnloadRuntimePreview
GetRuntimePreviewStatus
직접 Actor를 사용할 때는 AssignPreviewBakeData, LoadPreviewFromBakeData, SetPreviewVisible, UnloadPreview와 renderable/component count query를 사용합니다.
Runtime Preview는 Proxy Static Mesh, baked ISM/HISM/Foliage instance batch를 하나의 root 아래에 만듭니다. gameplay Actor 복제, collision, navigation, tick 기반 동작은 의도적으로 포함하지 않습니다.
Loaded와 Renderable은 다릅니다. Resident라도 필요한 render resource가 아직 준비되지 않으면 presentation 전환을 기다려야 합니다.
Stat PlanetXMemory, Stat PlanetXResources, Stat PlanetXProxy, Stat PlanetXRuntime으로 memory, resource count, render, runtime service 비용을 확인합니다. PlanetX.MemoryBudgetMB와 자동 material MID budget warning도 함께 검토하세요.
런타임 통합
Environment Runtime
APlanetXEnvironmentManager는 Planet Asset의 환경 프로필과 현재 World의 Atmosphere, Cloud, Sun, Post Process, Space Background binding을 연결합니다.
PlanetX Managed 모드는 필요한 Component를 PlanetX profile에 맞춰 제어합니다. Use Existing Level 모드는 기존 SkyAtmosphere나 Volumetric Cloud를 유지하므로 Planet Asset profile과 수동으로 일치시켜야 합니다.
Managed Planet Actor가 있으면 Radius와 environment authoring 설정을 resolve합니다. Existing Sun Light가 없으면 저장된 Sun direction을 사용하지만 validation warning이 남을 수 있습니다.
Preview는 제작 환경이며 Runtime World 자체가 아닙니다. Runtime Preview는 Proxy Bake가 게시한 payload를 읽는 별도 경로입니다. Preview에서 좋아 보이더라도 Diagnostics의 stale 상태와 Runtime Preview readiness를 확인해야 합니다.
Surface Completion 설정은 생성 topology, cutout, terrain noise와 surface material을 제어합니다. 생성기는 동일 입력에 대해 결정적인 결과를 만들고 polygon, boundary, mesh attribute를 검증합니다.
Terrain Region은 행성 표면의 특정 구역에 noise parameter를 적용합니다. 큰 noise나 잘못된 cutout이 proxy 아래로 침범하지 않는지 Preview에서 확인하세요.
Padding Material Build는 source material layout을 수집하고 필요한 texture/material asset을 생성합니다. Source Material asset path가 같더라도 내용이 바뀌면 Editor validation이 stale 상태를 찾습니다. Package 전에 다시 build하세요.
UPlanetXSurfacePreset은 Completion과 행성 표면의 재사용 가능한 스타일을 담는 Primary Data Asset입니다. Preset을 Planet Asset의 Active Surface Preset으로 지정하면 authoring 설정이 해당 선택을 참조합니다.
Preset은 material, terrain/noise 성격과 시각 파라미터를 공유하는 데 사용하고 Planet ID나 Section geometry 같은 구조 계약을 대신하지 않습니다.
UPlanetXPlanetProxyComponent의 Planet Material Override는 행성 sphere 표현을 교체합니다. Section proxy material은 BakeData의 canonical slot과 remap을 따라야 합니다. 임의로 slot 순서를 바꾸면 boundary와 padding material provenance가 어긋날 수 있습니다.
Runtime binder는 generated visual의 binding descriptor와 Source Material identity를 확인한 뒤 MID를 준비합니다. geometry revision, slot, texture set이 일치하지 않으면 error material 또는 경고가 사용될 수 있습니다.
Atmosphere 높이는 Planet Radius 비율로 자동 계산하거나 수동 km 값으로 지정할 수 있습니다. Rayleigh, Mie, absorption, aerial perspective와 ground albedo를 조정합니다.
Clouds는 layer bottom/height, lighting, atmosphere interaction, shadow parameter를 가집니다. 기존 Level cloud를 사용할 때 PlanetX cloud와 설정이 다르면 Orbit/Ground 전환에서 불일치가 생길 수 있습니다.
Public 헤더에 존재한다는 이유만으로 모든 데이터 구조체가 일반 사용자 설정이 되는 것은 아닙니다. 이 문서는 Editor에서 조정 가능한 값, Project Config 값, 공개 작업 옵션을 설정 범위로 다루고, 파이프라인이 생성하는 payload와 capture는 별도로 표시합니다.
Disabled, Bake 정점에서 계산하는 Automatic, 직접 Offset을 쓰는 Manual 중 선택합니다.
SurfaceClearanceCm
1.0, 0 이상
Automatic이 최저 Bake 정점을 표면으로 올린 뒤 추가하는 바깥쪽 여유입니다.
ManualOffsetCm
0, 0 이상
Manual에서 적용하는 바깥쪽 Offset입니다.
LevelPairId
None
Section이 참조하는 Level Pair ID입니다.
bEnabled
true
꺼진 Section은 Runtime 표현과 이동 대상에서 제외됩니다.
Same World Section은 North Pole Anchor 계약 때문에 위도, 경도, Yaw, Scale이 잠깁니다. Altitude만 Ground 접촉 높이 보정에 사용할 수 있습니다. Bounds, RegionSet, SourceRef, ProxyBakeData와 각 사각형/Hash는 Scan/Bake가 생성하는 데이터이므로 수동 편집하지 마세요.
현재 Outliner/Viewport에서 선택한 Actor만 검색합니다. 의도적인 부분 Bake에 적합합니다.
Current Level
선택됨
현재 Persistent Level 소유 Actor만 검색하고 Streaming Level은 제외합니다.
Loaded Levels
현재 Level, 로드된 Streaming Level과 Level Instance를 함께 검색합니다.
Reviewed Set
현재 Plan에서 명시적으로 검토한 stable source membership을 재사용합니다. 먼저 다른 Scope로 Scan을 완료해야 합니다.
Source Representation: Prefer HLOD
선택됨
유효성이 확인된 World Partition HLOD를 우선 사용하고 계약상 필요하면 원본 Actor로 fallback합니다.
Source Representation: Original Actors
원본 Actor/Component만 사용합니다. HLOD 결과 비교나 fidelity 진단에 유용합니다.
Include all tags
비어 있음
쉼표로 구분한 모든 Actor Tag를 가진 Source만 포함합니다. 비어 있으면 포함 필터를 적용하지 않습니다.
Exclude any tag
비어 있음
나열한 Tag 중 하나라도 가진 Source를 제외합니다.
Selected Actors, Reviewed Set 또는 Tag Filter처럼 정확한 membership이 필요한 계약에서는 Prefer HLOD를 요청해도 effective 정책이 Original Actors로 바뀔 수 있습니다. UI의 Source Representation summary에서 requested/effective 결과를 확인하세요.
현재 파이프라인이 안전한 결과를 만들 수 없습니다. 활성 상태로 남으면 Bake가 차단됩니다.
Group Scope
Actor, Folder, Data Layer, Level/Level Instance 단위로 선택 변경을 적용합니다.
Use나 Role을 변경한 뒤에는 Apply Source Changes로 Plan에 반영하세요. WPO/displacement, private material dependency, unsupported deformation 같은 안전성 경고는 단순 경고가 아니라 명시적인 제외 또는 수정이 필요한 차단 조건일 수 있습니다.
Game Thread publication/finalization backlog 상한입니다.
Worker Geometry
true
UObject read와 publication은 Game Thread에 남겨 두고 value-only geometry 계산을 worker task에서 수행합니다.
더 높은 값이 항상 빠른 것은 아닙니다. Scan 뒤 표시되는 top contributor와 remediation을 확인하고, 메모리 부족 시 Worker/Queued/GT Finalize보다 먼저 Auto Memory Budget과 Partition Plan을 점검하세요.
Single Level bake에서도 BakeSource Tag가 있는 Actor만 허용합니다.
bFailOnAeqdRangeExceeded
true
AEQD projection 안전 범위를 넘으면 실패합니다. 품질 손상을 숨기지 않으므로 기본값 유지가 권장됩니다.
bClipTrianglesToPartitionRadius
false
partition 반경에서 triangle을 자릅니다. 기본 pipeline의 canonical ownership과 의도적으로 다른 출력이 필요할 때만 사용합니다.
LandscapeProxyMaterial
None
Source Landscape Material을 Static Mesh에 사용할 수 없을 때의 fallback Material입니다.
SubdivisionWorldStep
275 cm, 0 이상
기본 world-space subdivision 간격입니다.
AdaptiveSubdivisionMaxProjectedEdgeDeviationCm
5 cm, 0 이상
곡면 projection edge 오차 허용치입니다.
MaxSubdivisionDivisionsPerTriangle
24, 최소 1
한 Source triangle의 subdivision 상한입니다.
MaxOutputTrianglesPerBakeJob
5,000,000, 최소 1
한 Bake job의 최종 triangle 안전 상한입니다.
FPlanetXProjectionResult, material remap, heightfield, mesh page, partition output과 instance batch 구조체는 결과 payload입니다. 속성이 reflected되어 있어도 사용자 설정으로 편집하지 마세요.
SpatialEntryPolicy는 아래 Same World 자동 진입/복귀 설정 묶음입니다.
설정
기본값
설명
bAutoRegisterRuntime
true
Owner를 PlanetX Runtime 참여 Actor로 자동 등록합니다.
RepresentationDomain
Ground
Actor의 기본 표현 소속입니다. Ground는 원본 Level, Orbit은 Planet/Compare와 Runtime Orbit/Transition 표현에 사용됩니다.
ActorSpatialLoadingPolicy
PlanetXManaged
PlanetXManaged는 Orbit Actor를 non-spatial/always-loaded로 유지합니다. ActorManaged는 개발자가 Is Spatially Loaded를 직접 관리합니다. Data Layer와 Streaming Source는 이 옵션이 관리하지 않습니다.
ReferencePlanetActor
None
좌표 기준 Planet Actor입니다. 유효한 Planet Asset을 가진 Actor만 사용할 수 있고, 지정하면 ReferencePlanetId보다 우선합니다.
ReferencePlanetId
None
Planet Actor가 없을 때 사용할 ID입니다. 목록은 현재 World에 배치된 Planet Component의 Asset에서 구성됩니다.
ReferenceSectionId
None
현재 Planet Asset의 enabled Section ID입니다. 저장, Capture, Sequencer처럼 재현성이 필요한 경로에서는 명시적으로 지정하세요.
bAutoResolveSectionFromWorld
true
Section ID가 None이면 현재 Planet Local 위치를 포함하는 첫 Section을 Asset 배열 순서로 찾습니다. Editor 편의와 일회성 Query용이며 영속 ID로 사용하지 마세요.
bSyncFromOwnerTransformInEditor
true
Editor에서 Root Transform이 바뀔 때 좌표 snapshot을 갱신합니다. Runtime authoritative state는 World Runtime Subsystem이 관리합니다.
TransformSource
WorldTransform
WorldTransform은 Owner Transform에서 PlanetX pose를 capture합니다. PlanetXTransform은 저장된 표준 pose를 원본으로 World Transform을 만듭니다. 전환은 자동으로 양쪽 값을 덮어쓰지 않습니다.
External Level Proxy Bake가 생성하는 Preview World의 Actor입니다. 직접 배치한 Gameplay Actor가 아니며, PreviewBakeData 링크는 생성 파이프라인이 관리합니다.
설정
기본값
설명
PreviewBakeData
None
Preview World가 stream될 때 불러올 시각 전용 Bake Data입니다.
bOverrideRuntimeBudget
false
Project Runtime Budget 대신 이 Preview Actor의 값을 사용합니다.
MaximumPayloadsPerRequest
8, 최소 1
한 요청의 child payload 상한입니다.
MaximumDependenciesPerRequest
64, 최소 1
한 streamable batch의 dependency 상한입니다.
MaximumComponentsPerFrame
2, 최소 1
한 Frame에 생성할 Component 상한입니다.
MaximumInstancesPerFrame
512, 최소 1
한 Frame에 realize할 instance 상한입니다.
RealizationTimeBudgetMs
2.0 ms, 최소 0.1
Preview realization의 Frame 시간 상한입니다.
Runtime Preview에는 GameMode, Pawn, Controller, Gameplay Actor Logic, Navigation과 Ground Gameplay Collision을 복제하지 마세요. 실제 Gameplay는 Ground World의 책임입니다.
설정 레퍼런스
환경 설정
Planet Asset의 EnvironmentSettings는 행성 전체에서 재사용하는 저작 Profile이고, Level의 PlanetX Environment Manager는 이 Profile을 적용하거나 해당 Level만 Override합니다. 거리 비율은 canonical Planet Radius에 대한 비율이며, Km가 붙은 값은 km입니다.
Manager의 CloudShadow는 편집 원본이 아니라 SunProfileOverride 또는 Asset Sun Profile에서 계산되는 cache입니다. 내부 Mode 기본값은 PlanetXManagedOverride이고, bEnableOrbitCloudShadow=true, bRestoreSourceLightWhenGroundActive=true입니다. DesiredOrbitLightShadow는 Orbit Material Approximation용, DirectionalLightOverrideShadow는 Orbit Directional Light용, GroundDirectionalLightOverrideShadow는 Ground용 상태이며, bUseSeparateGroundDirectionalLightOverride=false일 때 Ground도 Orbit Override를 공유합니다. 이 cache를 직접 고치지 말고 위 Sun/Cloud Shadow Profile을 편집하세요.
설정 레퍼런스
프로젝트와 성능 설정
PlanetX의 Project Settings는 Edit > Project Settings > Plugins 아래에 있습니다. 두 설정 객체는 DefaultEngine.ini 계열 Config에 저장됩니다.
RuntimeBudgetPolicy는 Bake된 Section Proxy, Transition Morph, Runtime Preview가 한 Frame과 한 streaming request에서 처리할 작업량을 정합니다. Proxy Bake Quality와는 독립적이므로 이 값을 바꿔도 Bake Asset이 다시 생성되지 않습니다.
정책
설명
Follow Engine Scalability
기본값입니다. 현재 Unreal Scalability의 단일 Quality Level을 따릅니다. 여러 그룹이 섞여 있으면 가장 낮은 Quality Level을 보수적으로 사용합니다.
Low
가장 작은 Runtime streaming/realization budget을 고정합니다.
Medium
중간 budget을 고정합니다.
High
PlanetX의 기본 제품 budget을 고정합니다.
Epic
가장 큰 bounded budget을 고정합니다. Cinematic Scalability도 Epic Profile로 해석됩니다.
Override는 문제 진단이나 특정 Actor가 반드시 다른 처리량을 가져야 할 때만 사용하세요. 너무 큰 값은 Game Thread spike와 streaming burst를 만들 수 있고, 너무 작은 값은 Section이 완전히 나타날 때까지 여러 Frame이 더 필요하게 만듭니다.
bool 반환값은 작업 완료 여부를 나타냅니다. 함수가 진단 출력을 별도로 보장하지 않는 한 false 뒤에는 출력 parameter를 사용하지 않습니다.
Enum을 반환하는 Query는 성공 상태일 때만 출력값을 사용합니다.
None ID, 유효하지 않은 Object 참조, 만료된 Handle과 non-success 오류 Enum을 정상적인 실패 상태로 처리합니다.
후보가 여러 개일 수 있으면 Planet, Binding, Section과 Level Pair ID를 명시합니다.
등록 또는 Streaming 상태가 바뀌면 Runtime Context를 갱신합니다.
Blueprint 표시명과 C++ Symbol은 다를 수 있습니다. 이 레퍼런스의 이름과 include 경로는 C++ 선언을 기준으로 합니다.
공개 API 레퍼런스
UPlanetXSubsystem
헤더: PlanetX/Subsystems/PlanetXSubsystem.h
UPlanetXSubsystem은 지원되는 런타임 API의 Game Instance Subsystem facade입니다. World Context parameter가 있는 함수는 모두 유효한 game world가 필요합니다. 안정 API 중 CancelLevelHandoff만 예외이며 Ticket만 받습니다.
PrepareTravel은 FPlanetXTravelRoute를 받습니다. Planet Actor 후보가 정확히 하나일 때만 자동 선택합니다. 명시적인 index 0은 유효하며, PlanetActorIndex와 PlanetBindingId를 모두 지정하면 같은 후보를 가리켜야 합니다.
선택한 Vector Space에서 입력을 추가합니다. 기본값은 SurfaceFrame, 접평면 투영은 활성입니다.
SetPlanetXVelocity
선택한 Vector Space에서 속도를 설정합니다. 기본값은 World입니다.
GetPlanetXVelocity
현재 속도를 요청한 Vector Space로 변환합니다.
AddPlanetXForce
Force를 추가합니다. 기본 Space는 World, bAccelerationChange 기본값은 false입니다.
AddPlanetXImpulse
Impulse를 추가합니다. 기본 Space는 World, bVelocityChange 기본값은 false입니다.
SnapToPlanetSurface
FPlanetXSurfaceSnapSettings에 따라 resolve된 표면으로 이동합니다.
AlignUpToPlanetSurface
FPlanetXSurfaceAlignmentSettings에 따라 Owner를 정렬합니다.
ValidateMovementConfiguration
설정이 유효하지 않을 때 오류 메시지를 출력합니다.
안정 함수는 모두 bool을 반환합니다. GetMovementRuntimeState와 GetCommittedRuntimeContext는 승인된 Advanced 상태 조회입니다. Representation이 바뀌는 동안 다른 Movement Component나 Physics Body가 속도를 소유한다면 Movement Handoff를 사용하세요.
이 Library는 versioned Movement Snapshot을 저장하고 FPlanetXMovementHandoffHandle을 반환합니다. 이후 호출에서 이 Handle을 resolve, apply, consume 또는 cancel합니다. 공개 함수 10개는 모두 bool과 FPlanetXMovementHandoffResult를 제공하므로 출력 사용 전에 두 결과를 함께 확인하세요.
Actor로 상태를 검색하지 말고 반환된 Handle을 사용하세요. Handle이 invalid, expired, consumed, cancelled 상태이거나 저장된 generation과 일치하지 않으면 실패할 수 있습니다. 전환 직전에 캡처하고, 대상 Frame을 사용할 수 있게 된 뒤 resolve·apply하며, 성공적으로 적용한 뒤에만 consume하세요.
FPlanetXTransform은 DataVersion, PlanetId, PlanetBindingId, PlanetFixedPositionCm, PlanetFixedRotation, Scale3D Reflection Field를 가진 Blueprint Type입니다. Position 단위는 cm입니다. UPlanetXSubsystem 또는 UPlanetXCoordinateComponent로 Resolve·Capture하고, World Transform을 Representation과 무관한 저장 Pose로 취급하지 마세요.
안정 Reflection Enum에는 EPlanetXTransformSource, EPlanetXMovementHandoffState, EPlanetXMovementContinuityPolicy, EPlanetXMovementVectorSpace가 있습니다. 실제 배포하는 Plugin Version의 헤더를 기준으로 Compile·Serialize하고 숫자 값이나 Layout을 추정하지 마세요.
FPlanetXTravelRoute는 PlanetX/Transition/PlanetXTransitionTypes.h에 선언되며 World, PlanetId, SectionId, PlanetActorIndex, PlanetBindingId를 포함합니다. PlanetActorIndex 기본값은 INDEX_NONE입니다. 후보가 정확히 하나일 때만 자동 선택하며 0은 첫 번째 deterministic 후보를 명시적으로 선택합니다. 두 Selector를 함께 지정하면 Index와 Binding ID가 같은 후보를 가리켜야 합니다.
FPlanetXCoordinateUtils는 지원 Coordinate 표현 사이의 순수 C++ 변환을 제공합니다. Runtime Registry가 필요한 변환은 UPlanetXSubsystem을 사용하세요. cm 단위, 유한한 값과 정규화된 방향 가정을 지키고 성공값을 항상 확인합니다.
PlanetXValidation은 C++ Tool을 위한 구조화된 Validation을 제공합니다. Severity, Code, Subject와 Remediation Text를 유지하세요. Validation은 Asset을 암묵적으로 Repair하거나 Save하지 않습니다.
생성 Mesh 데이터, Boundary Reconstruction 중간체, Bake Pass, 내부 Runtime Service와 Shard·Serialization Payload는 선언이 공개되어 있다는 이유만으로 안정 Game Save 또는 Network 계약이 되지 않습니다.
PlanetX.uplugin과 프로젝트의 EngineAssociation을 확인합니다. 현재 기준은 UE 5.8이며 Runtime과 Editor 두 모듈이 있습니다. GeometryProcessing과 PCG 플러그인이 활성화되고 대상 플랫폼 toolchain이 설치되어야 합니다.
Editor 로그에서 module load 실패의 첫 오류를 확인하세요. 이후 compile 오류는 연쇄 결과일 수 있습니다.
EPlanetXActorSpatialLoadingPolicy::PlanetXManaged는 Orbit Actor를 non-spatial 상태로 유지합니다. ActorManaged를 선택하면 Is Spatially Loaded를 프로젝트가 직접 관리해야 합니다. Data Layer와 Streaming Source는 자동 변경되지 않습니다. 실제 적용 상태는 GetActorSpatialLoadingPolicy, ShouldForceOwnerAlwaysLoaded, ApplySpatialLoadingPolicyToOwner로 확인하세요.
대상 Planet Asset, Section과 Source World가 유효한지 확인합니다. PIE를 종료하고 외부 Worker가 다른 작업을 소유하지 않는지 확인하세요. External Level Section을 다른 Level에서 열었다면 Editor가 필요한 Level 이동을 요청할 수 있습니다.
브라우저 Monitor는 선택 기능이며 Bake를 소유하지 않습니다. 로컬 서비스나 시스템 브라우저를 열지 못해도 External Bake는 계속되므로 Editor 상태와 Unreal 로그에서 진행 상황을 확인하세요. 전체 Monitor URL에는 로컬 세션 token이 포함되므로 복사하거나 공유하지 마세요.
Bake가 진행되는 동안에는 Direct Worker가 Monitor를 호스팅합니다. Worker가 종료되면 서비스도 끝나므로 완료 후 기존 탭에 Disconnected가 표시될 수 있습니다. Unreal Editor로 돌아가거나 다시 실행한 뒤 Open External Bake Monitor를 선택하면 최신 durable result를 다시 호스팅할 수 있습니다. 이전 탭은 자동으로 이전되지 않습니다.
Planet Actor 등록, Planet Asset, 현재 World와 World Runtime 서비스가 준비되지 않은 상태입니다. Begin Play/streaming 순서를 확인하고 Planet Component의 RefreshRuntimeRegistration과 참가 Actor의 RefreshRuntimeContext를 사용합니다.
Stat PlanetXMemory
Stat PlanetXResources
Stat PlanetXProxy
Stat PlanetXProxyDetail
Stat PlanetXRuntime
Memory는 runtime resource와 budget을, Resources는 수량을, Proxy는 렌더 coverage를, Runtime은 service 비용을 보여줍니다. 통계 World는 PIE/Game World와 선택된 Preview World 우선순위에 따라 결정됩니다.
UPlanetXSubsystem에서 Actor runtime context, movement state, transition result, managed actor state, Section runtime state와 Journey를 조회할 수 있습니다. DrawPlanetDebug, DrawSectionDebug, DrawActorContextDebug, DrawCaptureStackDebug는 개발 build의 공간 상태 확인에 사용합니다.
문제를 재현한 World, Planet/Binding/Section ID, Asset validation result, Proxy Bake revision과 omission, Travel Result error, 관련 Stat/Dump를 함께 기록하세요. 경로에 민감 정보가 있을 수 있으므로 외부 공유 전 redaction을 확인합니다.
릴리스 정보
PlanetX 1.0.1
PlanetX 1.0.1이 이제 Fab에 공개되었습니다. 이번 유지보수 릴리스는 Browser Monitor 복구, PlanetX Mode Transform 편집, presentation 제어를 개선합니다.
외부 Browser Monitor: 브라우저 acknowledgement가 없더라도 Monitor endpoint나 외부 Bake가 실패한 것처럼 처리되지 않습니다. 브라우저 실행은 best-effort이며 endpoint는 복구를 위해 계속 사용할 수 있습니다.
PlanetX Mode Transform Gizmo: 일반 Actor와 다중 선택은 Unreal Engine Native Transform Gizmo로 fallback됩니다. PlanetX 전용 Gizmo는 Coordinate Component가 있는 Actor 하나를 선택한 경우에만 사용합니다.
Global Presentation:UPlanetXCoordinateComponent에 Presentation Scope가 추가되었습니다. Actor가 Ground, Orbit, Transition에서 계속 보여야 하면 Global로 설정하세요. 이는 presentation 전용이며 Representation Domain, coordinate, Proxy Bake 대상 여부, physical-frame 소유권은 바꾸지 않습니다.
이 제품은 KRAFTON JUNGLE GameTech Lab의 개발자 지원 프로그램인 Epic Project에 참여하며 본인(당사)이 독자적으로 개발한 결과물입니다. 이 제품에 대한 모든 권리와 권원, 이익은 전적으로 본인(당사)에게 귀속됩니다. Krafton, Inc.는 이 제품의 개발과 배포에 관여하지 않았으며, 명시적이거나 묵시적인 일체의 진술과 보증을 부인하고, 이 제품의 사용으로 발생하는 어떠한 결과에 대해서도 책임을 지지 않습니다.
PlanetX의 샘플 행성 표면 텍스처와 우주 배경 텍스처는 Solar System Scope / INOVE가 제공하는 텍스처 데이터를 포함하거나 이를 기반으로 제작되었습니다. 이 텍스처를 참조하는 Unreal Engine Material과 Material Instance도 같은 범위에 포함됩니다.
위에 명시한 행성 표면 텍스처와 우주 배경 텍스처 외에 PlanetX가 사용하는 외부 저작물은 없습니다. 그 밖의 소스 코드, Material, Mesh, 아이콘, 문서, Proxy Bake Monitor 웹 리소스는 모두 LabX가 직접 제작했습니다. 문서 사이트는 외부 스크립트, 폰트, 스타일시트를 내려받지 않으며 네트워크 연결 없이 동작합니다.