gaesup-world 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/README.md +267 -263
  2. package/dist/GrassDriver-0VzddMiy.cjs +725 -0
  3. package/dist/GrassDriver-CgXNOTL2.js +9871 -0
  4. package/dist/PhysicsEntity-BpoArh5L.cjs +1 -0
  5. package/dist/PhysicsEntity-Cy3K_czk.js +3845 -0
  6. package/dist/api-B58jaq5T.cjs +1 -0
  7. package/dist/api-BRV101Zn.js +40 -0
  8. package/dist/assetStore-2bI2BPCn.js +232 -0
  9. package/dist/assetStore-BuE4mh1C.cjs +1 -0
  10. package/dist/assets.cjs +1 -0
  11. package/dist/assets.d.ts +1 -0
  12. package/dist/assets.js +14 -0
  13. package/dist/blueprints-editor.cjs +1 -1
  14. package/dist/blueprints-editor.js +14 -12
  15. package/dist/blueprints.cjs +1 -1
  16. package/dist/blueprints.js +2 -2
  17. package/dist/core/animation/hooks/useAnimationBridge.d.ts +1 -1
  18. package/dist/core/assets/api.d.ts +12 -0
  19. package/dist/core/assets/building.d.ts +5 -0
  20. package/dist/core/assets/components/AssetPreviewCanvas/index.d.ts +7 -0
  21. package/dist/core/assets/data/seedAssets.d.ts +2 -0
  22. package/dist/core/assets/index.d.ts +7 -0
  23. package/dist/core/assets/stores/assetStore.d.ts +20 -0
  24. package/dist/core/assets/types.d.ts +30 -0
  25. package/dist/core/building/catalog/index.d.ts +1 -0
  26. package/dist/core/building/catalog/objects.d.ts +12 -0
  27. package/dist/core/building/components/BlockSystem/index.d.ts +1 -1
  28. package/dist/core/building/components/BlockSystem/types.d.ts +1 -0
  29. package/dist/core/building/components/BuildingUI/index.d.ts +1 -0
  30. package/dist/core/building/components/TileSystem/index.d.ts +1 -1
  31. package/dist/core/building/components/TileSystem/types.d.ts +1 -0
  32. package/dist/core/building/components/WallSystem/index.d.ts +3 -1
  33. package/dist/core/building/components/WallSystem/types.d.ts +2 -0
  34. package/dist/core/building/components/mesh/fire/index.d.ts +1 -0
  35. package/dist/core/building/components/mesh/grass/assets.d.ts +11 -0
  36. package/dist/core/building/components/mesh/model/index.d.ts +11 -0
  37. package/dist/core/building/components/mesh/sand.d.ts +5 -1
  38. package/dist/core/building/components/mesh/snowfield.d.ts +5 -1
  39. package/dist/core/building/core/MaterialManager.d.ts +1 -0
  40. package/dist/core/building/hooks/useBuildingEditor.d.ts +4 -1
  41. package/dist/core/building/index.d.ts +1 -0
  42. package/dist/core/building/plugin.d.ts +2 -0
  43. package/dist/core/building/render/core.d.ts +1 -0
  44. package/dist/core/building/render/culling.d.ts +2 -1
  45. package/dist/core/building/render/draw.d.ts +1 -1
  46. package/dist/core/building/stores/buildingStore.d.ts +23 -1
  47. package/dist/core/building/stores/persistence.d.ts +19 -0
  48. package/dist/core/building/types/index.d.ts +23 -1
  49. package/dist/core/camera/bridge/BaseCameraSystem.d.ts +1 -0
  50. package/dist/core/camera/bridge/types.d.ts +9 -0
  51. package/dist/core/camera/controllers/BaseController.d.ts +1 -0
  52. package/dist/core/camera/controllers/FirstPersonController.d.ts +1 -0
  53. package/dist/core/camera/controllers/TopDownController.d.ts +5 -0
  54. package/dist/core/camera/core/CameraSystem.d.ts +2 -2
  55. package/dist/core/camera/core/constants.d.ts +4 -0
  56. package/dist/core/camera/core/types.d.ts +9 -0
  57. package/dist/core/camera/index.d.ts +1 -0
  58. package/dist/core/camera/plugin.d.ts +48 -0
  59. package/dist/core/camera/utils/camera.d.ts +4 -3
  60. package/dist/core/character/index.d.ts +2 -0
  61. package/dist/core/character/resolveParts.d.ts +11 -0
  62. package/dist/core/character/stores/characterStore.d.ts +3 -2
  63. package/dist/core/character/types.d.ts +8 -2
  64. package/dist/core/content/exporter.d.ts +17 -0
  65. package/dist/core/content/index.d.ts +4 -0
  66. package/dist/core/content/loader.d.ts +9 -0
  67. package/dist/core/content/types.d.ts +57 -0
  68. package/dist/core/editor/components/Editor/types.d.ts +2 -0
  69. package/dist/core/editor/components/EditorLayout/types.d.ts +12 -0
  70. package/dist/core/editor/components/panels/BuildingPanel/index.d.ts +3 -0
  71. package/dist/core/editor/components/panels/CharacterAssetPanel/index.d.ts +3 -0
  72. package/dist/core/editor/components/panels/GameplayEventPanel/index.d.ts +12 -0
  73. package/dist/core/editor/components/panels/StudioPanel/index.d.ts +7 -0
  74. package/dist/core/editor/components/panels/index.d.ts +3 -0
  75. package/dist/core/editor/index.d.ts +3 -1
  76. package/dist/core/editor/shell.d.ts +31 -0
  77. package/dist/core/gameplay/events/data/seedEvents.d.ts +2 -0
  78. package/dist/core/gameplay/events/engine.d.ts +17 -0
  79. package/dist/core/gameplay/events/index.d.ts +5 -0
  80. package/dist/core/gameplay/events/registry.d.ts +11 -0
  81. package/dist/core/gameplay/events/types.d.ts +138 -0
  82. package/dist/core/gameplay/index.d.ts +1 -0
  83. package/dist/core/index.d.ts +7 -0
  84. package/dist/core/interactions/core/adapter.d.ts +9 -0
  85. package/dist/core/interactions/core/index.d.ts +1 -0
  86. package/dist/core/motions/core/system/PhysicsSystem.d.ts +1 -0
  87. package/dist/core/motions/entities/types.d.ts +2 -0
  88. package/dist/core/motions/hooks/usePhysicsBridge.d.ts +2 -0
  89. package/dist/core/motions/index.d.ts +1 -0
  90. package/dist/core/motions/plugin.d.ts +50 -0
  91. package/dist/core/networks/adapter/MockNetworkAdapter.d.ts +10 -0
  92. package/dist/core/networks/adapter/index.d.ts +3 -0
  93. package/dist/core/networks/adapter/types.d.ts +51 -0
  94. package/dist/core/networks/index.d.ts +1 -0
  95. package/dist/core/ops/index.d.ts +2 -0
  96. package/dist/core/ops/rbac.d.ts +4 -0
  97. package/dist/core/ops/types.d.ts +44 -0
  98. package/dist/core/platform/index.d.ts +2 -0
  99. package/dist/core/platform/snapshot.d.ts +35 -0
  100. package/dist/core/plugins/ExtensionRegistry.d.ts +1 -0
  101. package/dist/core/plugins/PluginRegistry.d.ts +1 -0
  102. package/dist/core/plugins/types.d.ts +4 -0
  103. package/dist/core/runtime/createGaesupRuntime.d.ts +2 -0
  104. package/dist/core/runtime/index.d.ts +2 -0
  105. package/dist/core/runtime/types.d.ts +24 -0
  106. package/dist/core/save/core/SaveSystem.d.ts +4 -2
  107. package/dist/core/save/types.d.ts +8 -0
  108. package/dist/core/world/components/WorldContainer/types.d.ts +11 -2
  109. package/dist/core/world/stores/persistenceSlice.d.ts +11 -6
  110. package/dist/defaultConfig-BR_x-243.cjs +1 -0
  111. package/dist/defaultConfig-CJNbZAKY.js +2126 -0
  112. package/dist/editor.cjs +1 -0
  113. package/dist/editor.d.ts +5 -0
  114. package/dist/editor.js +208 -0
  115. package/dist/eventsStore-Cipkf938.cjs +1 -0
  116. package/dist/eventsStore-DqmXNVEb.js +244 -0
  117. package/dist/gaesupStore-BKIA2dFc.js +1345 -0
  118. package/dist/gaesupStore-BoN_06sX.cjs +1 -0
  119. package/dist/gltf/props/LICENSE.txt +70 -0
  120. package/dist/index-B9921cuX.cjs +1 -0
  121. package/dist/index-BOmJcTCV.cjs +1 -0
  122. package/dist/index-BUONBdvH.cjs +1 -0
  123. package/dist/index-BjrBeKEM.js +705 -0
  124. package/dist/index-BlKxYuUK.js +328 -0
  125. package/dist/index-BmOFYbvk.js +69 -0
  126. package/dist/index-BnACo_cG.js +385 -0
  127. package/dist/index-BsAUS0-8.js +547 -0
  128. package/dist/index-C-ViQFGa.js +100 -0
  129. package/dist/index-CwttQ-l-.cjs +1 -0
  130. package/dist/index-DCa_lUwq.cjs +1 -0
  131. package/dist/index-SFK6DuIo.cjs +1 -0
  132. package/dist/index.cjs +2 -726
  133. package/dist/index.css +1 -1
  134. package/dist/index.d.cts +10 -2
  135. package/dist/index.d.ts +10 -2
  136. package/dist/index.js +4183 -15725
  137. package/dist/network.cjs +1 -0
  138. package/dist/network.d.ts +1 -0
  139. package/dist/network.js +2067 -0
  140. package/dist/postprocessing.cjs +1 -1
  141. package/dist/postprocessing.js +24 -23
  142. package/dist/rbac-Bjx9pTbU.js +42 -0
  143. package/dist/rbac-N7h7zNl3.cjs +1 -0
  144. package/dist/{registerComponents-CYCKQxA1.js → registerComponents-BfIcN9qa.js} +2 -2
  145. package/dist/{registerComponents-DBQpZm-r.cjs → registerComponents-D3FUm9GA.cjs} +1 -1
  146. package/dist/runtime.cjs +1 -0
  147. package/dist/runtime.d.ts +6 -0
  148. package/dist/runtime.js +1350 -0
  149. package/dist/seedEvents-Dmms48tb.cjs +1 -0
  150. package/dist/seedEvents-v6aCLQE7.js +723 -0
  151. package/dist/server-contracts.cjs +1 -0
  152. package/dist/server-contracts.d.ts +5 -0
  153. package/dist/server-contracts.js +28 -0
  154. package/dist/sfe-CRsG1dTW.js +10 -0
  155. package/dist/sfe-CpgzdMyB.cjs +1 -0
  156. package/dist/snapshot-DRqZrbCu.cjs +1 -0
  157. package/dist/snapshot-OExk53wq.js +75 -0
  158. package/dist/timeStore-BRw0mdde.js +96 -0
  159. package/dist/timeStore-CDN035t4.cjs +1 -0
  160. package/dist/types-Ck0ueY4N.js +40 -0
  161. package/dist/types-DgS5FYTs.cjs +1 -0
  162. package/dist/useSpawnFromBlueprint-1gMiylSa.cjs +1 -0
  163. package/dist/useSpawnFromBlueprint-fzl4TuHG.js +366 -0
  164. package/dist/weatherStore-1unmwIen.cjs +1 -0
  165. package/dist/weatherStore-CzG5N441.js +49 -0
  166. package/package.json +226 -175
  167. package/public/gltf/props/LICENSE.txt +70 -0
  168. package/public/gltf/props/bed.glb +0 -0
  169. package/public/gltf/props/chair.glb +0 -0
  170. package/public/gltf/props/crafting.glb +0 -0
  171. package/public/gltf/props/door.glb +0 -0
  172. package/public/gltf/props/fence.glb +0 -0
  173. package/public/gltf/props/lamp.glb +0 -0
  174. package/public/gltf/props/mailbox.glb +0 -0
  175. package/public/gltf/props/shop-stall.glb +0 -0
  176. package/public/gltf/props/storage.glb +0 -0
  177. package/public/gltf/props/table.glb +0 -0
  178. package/public/gltf/props/window.glb +0 -0
  179. package/dist/index-B-02XaUy.js +0 -3436
  180. package/dist/index-CZLbaLYT.cjs +0 -1
  181. package/dist/useSpawnFromBlueprint-Cxb3C2ch.js +0 -1665
  182. package/dist/useSpawnFromBlueprint-D5j-98Q8.cjs +0 -1
  183. package/dist/weatherStore-C2_1d8hn.cjs +0 -1
  184. package/dist/weatherStore-ZW3thKj6.js +0 -142
package/README.md CHANGED
@@ -1,263 +1,267 @@
1
- # Gaesup World
2
-
3
- [![Version](https://img.shields.io/npm/v/gaesup-world?style=flat-square&logo=npm&logoColor=white&labelColor=000000&color=blue)](https://www.npmjs.com/package/gaesup-world)
4
- [![Downloads](https://img.shields.io/npm/dt/gaesup-world.svg?style=flat-square&logo=npm&logoColor=white&labelColor=000000&color=blue)](https://www.npmjs.com/package/gaesup-world)
5
-
6
- ![Gaesup World 메인 이미지](https://signightbackend.s3.ap-northeast-2.amazonaws.com/images/gemini/image/1776774136799_88c802b2359c.jpg)
7
-
8
- `Gaesup World`는 `React Three Fiber`, `Three.js`, `Rapier`, `Zustand` 기반으로 만든 웹 3D 월드/게임 라이브러리입니다. 캐릭터 이동, 카메라, 상호작용, 건설, 애니메이션, 네트워크, 인벤토리, 퀘스트, 날씨, 타운 시스템처럼 월드 게임에 필요한 기능을 도메인 단위로 제공합니다.
9
-
10
- 이 저장소는 두 가지 역할을 함께 가집니다.
11
-
12
- - `src/`: 실제 배포되는 라이브러리 코드
13
- - `examples/`: 라이브러리를 사용하는 데모 앱
14
-
15
- ## 현재 상태
16
-
17
- - 패키지명: `gaesup-world`
18
- - 문서 기준 import 엔트리: `gaesup-world`
19
- - 라이브러리 ESM 빌드: 확인 완료
20
- - 데모 Vite 빌드: 확인 완료
21
- - Jest 테스트: 통과
22
- - TypeScript strict 전체 통과: 아직 아님
23
-
24
- 즉, 런타임과 번들 기준으로는 사용 가능한 상태지만, 일부 도메인에는 추가 타입 정리가 남아 있습니다.
25
-
26
- ## 설치
27
-
28
- 프로젝트에서 사용할 때는 `gaesup-world`와 React Three Fiber 계열 의존성을 함께 설치하면 됩니다.
29
-
30
- ```bash
31
- npm install gaesup-world three react react-dom @react-three/fiber @react-three/drei @react-three/rapier
32
- ```
33
-
34
- 또는
35
-
36
- ```bash
37
- yarn add gaesup-world three react react-dom @react-three/fiber @react-three/drei @react-three/rapier
38
- ```
39
-
40
- 또는
41
-
42
- ```bash
43
- pnpm add gaesup-world three react react-dom @react-three/fiber @react-three/drei @react-three/rapier
44
- ```
45
-
46
- ## 빠른 시작
47
-
48
- 가장 기본적인 사용 예시는 아래와 같습니다.
49
-
50
- ```tsx
51
- import { Canvas } from '@react-three/fiber';
52
- import { Physics } from '@react-three/rapier';
53
- import { GaesupController, GaesupWorld } from 'gaesup-world';
54
-
55
- const CHARACTER_URL = 'https://your-cdn.example.com/character.glb';
56
-
57
- export default function App() {
58
- return (
59
- <GaesupWorld
60
- urls={{ characterUrl: CHARACTER_URL }}
61
- mode={{ type: 'character', controller: 'keyboard', control: 'thirdPerson' }}
62
- >
63
- <Canvas shadows camera={{ position: [0, 6, 10], fov: 50 }}>
64
- <Physics>
65
- <GaesupController />
66
- </Physics>
67
- </Canvas>
68
- </GaesupWorld>
69
- );
70
- }
71
- ```
72
-
73
- ## 핵심 개념
74
-
75
- ### 월드 설정
76
-
77
- `GaesupWorld`는 월드 관련 설정을 store에 주입하는 루트 컴포넌트입니다.
78
-
79
- - `urls`: 캐릭터/차량/비행기 모델 URL
80
- - `mode`: 플레이어 타입, 입력 방식, 카메라 제어 방식
81
- - `cameraOption`: 카메라 세부 옵션
82
-
83
- 내부적으로는 `WorldContainer` 또는 `WorldConfigProvider` 역할을 감싼 공개 API입니다.
84
-
85
- ### 플레이어 제어
86
-
87
- `GaesupController`는 캐릭터/엔티티 조작을 담당하는 기본 컨트롤러입니다.
88
-
89
- - 키보드 이동
90
- - 클릭 이동
91
- - 상호작용 시스템 연결
92
- - 이동/상태 브리지 연결
93
-
94
- ### 도메인 기반 구조
95
-
96
- 주요 기능은 도메인 단위로 분리되어 있습니다.
97
-
98
- - `animation`
99
- - `camera`
100
- - `motions`
101
- - `interactions`
102
- - `world`
103
- - `building`
104
- - `networks`
105
- - `time`
106
- - `save`
107
- - `inventory`
108
- - `items`
109
- - `quests`
110
- - `weather`
111
- - `town`
112
- - `audio`
113
- - `npc`
114
- - `blueprints`
115
- - `admin`
116
-
117
- ## 자주 쓰는 공개 API
118
-
119
- 대표적으로 아래 항목들을 루트 엔트리에서 바로 import 할 수 있습니다.
120
-
121
- ```tsx
122
- import {
123
- GaesupWorld,
124
- GaesupController,
125
- GaesupAdmin,
126
- WorldContainer,
127
- WorldConfigProvider,
128
- BuildingUI,
129
- InventoryUI,
130
- QuestLogUI,
131
- DialogBox,
132
- WeatherEffect,
133
- useAuthStore,
134
- useInventoryStore,
135
- useQuestStore,
136
- useWeatherStore,
137
- useGameTime,
138
- getItemRegistry,
139
- getNPCScheduler,
140
- } from 'gaesup-world';
141
- ```
142
-
143
- 블루프린트 관련 API도 루트 엔트리에서 바로 사용할 수 있습니다.
144
-
145
- ```tsx
146
- import {
147
- BlueprintEditor,
148
- BlueprintSpawner,
149
- blueprintRegistry,
150
- BlueprintFactory,
151
- } from 'gaesup-world';
152
- ```
153
-
154
- ## Admin 사용법
155
-
156
- 관리자 UI도 루트 엔트리에서 import 합니다.
157
-
158
- ```tsx
159
- import { GaesupAdmin } from 'gaesup-world';
160
- ```
161
-
162
- 기본적으로 `GaesupAdmin`은 로그인 게이트가 켜져 있습니다. 즉, `requireLogin` 기본값은 `true`입니다.
163
-
164
- ```tsx
165
- import { GaesupAdmin } from 'gaesup-world';
166
-
167
- export default function AdminPage() {
168
- return (
169
- <GaesupAdmin>
170
- <div>Protected Admin Area</div>
171
- </GaesupAdmin>
172
- );
173
- }
174
- ```
175
-
176
- 로그인 보호 없이 감싸고 싶다면 명시적으로 꺼야 합니다.
177
-
178
- ```tsx
179
- <GaesupAdmin requireLogin={false}>
180
- <div>Public Admin Preview</div>
181
- </GaesupAdmin>
182
- ```
183
-
184
- ## 개발 환경 실행
185
-
186
- 이 저장소 자체를 로컬에서 실행할 때는 `pnpm` 기준으로 작업하는 것이 가장 자연스럽습니다.
187
-
188
- ```bash
189
- corepack pnpm install
190
- corepack pnpm dev
191
- ```
192
-
193
- 주요 명령:
194
-
195
- ```bash
196
- corepack pnpm dev
197
- corepack pnpm build
198
- corepack pnpm exec vite build --mode esm
199
- corepack pnpm exec vite build
200
- corepack pnpm test -- --runInBand
201
- corepack pnpm lint
202
- ```
203
-
204
- 참고:
205
-
206
- - 현재 Windows 환경에서는 `prepare` 스크립트가 `pnpm` PATH 설정에 따라 실패할 수 있습니다.
207
- - 이런 경우 `corepack pnpm ...` 형태로 실행하면 정상 동작합니다.
208
-
209
- ## 데모 앱
210
-
211
- `examples/`에는 라이브러리를 실제로 사용하는 데모 라우트가 들어 있습니다.
212
-
213
- - `/`: 기본 월드 데모
214
- - `/edit`: 편집 데모
215
- - `/building`: 건설 에디터
216
- - `/blueprints`: 블루프린트 에디터
217
- - `/network`: 멀티플레이어 데모
218
- - `/admin`: 관리자 래핑 데모
219
-
220
- 최근 정리로 인해 `examples`는 가능하면 내부 소스 경로 대신 루트 public API를 사용하도록 맞춰져 있습니다.
221
-
222
- ## 검증 상태
223
-
224
- 최근 확인 기준:
225
-
226
- - `corepack pnpm exec vite build`: 성공
227
- - `corepack pnpm exec vite build --mode esm`: 성공
228
- - `corepack pnpm exec jest --runInBand --watchman=false`: 성공
229
- - `corepack pnpm exec tsc -p tsconfig.build.json --pretty false`: 실패
230
-
231
- 마지막 항목은 문서 문제가 아니라, 저장소 전반에 남아 있는 strict 타입 오류 때문입니다.
232
-
233
- ## 문서 안내
234
-
235
- 프로젝트 개요:
236
-
237
- - [프로젝트 개요](./docs/GAESUP_WORLD_OVERVIEW.md)
238
-
239
- 도메인 문서:
240
-
241
- - [애니메이션](./docs/domain/ANIMATION.md)
242
- - [블루프린트](./docs/domain/BLUEPRINT.md)
243
- - [카메라](./docs/domain/CAMERA.md)
244
- - [모션](./docs/domain/MOTIONS.md)
245
- - [네트워크](./docs/domain/NETWORKS.md)
246
- - [보일러플레이트 구조](./docs/domain/BOILERPLATE_ARCHITECTURE.md)
247
-
248
- 계획 문서:
249
-
250
- - [MVP 계획](./docs/plan/MVP.md)
251
-
252
- 가이드 문서:
253
-
254
- - [API 가이드](./docs/guide/API_GUIDE.md)
255
- - [레이어 가이드](./docs/guide/LAYER_GUIDE.md)
256
- - [성능 가이드](./docs/guide/PERFORMANCE_GUIDE.md)
257
- - [테스트 가이드](./docs/guide/TEST_GUIDE.md)
258
-
259
- ## 패키지 정보
260
-
261
- - npm: https://www.npmjs.com/package/gaesup-world
262
- - 저장소: https://github.com/jigglypop/gaesup-world.git
263
- - 라이선스: MIT
1
+ # Gaesup World
2
+
3
+ [![Version](https://img.shields.io/npm/v/gaesup-world?style=flat-square&logo=npm&logoColor=white&labelColor=000000&color=blue)](https://www.npmjs.com/package/gaesup-world)
4
+ [![Downloads](https://img.shields.io/npm/dt/gaesup-world.svg?style=flat-square&logo=npm&logoColor=white&labelColor=000000&color=blue)](https://www.npmjs.com/package/gaesup-world)
5
+
6
+ ![Gaesup World 메인 이미지](https://signightbackend.s3.ap-northeast-2.amazonaws.com/images/gemini/image/1776774136799_88c802b2359c.jpg)
7
+
8
+ `Gaesup World`는 `React Three Fiber`, `Three.js`, `Rapier`, `Zustand` 기반으로 만든 웹 3D 월드/게임 라이브러리입니다. 캐릭터 이동, 카메라, 상호작용, 건설, 애니메이션, 네트워크, 인벤토리, 퀘스트, 날씨, 타운 시스템처럼 월드 게임에 필요한 기능을 도메인 단위로 제공합니다.
9
+
10
+ 이 저장소는 두 가지 역할을 함께 가집니다.
11
+
12
+ - `src/`: 실제 배포되는 라이브러리 코드
13
+ - `examples/`: 라이브러리를 사용하는 데모 앱
14
+
15
+ ## 현재 상태
16
+
17
+ - 패키지명: `gaesup-world`
18
+ - 문서 기준 import 엔트리: `gaesup-world`
19
+ - 라이브러리 ESM 빌드: 확인 완료
20
+ - 데모 Vite 빌드: 확인 완료
21
+ - Jest 테스트: 통과
22
+ - TypeScript declaration build: 통과
23
+
24
+ 즉, 런타임, 번들, 타입 선언 빌드 기준으로는 사용 가능한 상태입니다.
25
+
26
+ ## 설치
27
+
28
+ 프로젝트에서 사용할 때는 `gaesup-world`와 React Three Fiber 계열 의존성을 함께 설치하면 됩니다.
29
+
30
+ ```bash
31
+ npm install gaesup-world three react react-dom @react-three/fiber @react-three/drei @react-three/rapier
32
+ ```
33
+
34
+ 또는
35
+
36
+ ```bash
37
+ yarn add gaesup-world three react react-dom @react-three/fiber @react-three/drei @react-three/rapier
38
+ ```
39
+
40
+ 또는
41
+
42
+ ```bash
43
+ pnpm add gaesup-world three react react-dom @react-three/fiber @react-three/drei @react-three/rapier
44
+ ```
45
+
46
+ ## 빠른 시작
47
+
48
+ 가장 기본적인 사용 예시는 아래와 같습니다.
49
+
50
+ ```tsx
51
+ import { Canvas } from '@react-three/fiber';
52
+ import { Physics } from '@react-three/rapier';
53
+ import { GaesupController, GaesupWorld } from 'gaesup-world';
54
+
55
+ const CHARACTER_URL = 'https://your-cdn.example.com/character.glb';
56
+
57
+ export default function App() {
58
+ return (
59
+ <GaesupWorld
60
+ urls={{ characterUrl: CHARACTER_URL }}
61
+ mode={{ type: 'character', controller: 'keyboard', control: 'thirdPerson' }}
62
+ >
63
+ <Canvas shadows camera={{ position: [0, 6, 10], fov: 50 }}>
64
+ <Physics>
65
+ <GaesupController />
66
+ </Physics>
67
+ </Canvas>
68
+ </GaesupWorld>
69
+ );
70
+ }
71
+ ```
72
+
73
+ ## 핵심 개념
74
+
75
+ ### 월드 설정
76
+
77
+ `GaesupWorld`는 월드 관련 설정을 store에 주입하는 루트 컴포넌트입니다.
78
+
79
+ - `urls`: 캐릭터/차량/비행기 모델 URL
80
+ - `mode`: 플레이어 타입, 입력 방식, 카메라 제어 방식
81
+ - `cameraOption`: 카메라 세부 옵션
82
+
83
+ 내부적으로는 `WorldContainer` 또는 `WorldConfigProvider` 역할을 감싼 공개 API입니다.
84
+
85
+ ### 플레이어 제어
86
+
87
+ `GaesupController`는 캐릭터/엔티티 조작을 담당하는 기본 컨트롤러입니다.
88
+
89
+ - 키보드 이동
90
+ - 클릭 이동
91
+ - 상호작용 시스템 연결
92
+ - 이동/상태 브리지 연결
93
+
94
+ ### 도메인 기반 구조
95
+
96
+ 주요 기능은 도메인 단위로 분리되어 있습니다.
97
+
98
+ - `animation`
99
+ - `camera`
100
+ - `motions`
101
+ - `interactions`
102
+ - `world`
103
+ - `building`
104
+ - `networks`
105
+ - `time`
106
+ - `save`
107
+ - `inventory`
108
+ - `items`
109
+ - `quests`
110
+ - `weather`
111
+ - `town`
112
+ - `audio`
113
+ - `npc`
114
+ - `blueprints`
115
+ - `admin`
116
+
117
+ ## 자주 쓰는 공개 API
118
+
119
+ 대표적으로 아래 항목들을 루트 엔트리에서 바로 import 할 수 있습니다.
120
+
121
+ ```tsx
122
+ import {
123
+ GaesupWorld,
124
+ GaesupController,
125
+ WorldContainer,
126
+ WorldConfigProvider,
127
+ BuildingUI,
128
+ InventoryUI,
129
+ QuestLogUI,
130
+ DialogBox,
131
+ WeatherEffect,
132
+ useInventoryStore,
133
+ useQuestStore,
134
+ useWeatherStore,
135
+ useGameTime,
136
+ getItemRegistry,
137
+ getNPCScheduler,
138
+ } from 'gaesup-world';
139
+ ```
140
+
141
+ 블루프린트 런타임 관련 API도 루트 엔트리에서 바로 사용할 수 있습니다.
142
+
143
+ ```tsx
144
+ import {
145
+ BlueprintSpawner,
146
+ blueprintRegistry,
147
+ BlueprintFactory,
148
+ } from 'gaesup-world';
149
+ ```
150
+
151
+ 관리자 UI와 블루프린트 편집 UI는 별도 subpath를 사용합니다.
152
+
153
+ ```tsx
154
+ import { GaesupAdmin, useAuthStore } from 'gaesup-world/admin';
155
+ import { BlueprintEditor } from 'gaesup-world/blueprints/editor';
156
+ ```
157
+
158
+ ## Admin 사용법
159
+
160
+ 관리자 UI는 `gaesup-world/admin` 엔트리에서 import 합니다.
161
+
162
+ ```tsx
163
+ import { GaesupAdmin } from 'gaesup-world/admin';
164
+ ```
165
+
166
+ 기본적으로 `GaesupAdmin`은 로그인 게이트가 켜져 있습니다. 즉, `requireLogin` 기본값은 `true`입니다.
167
+
168
+ ```tsx
169
+ import { GaesupAdmin } from 'gaesup-world/admin';
170
+
171
+ export default function AdminPage() {
172
+ return (
173
+ <GaesupAdmin>
174
+ <div>Protected Admin Area</div>
175
+ </GaesupAdmin>
176
+ );
177
+ }
178
+ ```
179
+
180
+ 로그인 보호 없이 감싸고 싶다면 명시적으로 꺼야 합니다.
181
+
182
+ ```tsx
183
+ <GaesupAdmin requireLogin={false}>
184
+ <div>Public Admin Preview</div>
185
+ </GaesupAdmin>
186
+ ```
187
+
188
+ ## 개발 환경 실행
189
+
190
+ 이 저장소 자체를 로컬에서 실행할 때는 `pnpm` 기준으로 작업하는 것이 가장 자연스럽습니다.
191
+
192
+ ```bash
193
+ corepack pnpm install
194
+ corepack pnpm dev
195
+ ```
196
+
197
+ 주요 명령:
198
+
199
+ ```bash
200
+ corepack pnpm dev
201
+ corepack pnpm build
202
+ corepack pnpm exec vite build --mode esm
203
+ corepack pnpm exec vite build
204
+ corepack pnpm test -- --runInBand
205
+ corepack pnpm lint
206
+ ```
207
+
208
+ 참고:
209
+
210
+ - 현재 Windows 환경에서는 `prepare` 스크립트가 `pnpm` PATH 설정에 따라 실패할 수 있습니다.
211
+ - 이런 경우 `corepack pnpm ...` 형태로 실행하면 정상 동작합니다.
212
+
213
+ ## 데모 앱
214
+
215
+ `examples/`에는 라이브러리를 실제로 사용하는 데모 라우트가 들어 있습니다.
216
+
217
+ - `/`: 쇼케이스 데모
218
+ - `/world`: 기본 월드/건설 에디터 데모
219
+ - `/edit`: 편집 데모
220
+ - `/blueprints`: 블루프린트 에디터
221
+ - `/network`: 멀티플레이어 데모
222
+ - `/admin`: 관리자 래핑 데모
223
+
224
+ 최근 정리로 인해 `examples`는 가능하면 내부 소스 경로 대신 루트 public API를 사용하도록 맞춰져 있습니다.
225
+
226
+ ## 검증 상태
227
+
228
+ 최근 확인 기준:
229
+
230
+ - `corepack pnpm exec vite build`: 성공
231
+ - `corepack pnpm exec vite build --mode esm`: 성공
232
+ - `corepack pnpm exec jest --runInBand --watchman=false`: 성공
233
+ - `npm run build:types`: 성공
234
+
235
+ 타입 선언 빌드는 현재 통과합니다.
236
+
237
+ ## 문서 안내
238
+
239
+ 프로젝트 개요:
240
+
241
+ - [프로젝트 개요](./docs/GAESUP_WORLD_OVERVIEW.md)
242
+
243
+ 도메인 문서:
244
+
245
+ - [애니메이션](./docs/domain/ANIMATION.md)
246
+ - [블루프린트](./docs/domain/BLUEPRINT.md)
247
+ - [카메라](./docs/domain/CAMERA.md)
248
+ - [모션](./docs/domain/MOTIONS.md)
249
+ - [네트워크](./docs/domain/NETWORKS.md)
250
+ - [보일러플레이트 구조](./docs/domain/BOILERPLATE_ARCHITECTURE.md)
251
+
252
+ 계획 문서:
253
+
254
+ - [MVP 계획](./docs/plan/MVP.md)
255
+
256
+ 가이드 문서:
257
+
258
+ - [API 가이드](./docs/guide/API_GUIDE.md)
259
+ - [레이어 가이드](./docs/guide/LAYER_GUIDE.md)
260
+ - [성능 가이드](./docs/guide/PERFORMANCE_GUIDE.md)
261
+ - [테스트 가이드](./docs/guide/TEST_GUIDE.md)
262
+
263
+ ## 패키지 정보
264
+
265
+ - npm: https://www.npmjs.com/package/gaesup-world
266
+ - 저장소: https://github.com/jigglypop/gaesup-world.git
267
+ - 라이선스: MIT