@nice2dev/game-engine 1.0.2 → 1.0.3

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