@nice2dev/game-engine 1.0.2 → 1.0.4

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 (188) hide show
  1. package/dist/cjs/ai/BehaviorTree.js +1215 -0
  2. package/dist/cjs/ai/BehaviorTree.js.map +1 -0
  3. package/dist/cjs/ai/StateMachine.js +783 -0
  4. package/dist/cjs/ai/StateMachine.js.map +1 -0
  5. package/dist/cjs/editor/ShaderGraph.js +1616 -0
  6. package/dist/cjs/editor/ShaderGraph.js.map +1 -0
  7. package/dist/cjs/editor/TimelineEditor.js +819 -0
  8. package/dist/cjs/editor/TimelineEditor.js.map +1 -0
  9. package/dist/cjs/export/GodotExporter.js +1102 -0
  10. package/dist/cjs/export/GodotExporter.js.map +1 -0
  11. package/dist/cjs/export/PlatformExporter.js +236 -0
  12. package/dist/cjs/export/PlatformExporter.js.map +1 -0
  13. package/dist/cjs/export/ThreeJSExporter.js +1116 -0
  14. package/dist/cjs/export/ThreeJSExporter.js.map +1 -0
  15. package/dist/cjs/export/UnityExporter.js +1193 -0
  16. package/dist/cjs/export/UnityExporter.js.map +1 -0
  17. package/dist/cjs/export/WebExporter.js +1036 -0
  18. package/dist/cjs/export/WebExporter.js.map +1 -0
  19. package/dist/cjs/export/index.js +58 -0
  20. package/dist/cjs/export/index.js.map +1 -0
  21. package/dist/cjs/import/AsepriteImporter.js +761 -0
  22. package/dist/cjs/import/AsepriteImporter.js.map +1 -0
  23. package/dist/cjs/import/DragonBonesImporter.js +499 -0
  24. package/dist/cjs/import/DragonBonesImporter.js.map +1 -0
  25. package/dist/cjs/import/GameMakerImporter.js +559 -0
  26. package/dist/cjs/import/GameMakerImporter.js.map +1 -0
  27. package/dist/cjs/import/GodotSceneImporter.js +824 -0
  28. package/dist/cjs/import/GodotSceneImporter.js.map +1 -0
  29. package/dist/cjs/import/LDtkImporter.js +481 -0
  30. package/dist/cjs/import/LDtkImporter.js.map +1 -0
  31. package/dist/cjs/import/Live2DImporter.js +553 -0
  32. package/dist/cjs/import/Live2DImporter.js.map +1 -0
  33. package/dist/cjs/import/NdgFormat.js +499 -0
  34. package/dist/cjs/import/NdgFormat.js.map +1 -0
  35. package/dist/cjs/import/OgmoImporter.js +529 -0
  36. package/dist/cjs/import/OgmoImporter.js.map +1 -0
  37. package/dist/cjs/import/RPGMakerImporter.js +520 -0
  38. package/dist/cjs/import/RPGMakerImporter.js.map +1 -0
  39. package/dist/cjs/import/SceneImporter.js +449 -0
  40. package/dist/cjs/import/SceneImporter.js.map +1 -0
  41. package/dist/cjs/import/SpineImporter.js +583 -0
  42. package/dist/cjs/import/SpineImporter.js.map +1 -0
  43. package/dist/cjs/import/SpriterImporter.js +652 -0
  44. package/dist/cjs/import/SpriterImporter.js.map +1 -0
  45. package/dist/cjs/import/TiledMapImporter.js +859 -0
  46. package/dist/cjs/import/TiledMapImporter.js.map +1 -0
  47. package/dist/cjs/import/UnitySceneImporter.js +732 -0
  48. package/dist/cjs/import/UnitySceneImporter.js.map +1 -0
  49. package/dist/cjs/import/index.js +305 -0
  50. package/dist/cjs/import/index.js.map +1 -0
  51. package/dist/cjs/index.js +201 -0
  52. package/dist/cjs/index.js.map +1 -1
  53. package/dist/cjs/scripting/GraphToAST.js +567 -0
  54. package/dist/cjs/scripting/GraphToAST.js.map +1 -0
  55. package/dist/cjs/scripting/LanguageExporter.js +321 -0
  56. package/dist/cjs/scripting/LanguageExporter.js.map +1 -0
  57. package/dist/cjs/scripting/ScriptAST.js +67 -0
  58. package/dist/cjs/scripting/ScriptAST.js.map +1 -0
  59. package/dist/cjs/scripting/VisualScripting2.js +1140 -0
  60. package/dist/cjs/scripting/VisualScripting2.js.map +1 -0
  61. package/dist/cjs/scripting/exporters/CSharpExporter.js +503 -0
  62. package/dist/cjs/scripting/exporters/CSharpExporter.js.map +1 -0
  63. package/dist/cjs/scripting/exporters/GDScriptExporter.js +452 -0
  64. package/dist/cjs/scripting/exporters/GDScriptExporter.js.map +1 -0
  65. package/dist/cjs/scripting/exporters/LuaExporter.js +457 -0
  66. package/dist/cjs/scripting/exporters/LuaExporter.js.map +1 -0
  67. package/dist/cjs/scripting/exporters/PythonExporter.js +565 -0
  68. package/dist/cjs/scripting/exporters/PythonExporter.js.map +1 -0
  69. package/dist/cjs/scripting/exporters/RustExporter.js +525 -0
  70. package/dist/cjs/scripting/exporters/RustExporter.js.map +1 -0
  71. package/dist/cjs/scripting/exporters/TypeScriptExporter.js +570 -0
  72. package/dist/cjs/scripting/exporters/TypeScriptExporter.js.map +1 -0
  73. package/dist/cjs/systems/ParticleSystem2.js +1478 -0
  74. package/dist/cjs/systems/ParticleSystem2.js.map +1 -0
  75. package/dist/esm/ai/BehaviorTree.js +1186 -0
  76. package/dist/esm/ai/BehaviorTree.js.map +1 -0
  77. package/dist/esm/ai/StateMachine.js +767 -0
  78. package/dist/esm/ai/StateMachine.js.map +1 -0
  79. package/dist/esm/editor/ShaderGraph.js +1606 -0
  80. package/dist/esm/editor/ShaderGraph.js.map +1 -0
  81. package/dist/esm/editor/TimelineEditor.js +800 -0
  82. package/dist/esm/editor/TimelineEditor.js.map +1 -0
  83. package/dist/esm/export/GodotExporter.js +1100 -0
  84. package/dist/esm/export/GodotExporter.js.map +1 -0
  85. package/dist/esm/export/PlatformExporter.js +230 -0
  86. package/dist/esm/export/PlatformExporter.js.map +1 -0
  87. package/dist/esm/export/ThreeJSExporter.js +1114 -0
  88. package/dist/esm/export/ThreeJSExporter.js.map +1 -0
  89. package/dist/esm/export/UnityExporter.js +1191 -0
  90. package/dist/esm/export/UnityExporter.js.map +1 -0
  91. package/dist/esm/export/WebExporter.js +1033 -0
  92. package/dist/esm/export/WebExporter.js.map +1 -0
  93. package/dist/esm/export/index.js +44 -0
  94. package/dist/esm/export/index.js.map +1 -0
  95. package/dist/esm/import/AsepriteImporter.js +759 -0
  96. package/dist/esm/import/AsepriteImporter.js.map +1 -0
  97. package/dist/esm/import/DragonBonesImporter.js +496 -0
  98. package/dist/esm/import/DragonBonesImporter.js.map +1 -0
  99. package/dist/esm/import/GameMakerImporter.js +556 -0
  100. package/dist/esm/import/GameMakerImporter.js.map +1 -0
  101. package/dist/esm/import/GodotSceneImporter.js +822 -0
  102. package/dist/esm/import/GodotSceneImporter.js.map +1 -0
  103. package/dist/esm/import/LDtkImporter.js +479 -0
  104. package/dist/esm/import/LDtkImporter.js.map +1 -0
  105. package/dist/esm/import/Live2DImporter.js +550 -0
  106. package/dist/esm/import/Live2DImporter.js.map +1 -0
  107. package/dist/esm/import/NdgFormat.js +490 -0
  108. package/dist/esm/import/NdgFormat.js.map +1 -0
  109. package/dist/esm/import/OgmoImporter.js +526 -0
  110. package/dist/esm/import/OgmoImporter.js.map +1 -0
  111. package/dist/esm/import/RPGMakerImporter.js +517 -0
  112. package/dist/esm/import/RPGMakerImporter.js.map +1 -0
  113. package/dist/esm/import/SceneImporter.js +441 -0
  114. package/dist/esm/import/SceneImporter.js.map +1 -0
  115. package/dist/esm/import/SpineImporter.js +580 -0
  116. package/dist/esm/import/SpineImporter.js.map +1 -0
  117. package/dist/esm/import/SpriterImporter.js +649 -0
  118. package/dist/esm/import/SpriterImporter.js.map +1 -0
  119. package/dist/esm/import/TiledMapImporter.js +857 -0
  120. package/dist/esm/import/TiledMapImporter.js.map +1 -0
  121. package/dist/esm/import/UnitySceneImporter.js +730 -0
  122. package/dist/esm/import/UnitySceneImporter.js.map +1 -0
  123. package/dist/esm/import/index.js +279 -0
  124. package/dist/esm/import/index.js.map +1 -0
  125. package/dist/esm/index.js +36 -0
  126. package/dist/esm/index.js.map +1 -1
  127. package/dist/esm/scripting/GraphToAST.js +564 -0
  128. package/dist/esm/scripting/GraphToAST.js.map +1 -0
  129. package/dist/esm/scripting/LanguageExporter.js +311 -0
  130. package/dist/esm/scripting/LanguageExporter.js.map +1 -0
  131. package/dist/esm/scripting/ScriptAST.js +52 -0
  132. package/dist/esm/scripting/ScriptAST.js.map +1 -0
  133. package/dist/esm/scripting/VisualScripting2.js +1130 -0
  134. package/dist/esm/scripting/VisualScripting2.js.map +1 -0
  135. package/dist/esm/scripting/exporters/CSharpExporter.js +501 -0
  136. package/dist/esm/scripting/exporters/CSharpExporter.js.map +1 -0
  137. package/dist/esm/scripting/exporters/GDScriptExporter.js +450 -0
  138. package/dist/esm/scripting/exporters/GDScriptExporter.js.map +1 -0
  139. package/dist/esm/scripting/exporters/LuaExporter.js +455 -0
  140. package/dist/esm/scripting/exporters/LuaExporter.js.map +1 -0
  141. package/dist/esm/scripting/exporters/PythonExporter.js +563 -0
  142. package/dist/esm/scripting/exporters/PythonExporter.js.map +1 -0
  143. package/dist/esm/scripting/exporters/RustExporter.js +523 -0
  144. package/dist/esm/scripting/exporters/RustExporter.js.map +1 -0
  145. package/dist/esm/scripting/exporters/TypeScriptExporter.js +568 -0
  146. package/dist/esm/scripting/exporters/TypeScriptExporter.js.map +1 -0
  147. package/dist/esm/systems/ParticleSystem2.js +1471 -0
  148. package/dist/esm/systems/ParticleSystem2.js.map +1 -0
  149. package/dist/types/ai/BehaviorTree.d.ts +375 -0
  150. package/dist/types/ai/StateMachine.d.ts +296 -0
  151. package/dist/types/editor/ShaderGraph.d.ts +207 -0
  152. package/dist/types/editor/TimelineEditor.d.ts +393 -0
  153. package/dist/types/export/GodotExporter.d.ts +56 -0
  154. package/dist/types/export/PlatformExporter.d.ts +201 -0
  155. package/dist/types/export/ThreeJSExporter.d.ts +40 -0
  156. package/dist/types/export/UnityExporter.d.ts +69 -0
  157. package/dist/types/export/WebExporter.d.ts +58 -0
  158. package/dist/types/export/index.d.ts +19 -0
  159. package/dist/types/import/AsepriteImporter.d.ts +46 -0
  160. package/dist/types/import/DragonBonesImporter.d.ts +331 -0
  161. package/dist/types/import/GameMakerImporter.d.ts +375 -0
  162. package/dist/types/import/GodotSceneImporter.d.ts +34 -0
  163. package/dist/types/import/LDtkImporter.d.ts +177 -0
  164. package/dist/types/import/Live2DImporter.d.ts +237 -0
  165. package/dist/types/import/NdgFormat.d.ts +387 -0
  166. package/dist/types/import/OgmoImporter.d.ts +237 -0
  167. package/dist/types/import/RPGMakerImporter.d.ts +186 -0
  168. package/dist/types/import/SceneImporter.d.ts +276 -0
  169. package/dist/types/import/SpineImporter.d.ts +372 -0
  170. package/dist/types/import/SpriterImporter.d.ts +230 -0
  171. package/dist/types/import/TiledMapImporter.d.ts +57 -0
  172. package/dist/types/import/UnitySceneImporter.d.ts +87 -0
  173. package/dist/types/import/index.d.ts +59 -0
  174. package/dist/types/index.d.ts +29 -17
  175. package/dist/types/scripting/GraphToAST.d.ts +55 -0
  176. package/dist/types/scripting/LanguageExporter.d.ts +136 -0
  177. package/dist/types/scripting/ScriptAST.d.ts +312 -0
  178. package/dist/types/scripting/VisualScripting2.d.ts +353 -0
  179. package/dist/types/scripting/exporters/CSharpExporter.d.ts +44 -0
  180. package/dist/types/scripting/exporters/GDScriptExporter.d.ts +46 -0
  181. package/dist/types/scripting/exporters/LuaExporter.d.ts +46 -0
  182. package/dist/types/scripting/exporters/PythonExporter.d.ts +49 -0
  183. package/dist/types/scripting/exporters/RustExporter.d.ts +46 -0
  184. package/dist/types/scripting/exporters/TypeScriptExporter.d.ts +48 -0
  185. package/dist/types/scripting/exporters/index.d.ts +8 -0
  186. package/dist/types/scripting/index.d.ts +11 -0
  187. package/dist/types/systems/ParticleSystem2.d.ts +646 -0
  188. package/package.json +3 -3
@@ -0,0 +1,730 @@
1
+ import { SceneImporter, parseYAML } from './SceneImporter.js';
2
+
3
+ /**
4
+ * @file UnitySceneImporter.ts
5
+ * @description Import Unity scenes (.unity) and prefabs (.prefab)
6
+ * PRO-1.3: Scene Format Interoperability
7
+ *
8
+ * Parses Unity's YAML serialization format and converts to Nice2Dev entities.
9
+ * Supports:
10
+ * - Scene files (.unity)
11
+ * - Prefab files (.prefab)
12
+ * - Asset files (.asset)
13
+ * - Animation clips (.anim)
14
+ * - Materials (.mat)
15
+ */
16
+ // ============================================================
17
+ // Unity Class IDs
18
+ // ============================================================
19
+ const UNITY_CLASS_IDS = {
20
+ 1: 'GameObject',
21
+ 2: 'Component',
22
+ 3: 'LevelGameManager',
23
+ 4: 'Transform',
24
+ 20: 'Camera',
25
+ 21: 'Material',
26
+ 23: 'MeshRenderer',
27
+ 25: 'Renderer',
28
+ 28: 'Texture2D',
29
+ 33: 'MeshFilter',
30
+ 43: 'Mesh',
31
+ 47: 'RenderTexture',
32
+ 48: 'Shader',
33
+ 49: 'TextAsset',
34
+ 50: 'Rigidbody2D',
35
+ 54: 'Rigidbody',
36
+ 56: 'Cloth',
37
+ 58: 'CircleCollider2D',
38
+ 60: 'PolygonCollider2D',
39
+ 61: 'BoxCollider2D',
40
+ 64: 'MeshCollider',
41
+ 65: 'BoxCollider',
42
+ 66: 'CompositeCollider2D',
43
+ 68: 'EdgeCollider2D',
44
+ 70: 'CapsuleCollider2D',
45
+ 72: 'ComputeShader',
46
+ 74: 'AnimationClip',
47
+ 76: 'ConstantForce',
48
+ 78: 'WorldParticleCollider',
49
+ 81: 'AudioListener',
50
+ 82: 'AudioSource',
51
+ 83: 'AudioClip',
52
+ 84: 'RenderTexture',
53
+ 86: 'MovieTexture',
54
+ 89: 'Cubemap',
55
+ 90: 'Avatar',
56
+ 91: 'AnimatorController',
57
+ 92: 'GUILayer',
58
+ 93: 'RuntimeAnimatorController',
59
+ 94: 'ScriptMapper',
60
+ 95: 'Animator',
61
+ 96: 'TrailRenderer',
62
+ 102: 'TextMesh',
63
+ 104: 'RenderSettings',
64
+ 108: 'Light',
65
+ 109: 'CGProgram',
66
+ 110: 'BaseAnimationTrack',
67
+ 114: 'MonoBehaviour',
68
+ 115: 'MonoScript',
69
+ 118: 'Texture3D',
70
+ 119: 'Projector',
71
+ 120: 'LineRenderer',
72
+ 121: 'Flare',
73
+ 122: 'Halo',
74
+ 123: 'LensFlare',
75
+ 124: 'FlareLayer',
76
+ 125: 'HaloLayer',
77
+ 126: 'NavMeshAgent',
78
+ 128: 'Font',
79
+ 129: 'NavMeshSettings',
80
+ 130: 'ParticleSystem',
81
+ 131: 'ParticleSystemRenderer',
82
+ 132: 'ShaderVariantCollection',
83
+ 133: 'TilemapCollider2D',
84
+ 134: 'SpriteMask',
85
+ 135: 'CapsuleCollider',
86
+ 136: 'SkinnedMeshRenderer',
87
+ 137: 'FixedJoint',
88
+ 140: 'RaycastCollider',
89
+ 145: 'PhysicMaterial',
90
+ 146: 'SphereCollider',
91
+ 150: 'CharacterController',
92
+ 152: 'CharacterJoint',
93
+ 153: 'SpringJoint',
94
+ 154: 'WheelCollider',
95
+ 156: 'HingeJoint',
96
+ 157: 'ConfigurableJoint',
97
+ 158: 'Grid',
98
+ 160: 'Tilemap',
99
+ 161: 'TilemapRenderer',
100
+ 180: 'BoxCollider2D',
101
+ 181: 'CircleCollider2D',
102
+ 182: 'EdgeCollider2D',
103
+ 183: 'PolygonCollider2D',
104
+ 184: 'CapsuleCollider2D',
105
+ 185: 'CompositeCollider2D',
106
+ 191: 'Rigidbody2D',
107
+ 192: 'DistanceJoint2D',
108
+ 193: 'HingeJoint2D',
109
+ 194: 'SliderJoint2D',
110
+ 195: 'SpringJoint2D',
111
+ 196: 'WheelJoint2D',
112
+ 197: 'RelativeJoint2D',
113
+ 198: 'FixedJoint2D',
114
+ 199: 'FrictionJoint2D',
115
+ 200: 'TargetJoint2D',
116
+ 212: 'SpriteRenderer',
117
+ 213: 'Sprite',
118
+ 215: 'TerrainCollider',
119
+ 218: 'TerrainData',
120
+ 219: 'LightmapSettings',
121
+ 220: 'WebCamTexture',
122
+ 221: 'LODGroup',
123
+ 223: 'Canvas',
124
+ 224: 'RectTransform',
125
+ 225: 'CanvasGroup',
126
+ 226: 'BillboardRenderer',
127
+ 227: 'BillboardAsset',
128
+ 228: 'SpeedTreeWindAsset',
129
+ 229: 'AnchoredJoint2D',
130
+ 230: 'Joint2D',
131
+ 231: 'SpringJoint2D',
132
+ 232: 'DistanceJoint2D',
133
+ 233: 'HingeJoint2D',
134
+ 234: 'SliderJoint2D',
135
+ 235: 'WheelJoint2D',
136
+ 238: 'NavMeshData',
137
+ 240: 'AudioMixer',
138
+ 241: 'AudioMixerGroup',
139
+ 243: 'AudioMixerSnapshot',
140
+ 244: 'PhysicsUpdateBehaviour2D',
141
+ 245: 'ConstantForce2D',
142
+ 246: 'Effector2D',
143
+ 247: 'AreaEffector2D',
144
+ 248: 'PointEffector2D',
145
+ 249: 'PlatformEffector2D',
146
+ 250: 'SurfaceEffector2D',
147
+ 251: 'BuoyancyEffector2D',
148
+ 252: 'RelativeJoint2D',
149
+ 253: 'FixedJoint2D',
150
+ 254: 'FrictionJoint2D',
151
+ 255: 'TargetJoint2D',
152
+ 258: 'LightProbeProxyVolume',
153
+ 259: 'LightProbes',
154
+ 260: 'LightProbeGroup',
155
+ 271: 'VideoPlayer',
156
+ 290: 'SortingGroup',
157
+ 310: 'SpriteMask',
158
+ 330: 'VideoClip',
159
+ 331: 'TilemapCollider2D',
160
+ 363: 'OcclusionCullingData',
161
+ 387: 'SpringBoneJob',
162
+ 388: 'SpringBoneColliderSphere',
163
+ 391: 'SpringBoneColliderCapsule',
164
+ 392: 'SpringBoneColliderPlane',
165
+ 1001: 'Prefab',
166
+ };
167
+ // ============================================================
168
+ // Unity Scene Importer
169
+ // ============================================================
170
+ class UnitySceneImporter extends SceneImporter {
171
+ constructor() {
172
+ super('unity');
173
+ this.documents = new Map();
174
+ this.gameObjects = new Map();
175
+ this.transforms = new Map();
176
+ this.components = new Map();
177
+ this.prefabs = new Map();
178
+ }
179
+ async import(options) {
180
+ const startTime = Date.now();
181
+ this.options = options;
182
+ this.clearMessages();
183
+ this.documents.clear();
184
+ this.gameObjects.clear();
185
+ this.transforms.clear();
186
+ this.components.clear();
187
+ const errors = await this.validate(options.sourcePath);
188
+ if (errors.some((e) => e.fatal)) {
189
+ return {
190
+ ...this.createEmptyResult(),
191
+ errors: errors,
192
+ };
193
+ }
194
+ const scenes = [];
195
+ const assets = [];
196
+ try {
197
+ // Read and parse the Unity file(s)
198
+ const content = await this.readFile(options.sourcePath);
199
+ const parsed = this.parseUnityFile(content, options.sourcePath);
200
+ if (parsed) {
201
+ // Convert to Nice2Dev scene
202
+ const niceScene = this.convertParsedToNiceScene(parsed);
203
+ scenes.push(niceScene);
204
+ // Extract assets
205
+ const extractedAssets = this.extractAssets(parsed);
206
+ assets.push(...extractedAssets);
207
+ }
208
+ }
209
+ catch (error) {
210
+ this.addError('IMPORT_ERROR', `Failed to import: ${error}`, options.sourcePath, undefined, true);
211
+ }
212
+ return this.createResult(scenes, assets, startTime);
213
+ }
214
+ async parseFile(content, filePath) {
215
+ const stringContent = typeof content === 'string' ? content : new TextDecoder().decode(content);
216
+ return this.parseUnityFile(stringContent, filePath);
217
+ }
218
+ async validate(sourcePath) {
219
+ const errors = [];
220
+ if (!this.canHandle(sourcePath)) {
221
+ errors.push({
222
+ code: 'INVALID_FORMAT',
223
+ message: `File ${sourcePath} is not a valid Unity file`,
224
+ file: sourcePath,
225
+ fatal: true,
226
+ });
227
+ }
228
+ return errors;
229
+ }
230
+ // ----------------------------------------
231
+ // Unity Parsing
232
+ // ----------------------------------------
233
+ parseUnityFile(content, filePath) {
234
+ // Unity files are multi-document YAML with special header
235
+ const documents = this.parseUnityYAML(content);
236
+ // Store all documents for reference resolution
237
+ for (const doc of documents) {
238
+ this.documents.set(doc.fileID, doc);
239
+ // Categorize by class type
240
+ const className = UNITY_CLASS_IDS[doc.classID];
241
+ if (className === 'GameObject') {
242
+ const go = Object.values(doc.data)[0];
243
+ this.gameObjects.set(doc.fileID, go);
244
+ }
245
+ else if (className === 'Transform' || className === 'RectTransform') {
246
+ const transform = Object.values(doc.data)[0];
247
+ this.transforms.set(doc.fileID, { ...transform, fileID: doc.fileID });
248
+ }
249
+ else {
250
+ // Components
251
+ const component = Object.values(doc.data)[0];
252
+ this.components.set(doc.fileID, { ...component, classID: doc.classID, fileID: doc.fileID });
253
+ }
254
+ }
255
+ // Build scene structure
256
+ const scene = this.buildSceneFromDocuments(filePath);
257
+ return scene;
258
+ }
259
+ parseUnityYAML(content) {
260
+ const documents = [];
261
+ // Split by Unity document headers: --- !u!<classID> &<fileID>
262
+ const docRegex = /--- !u!(\d+) &(\d+)/g;
263
+ const matches = [...content.matchAll(docRegex)];
264
+ for (let i = 0; i < matches.length; i++) {
265
+ const match = matches[i];
266
+ const classID = parseInt(match[1], 10);
267
+ const fileID = match[2];
268
+ // Get content until next document or end
269
+ const startIndex = match.index + match[0].length;
270
+ const endIndex = i < matches.length - 1 ? matches[i + 1].index : content.length;
271
+ const docContent = content.substring(startIndex, endIndex).trim();
272
+ // Parse YAML content
273
+ try {
274
+ const data = parseYAML(docContent);
275
+ documents.push({ fileID, classID, data });
276
+ }
277
+ catch (error) {
278
+ this.addWarning('YAML_PARSE_ERROR', `Failed to parse YAML for document ${fileID}: ${error}`, undefined);
279
+ }
280
+ }
281
+ return documents;
282
+ }
283
+ buildSceneFromDocuments(filePath) {
284
+ const sceneName = filePath.substring(filePath.lastIndexOf('/') + 1).replace(/\.\w+$/, '');
285
+ // Find root transforms (no parent)
286
+ const rootTransforms = [];
287
+ for (const [fileID, transform] of this.transforms) {
288
+ if (!transform.m_Father || transform.m_Father.fileID === 0) {
289
+ rootTransforms.push(transform);
290
+ }
291
+ }
292
+ // Sort by root order
293
+ rootTransforms.sort((a, b) => (a.m_RootOrder || 0) - (b.m_RootOrder || 0));
294
+ // Build entity tree from root transforms
295
+ const entities = [];
296
+ for (const transform of rootTransforms) {
297
+ const entity = this.buildEntityFromTransform(transform);
298
+ if (entity) {
299
+ entities.push(entity);
300
+ }
301
+ }
302
+ // Extract scene settings
303
+ const sceneSettings = this.extractSceneSettings();
304
+ return {
305
+ name: sceneName,
306
+ width: 1920, // Unity doesn't have fixed scene size
307
+ height: 1080,
308
+ backgroundColor: '#3C3C3C', // Unity default
309
+ layers: [],
310
+ entities,
311
+ properties: sceneSettings,
312
+ };
313
+ }
314
+ buildEntityFromTransform(transform) {
315
+ // Find the GameObject that owns this transform
316
+ let gameObjectFileID = null;
317
+ for (const [compFileID, component] of this.components) {
318
+ if (compFileID === transform.fileID) {
319
+ const gameObjectRef = component
320
+ .m_GameObject;
321
+ if (gameObjectRef) {
322
+ gameObjectFileID = gameObjectRef.fileID.toString();
323
+ }
324
+ break;
325
+ }
326
+ }
327
+ // Also check transforms map for m_GameObject reference
328
+ for (const doc of this.documents.values()) {
329
+ if (doc.fileID === transform.fileID) {
330
+ const transformData = Object.values(doc.data)[0];
331
+ if (transformData === null || transformData === void 0 ? void 0 : transformData.m_GameObject) {
332
+ gameObjectFileID = transformData.m_GameObject.fileID.toString();
333
+ }
334
+ break;
335
+ }
336
+ }
337
+ const gameObject = gameObjectFileID ? this.gameObjects.get(gameObjectFileID) : null;
338
+ // Convert quaternion to euler angles (simplified)
339
+ const rotation = this.quaternionToEulerY(transform.m_LocalRotation.x, transform.m_LocalRotation.y, transform.m_LocalRotation.z, transform.m_LocalRotation.w);
340
+ // Get components attached to this GameObject
341
+ const components = this.getComponentsForGameObject(gameObjectFileID);
342
+ // Get children
343
+ const children = [];
344
+ if (transform.m_Children) {
345
+ for (const childRef of transform.m_Children) {
346
+ const childTransform = this.transforms.get(childRef.fileID.toString());
347
+ if (childTransform) {
348
+ const childEntity = this.buildEntityFromTransform(childTransform);
349
+ if (childEntity) {
350
+ children.push(childEntity);
351
+ }
352
+ }
353
+ }
354
+ }
355
+ return {
356
+ id: transform.fileID,
357
+ name: (gameObject === null || gameObject === void 0 ? void 0 : gameObject.m_Name) || 'GameObject',
358
+ type: (gameObject === null || gameObject === void 0 ? void 0 : gameObject.m_TagString) || 'Untagged',
359
+ x: transform.m_LocalPosition.x,
360
+ y: transform.m_LocalPosition.y,
361
+ width: 1,
362
+ height: 1,
363
+ rotation: rotation,
364
+ scaleX: transform.m_LocalScale.x,
365
+ scaleY: transform.m_LocalScale.y,
366
+ visible: (gameObject === null || gameObject === void 0 ? void 0 : gameObject.m_IsActive) !== 0,
367
+ components,
368
+ children,
369
+ properties: {
370
+ layer: (gameObject === null || gameObject === void 0 ? void 0 : gameObject.m_Layer) || 0,
371
+ tag: (gameObject === null || gameObject === void 0 ? void 0 : gameObject.m_TagString) || 'Untagged',
372
+ z: transform.m_LocalPosition.z,
373
+ scaleZ: transform.m_LocalScale.z,
374
+ staticFlags: (gameObject === null || gameObject === void 0 ? void 0 : gameObject.m_StaticEditorFlags) || 0,
375
+ },
376
+ };
377
+ }
378
+ getComponentsForGameObject(gameObjectFileID) {
379
+ if (!gameObjectFileID)
380
+ return [];
381
+ const result = [];
382
+ for (const [fileID, component] of this.components) {
383
+ const goRef = component.m_GameObject;
384
+ if (goRef && goRef.fileID.toString() === gameObjectFileID) {
385
+ const converted = this.convertUnityComponent(component);
386
+ if (converted) {
387
+ result.push(converted);
388
+ }
389
+ }
390
+ }
391
+ return result;
392
+ }
393
+ convertUnityComponent(component) {
394
+ const className = UNITY_CLASS_IDS[component.classID];
395
+ switch (className) {
396
+ case 'Transform':
397
+ case 'RectTransform':
398
+ return null; // Already handled
399
+ case 'SpriteRenderer':
400
+ return {
401
+ type: 'SpriteRenderer',
402
+ data: {
403
+ sprite: component.m_Sprite,
404
+ color: component.m_Color,
405
+ flipX: component.m_FlipX,
406
+ flipY: component.m_FlipY,
407
+ sortingLayerID: component.m_SortingLayerID,
408
+ sortingOrder: component.m_SortingOrder,
409
+ enabled: component.m_Enabled !== 0,
410
+ },
411
+ };
412
+ case 'Rigidbody2D':
413
+ return {
414
+ type: 'Rigidbody2D',
415
+ data: {
416
+ bodyType: component.m_BodyType,
417
+ simulated: component.m_Simulated,
418
+ useFullKinematicContacts: component
419
+ .m_UseFullKinematicContacts,
420
+ mass: component.m_Mass,
421
+ linearDrag: component.m_LinearDrag,
422
+ angularDrag: component.m_AngularDrag,
423
+ gravityScale: component.m_GravityScale,
424
+ constraints: component.m_Constraints,
425
+ enabled: component.m_Enabled !== 0,
426
+ },
427
+ };
428
+ case 'BoxCollider2D':
429
+ return {
430
+ type: 'BoxCollider2D',
431
+ data: {
432
+ isTrigger: component.m_IsTrigger,
433
+ size: component.m_Size,
434
+ offset: component.m_Offset,
435
+ enabled: component.m_Enabled !== 0,
436
+ },
437
+ };
438
+ case 'CircleCollider2D':
439
+ return {
440
+ type: 'CircleCollider2D',
441
+ data: {
442
+ isTrigger: component.m_IsTrigger,
443
+ radius: component.m_Radius,
444
+ offset: component.m_Offset,
445
+ enabled: component.m_Enabled !== 0,
446
+ },
447
+ };
448
+ case 'PolygonCollider2D':
449
+ return {
450
+ type: 'PolygonCollider2D',
451
+ data: {
452
+ isTrigger: component.m_IsTrigger,
453
+ points: component.m_Points,
454
+ offset: component.m_Offset,
455
+ enabled: component.m_Enabled !== 0,
456
+ },
457
+ };
458
+ case 'EdgeCollider2D':
459
+ return {
460
+ type: 'EdgeCollider2D',
461
+ data: {
462
+ isTrigger: component.m_IsTrigger,
463
+ points: component.m_Points,
464
+ offset: component.m_Offset,
465
+ enabled: component.m_Enabled !== 0,
466
+ },
467
+ };
468
+ case 'AudioSource':
469
+ return {
470
+ type: 'AudioSource',
471
+ data: {
472
+ clip: component.m_audioClip,
473
+ playOnAwake: component.m_PlayOnAwake,
474
+ loop: component.Loop,
475
+ volume: component.m_Volume,
476
+ pitch: component.m_Pitch,
477
+ spatialBlend: component.SpatialBlend,
478
+ enabled: component.m_Enabled !== 0,
479
+ },
480
+ };
481
+ case 'Animator':
482
+ return {
483
+ type: 'Animator',
484
+ data: {
485
+ controller: component.m_Controller,
486
+ avatar: component.m_Avatar,
487
+ applyRootMotion: component.m_ApplyRootMotion,
488
+ updateMode: component.m_UpdateMode,
489
+ cullingMode: component.m_CullingMode,
490
+ enabled: component.m_Enabled !== 0,
491
+ },
492
+ };
493
+ case 'Camera':
494
+ return {
495
+ type: 'Camera',
496
+ data: {
497
+ clearFlags: component.m_ClearFlags,
498
+ backgroundColor: component.m_BackGroundColor,
499
+ orthographic: component.m_Orthographic,
500
+ orthographicSize: component.m_OrthographicSize,
501
+ fieldOfView: component.m_FieldOfView,
502
+ nearClipPlane: component.m_NearClipPlane,
503
+ farClipPlane: component.m_FarClipPlane,
504
+ depth: component.m_Depth,
505
+ cullingMask: component.m_CullingMask,
506
+ enabled: component.m_Enabled !== 0,
507
+ },
508
+ };
509
+ case 'Light':
510
+ return {
511
+ type: 'Light',
512
+ data: {
513
+ type: component.m_Type,
514
+ color: component.m_Color,
515
+ intensity: component.m_Intensity,
516
+ range: component.m_Range,
517
+ spotAngle: component.m_SpotAngle,
518
+ shadows: component.m_Shadows,
519
+ enabled: component.m_Enabled !== 0,
520
+ },
521
+ };
522
+ case 'ParticleSystem':
523
+ return {
524
+ type: 'ParticleSystem',
525
+ data: {
526
+ duration: component.duration,
527
+ looping: component.looping,
528
+ startLifetime: component.startLifetime,
529
+ startSpeed: component.startSpeed,
530
+ startSize: component.startSize,
531
+ startColor: component.startColor,
532
+ gravityModifier: component.gravityModifier,
533
+ maxParticles: component.maxParticles,
534
+ enabled: component.m_Enabled !== 0,
535
+ },
536
+ };
537
+ case 'Canvas':
538
+ return {
539
+ type: 'Canvas',
540
+ data: {
541
+ renderMode: component.m_RenderMode,
542
+ sortingOrder: component.m_SortingOrder,
543
+ targetDisplay: component.m_TargetDisplay,
544
+ pixelPerfect: component.m_PixelPerfect,
545
+ enabled: component.m_Enabled !== 0,
546
+ },
547
+ };
548
+ case 'Tilemap':
549
+ return {
550
+ type: 'Tilemap',
551
+ data: {
552
+ size: component.m_Size,
553
+ cellSize: component.m_CellSize,
554
+ cellGap: component.m_CellGap,
555
+ cellLayout: component.m_CellLayout,
556
+ tileAnchor: component.m_TileAnchor,
557
+ orientation: component.m_Orientation,
558
+ enabled: component.m_Enabled !== 0,
559
+ },
560
+ };
561
+ case 'Grid':
562
+ return {
563
+ type: 'Grid',
564
+ data: {
565
+ cellSize: component.m_CellSize,
566
+ cellGap: component.m_CellGap,
567
+ cellLayout: component.m_CellLayout,
568
+ cellSwizzle: component.m_CellSwizzle,
569
+ enabled: component.m_Enabled !== 0,
570
+ },
571
+ };
572
+ case 'MonoBehaviour':
573
+ return {
574
+ type: 'Script',
575
+ data: {
576
+ scriptGuid: component.m_Script,
577
+ properties: { ...component },
578
+ enabled: component.m_Enabled !== 0,
579
+ },
580
+ };
581
+ default:
582
+ // Generic component
583
+ return {
584
+ type: className || 'Unknown',
585
+ data: {
586
+ classID: component.classID,
587
+ properties: { ...component },
588
+ enabled: component.m_Enabled !== 0,
589
+ },
590
+ };
591
+ }
592
+ }
593
+ extractSceneSettings() {
594
+ const settings = {};
595
+ // Find physics settings
596
+ for (const doc of this.documents.values()) {
597
+ const data = Object.values(doc.data)[0];
598
+ if (data === null || data === void 0 ? void 0 : data.m_Physics2DSettings) {
599
+ settings.gravity = {
600
+ x: data.m_Physics2DSettings.m_Gravity.x,
601
+ y: data.m_Physics2DSettings.m_Gravity.y,
602
+ };
603
+ }
604
+ if (data === null || data === void 0 ? void 0 : data.m_TagManager) {
605
+ settings.tags = data.m_TagManager.tags;
606
+ settings.layers = data.m_TagManager.layers;
607
+ settings.sortingLayers = data.m_TagManager.sortingLayers;
608
+ }
609
+ }
610
+ return settings;
611
+ }
612
+ extractAssets(scene) {
613
+ const assets = [];
614
+ // Extract sprite references
615
+ const spriteRefs = this.extractSpriteReferences();
616
+ for (const ref of spriteRefs) {
617
+ assets.push({
618
+ id: this.generateId(),
619
+ name: ref.name,
620
+ type: 'texture',
621
+ path: ref.path,
622
+ data: { guid: ref.guid },
623
+ });
624
+ }
625
+ // Extract audio references
626
+ const audioRefs = this.extractAudioReferences();
627
+ for (const ref of audioRefs) {
628
+ assets.push({
629
+ id: this.generateId(),
630
+ name: ref.name,
631
+ type: 'audio',
632
+ path: ref.path,
633
+ data: { guid: ref.guid },
634
+ });
635
+ }
636
+ // Extract animation references
637
+ const animRefs = this.extractAnimationReferences();
638
+ for (const ref of animRefs) {
639
+ assets.push({
640
+ id: this.generateId(),
641
+ name: ref.name,
642
+ type: 'animation',
643
+ path: ref.path,
644
+ data: { guid: ref.guid },
645
+ });
646
+ }
647
+ return assets;
648
+ }
649
+ extractSpriteReferences() {
650
+ const refs = [];
651
+ for (const component of this.components.values()) {
652
+ const sprite = component.m_Sprite;
653
+ if (sprite === null || sprite === void 0 ? void 0 : sprite.guid) {
654
+ refs.push({
655
+ name: `sprite_${sprite.guid.substring(0, 8)}`,
656
+ path: `Assets/Sprites/${sprite.guid}`,
657
+ guid: sprite.guid,
658
+ });
659
+ }
660
+ }
661
+ return refs;
662
+ }
663
+ extractAudioReferences() {
664
+ const refs = [];
665
+ for (const component of this.components.values()) {
666
+ const clip = component.m_audioClip;
667
+ if (clip === null || clip === void 0 ? void 0 : clip.guid) {
668
+ refs.push({
669
+ name: `audio_${clip.guid.substring(0, 8)}`,
670
+ path: `Assets/Audio/${clip.guid}`,
671
+ guid: clip.guid,
672
+ });
673
+ }
674
+ }
675
+ return refs;
676
+ }
677
+ extractAnimationReferences() {
678
+ const refs = [];
679
+ for (const component of this.components.values()) {
680
+ const controller = component.m_Controller;
681
+ if (controller === null || controller === void 0 ? void 0 : controller.guid) {
682
+ refs.push({
683
+ name: `animation_${controller.guid.substring(0, 8)}`,
684
+ path: `Assets/Animations/${controller.guid}`,
685
+ guid: controller.guid,
686
+ });
687
+ }
688
+ }
689
+ return refs;
690
+ }
691
+ // ----------------------------------------
692
+ // Helper Methods
693
+ // ----------------------------------------
694
+ quaternionToEulerY(x, y, z, w) {
695
+ // Simplified conversion - returns Y rotation (most common for 2D)
696
+ const sinr_cosp = 2 * (w * z + x * y);
697
+ const cosr_cosp = 1 - 2 * (y * y + z * z);
698
+ return Math.atan2(sinr_cosp, cosr_cosp) * (180 / Math.PI);
699
+ }
700
+ async readFile(path) {
701
+ var _a;
702
+ // In browser environment, this would use fetch or FileReader
703
+ // In Node.js, this would use fs.readFileSync
704
+ if (typeof globalThis.process !== 'undefined' && ((_a = globalThis.process.versions) === null || _a === void 0 ? void 0 : _a.node)) {
705
+ const fs = await import('fs');
706
+ return fs.readFileSync(path, 'utf-8');
707
+ }
708
+ else if (typeof fetch !== 'undefined') {
709
+ const response = await fetch(path);
710
+ return response.text();
711
+ }
712
+ throw new Error('Unable to read file in current environment');
713
+ }
714
+ /** Convert Unity RectTransform to Nice2Dev format */
715
+ convertRectTransform(transform) {
716
+ return {
717
+ type: 'RectTransform',
718
+ data: {
719
+ anchorMin: transform.m_AnchorMin || { x: 0.5, y: 0.5 },
720
+ anchorMax: transform.m_AnchorMax || { x: 0.5, y: 0.5 },
721
+ anchoredPosition: transform.m_AnchoredPosition || { x: 0, y: 0 },
722
+ sizeDelta: transform.m_SizeDelta || { x: 100, y: 100 },
723
+ pivot: transform.m_Pivot || { x: 0.5, y: 0.5 },
724
+ },
725
+ };
726
+ }
727
+ }
728
+
729
+ export { UnitySceneImporter };
730
+ //# sourceMappingURL=UnitySceneImporter.js.map