@kkarum/framework 2.3.17

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 (171) hide show
  1. package/Framework.ts +337 -0
  2. package/Framework.ts.meta +10 -0
  3. package/FrameworkBase.ts +207 -0
  4. package/FrameworkBase.ts.meta +10 -0
  5. package/FrameworkInitialize.ts +79 -0
  6. package/FrameworkInitialize.ts.meta +10 -0
  7. package/README.md +93 -0
  8. package/README.md.meta +6 -0
  9. package/animation/FWAnimation.ts +13 -0
  10. package/animation/FWAnimation.ts.meta +10 -0
  11. package/animation/FWSkeleton.ts +174 -0
  12. package/animation/FWSkeleton.ts.meta +10 -0
  13. package/animation/FWTween.ts +60 -0
  14. package/animation/FWTween.ts.meta +10 -0
  15. package/animation.meta +13 -0
  16. package/component/FWVirtuaScrollViewComponent.ts +56 -0
  17. package/component/FWVirtuaScrollViewComponent.ts.meta +10 -0
  18. package/component/FWVirtualViewComponent.ts +2212 -0
  19. package/component/FWVirtualViewComponent.ts.meta +10 -0
  20. package/component.meta +13 -0
  21. package/config/FWAssetConfig.ts +7 -0
  22. package/config/FWAssetConfig.ts.meta +10 -0
  23. package/config/FWSystemConfig.ts +29 -0
  24. package/config/FWSystemConfig.ts.meta +10 -0
  25. package/config.meta +13 -0
  26. package/controller/FWLayerController.ts +178 -0
  27. package/controller/FWLayerController.ts.meta +10 -0
  28. package/controller.meta +13 -0
  29. package/data/FWData.ts +6 -0
  30. package/data/FWData.ts.meta +10 -0
  31. package/data.meta +13 -0
  32. package/define/FWEventDefine.ts +28 -0
  33. package/define/FWEventDefine.ts.meta +10 -0
  34. package/define/FWSystemDefine.ts +154 -0
  35. package/define/FWSystemDefine.ts.meta +10 -0
  36. package/define.meta +13 -0
  37. package/entry/FWEntry.ts +219 -0
  38. package/entry/FWEntry.ts.meta +10 -0
  39. package/entry.meta +13 -0
  40. package/expand/FWCocosExpand.ts +73 -0
  41. package/expand/FWCocosExpand.ts.meta +10 -0
  42. package/expand/FWDecorator.ts +366 -0
  43. package/expand/FWDecorator.ts.meta +10 -0
  44. package/expand/FWNodeExpand.ts +147 -0
  45. package/expand/FWNodeExpand.ts.meta +10 -0
  46. package/expand/FWRollingViewNesting.ts +195 -0
  47. package/expand/FWRollingViewNesting.ts.meta +10 -0
  48. package/expand/FWTweenExpand.ts +44 -0
  49. package/expand/FWTweenExpand.ts.meta +10 -0
  50. package/expand.meta +13 -0
  51. package/item/FWVirtualListItem.ts +141 -0
  52. package/item/FWVirtualListItem.ts.meta +10 -0
  53. package/item.meta +13 -0
  54. package/language/FWLanguage.ts +71 -0
  55. package/language/FWLanguage.ts.meta +10 -0
  56. package/language/FWLanguageLabelLocalize.ts +144 -0
  57. package/language/FWLanguageLabelLocalize.ts.meta +10 -0
  58. package/language/FWLanguageSkeletonLocalize.ts +106 -0
  59. package/language/FWLanguageSkeletonLocalize.ts.meta +10 -0
  60. package/language/FWLanguageSpriteLocalize.ts +81 -0
  61. package/language/FWLanguageSpriteLocalize.ts.meta +10 -0
  62. package/language.meta +13 -0
  63. package/layer/FWLayer.ts +14 -0
  64. package/layer/FWLayer.ts.meta +10 -0
  65. package/layer.meta +13 -0
  66. package/log/FWLog.ts +135 -0
  67. package/log/FWLog.ts.meta +10 -0
  68. package/log.meta +13 -0
  69. package/logic/FWLogic.ts +6 -0
  70. package/logic/FWLogic.ts.meta +10 -0
  71. package/logic.meta +13 -0
  72. package/machine/FWAnimationMachine.ts +28 -0
  73. package/machine/FWAnimationMachine.ts.meta +10 -0
  74. package/machine/FWStateMachine.ts +74 -0
  75. package/machine/FWStateMachine.ts.meta +10 -0
  76. package/machine.meta +13 -0
  77. package/manager/FWAnimationManager.ts +89 -0
  78. package/manager/FWAnimationManager.ts.meta +10 -0
  79. package/manager/FWAssetManager.ts +451 -0
  80. package/manager/FWAssetManager.ts.meta +10 -0
  81. package/manager/FWAudioManager.ts +339 -0
  82. package/manager/FWAudioManager.ts.meta +10 -0
  83. package/manager/FWBundleManager.ts +97 -0
  84. package/manager/FWBundleManager.ts.meta +10 -0
  85. package/manager/FWComponentManager.ts +24 -0
  86. package/manager/FWComponentManager.ts.meta +10 -0
  87. package/manager/FWEngineManager.ts +74 -0
  88. package/manager/FWEngineManager.ts.meta +10 -0
  89. package/manager/FWEventManager.ts +361 -0
  90. package/manager/FWEventManager.ts.meta +10 -0
  91. package/manager/FWHotUpdateManager.ts +344 -0
  92. package/manager/FWHotUpdateManager.ts.meta +10 -0
  93. package/manager/FWLanguageManager.ts +114 -0
  94. package/manager/FWLanguageManager.ts.meta +10 -0
  95. package/manager/FWLayerManager.ts +862 -0
  96. package/manager/FWLayerManager.ts.meta +10 -0
  97. package/manager/FWManager.ts +9 -0
  98. package/manager/FWManager.ts.meta +10 -0
  99. package/manager/FWObjectManager.ts +161 -0
  100. package/manager/FWObjectManager.ts.meta +10 -0
  101. package/manager/FWPerformanceManager.ts +198 -0
  102. package/manager/FWPerformanceManager.ts.meta +10 -0
  103. package/manager/FWPromiseManager.ts +504 -0
  104. package/manager/FWPromiseManager.ts.meta +10 -0
  105. package/manager/FWResManager.ts +299 -0
  106. package/manager/FWResManager.ts.meta +10 -0
  107. package/manager/FWSocketManager.ts +93 -0
  108. package/manager/FWSocketManager.ts.meta +10 -0
  109. package/manager/FWStateManager.ts +100 -0
  110. package/manager/FWStateManager.ts.meta +10 -0
  111. package/manager/FWTaskManager.ts +41 -0
  112. package/manager/FWTaskManager.ts.meta +10 -0
  113. package/manager/FWTimeManager.ts +442 -0
  114. package/manager/FWTimeManager.ts.meta +10 -0
  115. package/manager/FWUiManager.ts +217 -0
  116. package/manager/FWUiManager.ts.meta +10 -0
  117. package/manager.meta +13 -0
  118. package/package.json +11 -0
  119. package/package.json.meta +6 -0
  120. package/registry/FWRegistry.ts +62 -0
  121. package/registry/FWRegistry.ts.meta +10 -0
  122. package/registry.meta +13 -0
  123. package/render/FWRenderAssembler.ts +620 -0
  124. package/render/FWRenderAssembler.ts.meta +10 -0
  125. package/render.meta +13 -0
  126. package/scene/FWScene.ts +23 -0
  127. package/scene/FWScene.ts.meta +10 -0
  128. package/scene.meta +13 -0
  129. package/service/FWService.ts +11 -0
  130. package/service/FWService.ts.meta +10 -0
  131. package/service/http/FWHttp.ts +103 -0
  132. package/service/http/FWHttp.ts.meta +10 -0
  133. package/service/http.meta +13 -0
  134. package/service/socket/FWSocket.ts +367 -0
  135. package/service/socket/FWSocket.ts.meta +10 -0
  136. package/service/socket/FWSocketHandle.ts +16 -0
  137. package/service/socket/FWSocketHandle.ts.meta +10 -0
  138. package/service/socket/FWSocketSender.ts +14 -0
  139. package/service/socket/FWSocketSender.ts.meta +10 -0
  140. package/service/socket/mock/FWSocketMock.ts +202 -0
  141. package/service/socket/mock/FWSocketMock.ts.meta +10 -0
  142. package/service/socket/mock.meta +13 -0
  143. package/service/socket.meta +13 -0
  144. package/service.meta +13 -0
  145. package/state/FWState.ts +8 -0
  146. package/state/FWState.ts.meta +10 -0
  147. package/state.meta +13 -0
  148. package/types/Creator.d.ts +121 -0
  149. package/types/Creator.d.ts.meta +6 -0
  150. package/types/FW.d.ts +3016 -0
  151. package/types/FW.d.ts.meta +6 -0
  152. package/types/Global.d.ts +22 -0
  153. package/types/Global.d.ts.meta +10 -0
  154. package/types.meta +13 -0
  155. package/utils/FWLodash.ts +105 -0
  156. package/utils/FWLodash.ts.meta +10 -0
  157. package/utils/FWMask.ts +222 -0
  158. package/utils/FWMask.ts.meta +10 -0
  159. package/utils/FWObject.ts +27 -0
  160. package/utils/FWObject.ts.meta +10 -0
  161. package/utils/FWObjectPool.ts +177 -0
  162. package/utils/FWObjectPool.ts.meta +10 -0
  163. package/utils/FWQueue.ts +55 -0
  164. package/utils/FWQueue.ts.meta +10 -0
  165. package/utils/FWResLoader.ts +139 -0
  166. package/utils/FWResLoader.ts.meta +10 -0
  167. package/utils/FWTask.ts +227 -0
  168. package/utils/FWTask.ts.meta +10 -0
  169. package/utils/FWUtils.ts +15 -0
  170. package/utils/FWUtils.ts.meta +10 -0
  171. package/utils.meta +13 -0
@@ -0,0 +1,862 @@
1
+ import { FWManager } from './FWManager';
2
+ import { FWQueue } from '../utils/FWQueue';
3
+ import { FrameworkBase } from '../FrameworkBase';
4
+ import { PerformanceMonitor } from '../expand/FWDecorator';
5
+
6
+ const ADD_EXTERNAL_REFERENCE: string = 'addExternalReference';
7
+
8
+ export class FWLayerManager extends FWManager implements FW.LayerManager {
9
+ private resourceManager: FWLayerResourceManager;
10
+ private dataManager: FWLayerDataManager;
11
+ private createManager: FWLayerCreateManager;
12
+ private stackManager: FWLayerStackManager;
13
+ private stateManager: FWLayerStateManager;
14
+ private queueManager: FWLayerQueueManager;
15
+ private openManager: FWLayerOpenManager;
16
+ private debug: boolean;
17
+
18
+ public initialize(): void {
19
+ this.debug = false;
20
+ this.resourceManager = new FWLayerResourceManager();
21
+ this.dataManager = new FWLayerDataManager();
22
+ this.createManager = new FWLayerCreateManager();
23
+ this.stackManager = new FWLayerStackManager();
24
+ this.queueManager = new FWLayerQueueManager();
25
+ this.stateManager = new FWLayerStateManager();
26
+ this.openManager = new FWLayerOpenManager(
27
+ this.dataManager,
28
+ this.resourceManager,
29
+ this.createManager,
30
+ this.stackManager,
31
+ this.queueManager,
32
+ this.stateManager,
33
+ );
34
+ }
35
+
36
+ openDebug() {
37
+ this.debug = true;
38
+ }
39
+
40
+ isDebug() {
41
+ return this.debug;
42
+ }
43
+ /**
44
+ * 异步打开Layer
45
+ */
46
+ @PerformanceMonitor('openAsync')
47
+ async openAsync<Ctr extends FW.LayerController = FW.LayerController>(
48
+ data: FW.LayerOpenArgs,
49
+ ): Promise<Ctr> {
50
+ if (this.debug) {
51
+ FW.Log.error(`异步打开Layer ->`, cc.js.getClassName(data.type));
52
+ }
53
+ return this.openManager.openLayerAsync(data) as Promise<Ctr>;
54
+ }
55
+
56
+ /**
57
+ * 同步打开
58
+ */
59
+ openSync<Ctr extends FW.LayerController = FW.LayerController>(data: FW.LayerOpenArgs): Ctr {
60
+ if (this.debug) {
61
+ FW.Log.error(`同步打开Layer ->`, cc.js.getClassName(data.type));
62
+ }
63
+ return this.openManager.openLayerSync(data) as Ctr;
64
+ }
65
+
66
+ /**
67
+ * 显示layer并恢复所有节点事件
68
+ */
69
+ displayLayer<Ctr extends FW.LayerController = FW.LayerController>(ctr: Ctr): Ctr {
70
+ const layerData = ctr.layerData;
71
+
72
+ if (!this.dataManager.getLayerMap().has(ctr.layerData.controllerConstructor)) {
73
+ FW.Log.warn(`display layer failed,layer name : ${layerData.layerName}`);
74
+ return;
75
+ }
76
+ /** 非常驻layer不允许操作透明度显示 */
77
+ if (ctr.layerType != FW.SystemDefine.FWLayerType.PERMANENT) return;
78
+
79
+ const node = ctr.layer.node;
80
+ node.opacity = 255;
81
+ node.resumeSystemEvents(true);
82
+
83
+ FW.Entry.evtMgr.targetResume(ctr);
84
+ FW.Entry.timeMgr.resumeSchedule(ctr);
85
+
86
+ return ctr;
87
+ }
88
+
89
+ /**
90
+ * 隐藏layer并隐藏所有节点事件
91
+ */
92
+ hideLayer<Ctr extends FW.LayerController = FW.LayerController>(ctr: Ctr): Ctr {
93
+ const layerData = ctr.layerData;
94
+ if (!this.dataManager.getLayerMap().has(ctr.layerData.controllerConstructor)) {
95
+ FW.Log.warn(`hide layer failed,layer name : ${layerData.layerName}`);
96
+ return;
97
+ }
98
+
99
+ /** 非常驻layer不允许操作透明度 */
100
+ if (ctr.layerType != FW.SystemDefine.FWLayerType.PERMANENT) return;
101
+
102
+ const node = ctr.layer.node;
103
+ node.opacity = 0;
104
+ node.pauseSystemEvents(true);
105
+ FW.Entry.evtMgr.targetPause(ctr);
106
+ FW.Entry.timeMgr.pauseSchedule(ctr);
107
+
108
+ return ctr;
109
+ }
110
+
111
+ /**
112
+ * 通过layer名字关闭
113
+ */
114
+ closeFromLayerName(name: string | string[]): void {
115
+ this.dataManager.getLayerMap().forEach((v) => {
116
+ if (Array.isArray(name)) {
117
+ name.forEach((n) => {
118
+ if (n === v.layerName) {
119
+ this.close(v.controller);
120
+ }
121
+ });
122
+ } else {
123
+ if (v.layerName == name) {
124
+ this.close(v.controller);
125
+ }
126
+ }
127
+ });
128
+ }
129
+
130
+ /**
131
+ * 从栈关闭
132
+ */
133
+ closeFromStack(count?: number) {
134
+ count = count ? count : 1;
135
+ for (let i = 0; i < count; i++) {
136
+ let layerData = this.stackManager.pop();
137
+ let ctr = layerData.controller;
138
+ if (!this.dataManager.getLayerMap().has(layerData.controllerConstructor)) {
139
+ return;
140
+ }
141
+ if (cc.isValid(ctr.layer?.node)) {
142
+ ctr.layer.destroy?.();
143
+ if (ctr.autoRelease) {
144
+ FW.Entry.resMgr.releaseAsset(ctr.layerData.layerAssetProperty);
145
+ }
146
+ this.dataManager.notifyExternalRefUpdates(ctr.layerData);
147
+ }
148
+ this.dataManager.removeFromMap(layerData.controllerConstructor);
149
+ }
150
+ }
151
+ /**
152
+ * 移除指定Layer所有子Layer
153
+ * @param layer
154
+ * @returns
155
+ */
156
+ async removeAllChildren(node: cc.Node) {
157
+ if (!cc.isValid(node)) return;
158
+ const layers = node.getComponentsInChildren(FW.Layer);
159
+ layers.forEach((v) => {
160
+ if (cc.isValid(v?.node)) {
161
+ v?.ctr?.close();
162
+ }
163
+ });
164
+ }
165
+
166
+ /**
167
+ * 关闭layer
168
+ */
169
+ async close<Ctr extends FW.LayerController = FW.LayerController>(ctr: Ctr): Promise<Ctr> {
170
+ if (!ctr) return;
171
+
172
+ return FW.Entry.promiseMgr.execute(async (resolve, reject) => {
173
+ let layerData = ctr.layerData;
174
+
175
+ if (this.debug) {
176
+ FW.Log.error(`${cc.js.getClassName(layerData?.controllerConstructor)} ->关闭Layer`);
177
+ }
178
+
179
+ if (cc.isValid(ctr.layer?.node)) {
180
+ this.stateManager.setState(
181
+ ctr.layerData.controllerConstructor,
182
+ FW.SystemDefine.FWLayerState.CLOSING,
183
+ );
184
+
185
+ await ctr.onClose?.();
186
+
187
+ this.stateManager.setState(
188
+ ctr.layerData.controllerConstructor,
189
+ FW.SystemDefine.FWLayerState.CLOSED,
190
+ );
191
+
192
+ ctr.destroy?.();
193
+
194
+ if (ctr.autoRelease) {
195
+ FW.Entry.resMgr.releaseAsset(ctr.layerData.layerAssetProperty);
196
+ }
197
+ this.dataManager.notifyExternalRefUpdates(ctr.layerData);
198
+ }
199
+ this.stateManager.removeState(layerData?.controllerConstructor);
200
+ this.dataManager.removeFromMap(layerData?.controllerConstructor);
201
+ this.dataManager.removeFromRegistry(ctr.layerData?.controllerConstructor);
202
+
203
+ const index = this.stackManager.getStack().findIndex((v) => {
204
+ return v.controller == ctr;
205
+ });
206
+ if (index > -1) {
207
+ this.stackManager.getStack().splice(index, 1);
208
+ }
209
+
210
+ /** 如果队列中还有等待打开的layer */
211
+ if (!this.queueManager.isEmpty()) {
212
+ const nextLayerData = this.queueManager.getNextLayer();
213
+ /** 先尝试同步打开 */
214
+ const nextLayer = this.openSync({
215
+ parent: nextLayerData.layerParent,
216
+ position: nextLayerData.layerPosition,
217
+ type: nextLayerData.controllerConstructor,
218
+ });
219
+ /** 如果同步打开失败,再次尝试异步打开(可能由于资源所在bundle并未提前加载) */
220
+ if (!nextLayer) {
221
+ resolve(
222
+ this.openAsync({
223
+ parent: nextLayerData.layerParent,
224
+ position: nextLayerData.layerPosition,
225
+ type: nextLayerData.controllerConstructor,
226
+ }),
227
+ );
228
+ } else {
229
+ resolve(nextLayer as Ctr);
230
+ }
231
+ } else {
232
+ resolve(undefined);
233
+ }
234
+ }).promise;
235
+ }
236
+
237
+ getLayerMap(): Map<new () => FW.LayerController, FWLayerData> {
238
+ return this.dataManager.getLayerMap();
239
+ }
240
+
241
+ public clear() {
242
+ this.dataManager.getLayerMap().forEach((v) => this.close(v.controller));
243
+ this.queueManager.clear();
244
+ this.stackManager.clear();
245
+ this.stateManager.clear();
246
+ this.dataManager.clear();
247
+ }
248
+
249
+ public onDestroy(): void {
250
+ this.clear();
251
+ }
252
+ }
253
+
254
+ export class FWLayerData<T extends FW.LayerController = FW.LayerController>
255
+ implements FW.LayerData
256
+ {
257
+ controllerConstructor: new () => T;
258
+ uuid: string;
259
+ layer: FW.Layer;
260
+ layerName: string;
261
+ layerAssetProperty: FW.AssetProperty;
262
+ layerRenderOrder: FW.SystemDefine.FWLayerRenderOrder;
263
+ layerType: FW.SystemDefine.FWLayerType;
264
+ layerParent?: cc.Node;
265
+ layerPosition?: FW.Vec3;
266
+ controllerName: string;
267
+ controller: FW.LayerController;
268
+ loaded: boolean;
269
+ controllerProxy: FW.LayerController;
270
+ externalReference?: Set<(ref: FW.LayerController | null) => void>;
271
+ }
272
+
273
+ class FWLayerDataManager {
274
+ private layerMap: Map<new () => FW.LayerController, FWLayerData> = new Map();
275
+ private layerRegistry: Set<new () => FW.LayerController> = new Set();
276
+ private layerControllerFactory: FWLayerControllerFactory = new FWLayerControllerFactory();
277
+ /**
278
+ * 获取已存在的Layer
279
+ */
280
+ getExistingLayer<Ctr extends FW.LayerController = FW.LayerController>(
281
+ type: new () => Ctr,
282
+ ): Ctr | undefined {
283
+ for (const [key, value] of this.layerMap) {
284
+ if (value.controllerConstructor === type) {
285
+ return value.controllerProxy as Ctr;
286
+ }
287
+ }
288
+ return undefined;
289
+ }
290
+
291
+ /**
292
+ * 从类型创建Layer数据
293
+ */
294
+ createLayerData<Ctr extends FW.LayerController = FW.LayerController>(
295
+ type: new () => Ctr,
296
+ ): FW.LayerData {
297
+ const ctr = this.layerControllerFactory.createController(type);
298
+ const ctrName = cc.js.getClassName(ctr);
299
+ const layerData = this.generationData(ctr);
300
+
301
+ layerData.controllerConstructor = type;
302
+ layerData.controller = ctr;
303
+ layerData.controllerName = ctrName;
304
+
305
+ return layerData;
306
+ }
307
+
308
+ addLayerData(ctr: new () => FW.LayerController, layerData: FW.LayerData) {
309
+ if (!this.layerMap.has(ctr)) {
310
+ this.layerMap.set(ctr, layerData);
311
+ }
312
+ }
313
+
314
+ /**
315
+ * 生成数据
316
+ */
317
+ private generationData(ctr: FW.LayerController): FWLayerData {
318
+ const layerData = new FWLayerData();
319
+ const layerType = ctr.layerType;
320
+
321
+ layerData.layerRenderOrder = ctr.renderOrder;
322
+ layerData.layerAssetProperty = ctr.layerAssetProperty;
323
+ layerData.layerType = layerType;
324
+ layerData.controller = ctr;
325
+ layerData.loaded = false;
326
+ layerData.externalReference = new Set();
327
+
328
+ return layerData;
329
+ }
330
+
331
+ /**
332
+ * 状态表注册
333
+ */
334
+ addRegistry(type: new () => FW.LayerController): boolean {
335
+ if (this.layerRegistry.has(type)) {
336
+ return true;
337
+ }
338
+ this.layerRegistry.add(type);
339
+ return false;
340
+ }
341
+
342
+ /**
343
+ * 获取已存在的代理
344
+ */
345
+ getExistingProxy<Ctr extends FW.LayerController = FW.LayerController>(
346
+ type: new () => Ctr,
347
+ ): Ctr | undefined {
348
+ return this.layerMap.get(type)?.controllerProxy as Ctr;
349
+ }
350
+
351
+ /**
352
+ * 设置Layer数据
353
+ */
354
+ setupLayerData(
355
+ layerData: FWLayerData,
356
+ res: { asset: cc.Prefab; uuid: string },
357
+ layer: FW.Layer,
358
+ layerName: string,
359
+ ): void {
360
+ layerData.loaded = true;
361
+ layerData.layer = layer;
362
+ layerData.layerName = layerName;
363
+ layerData.uuid = res.uuid;
364
+
365
+ layerData.controller.layerData = layerData;
366
+ layerData.controller.layer = layer;
367
+ layerData.controller.uuid = res.uuid;
368
+
369
+ layer.ctr = layerData.controller;
370
+ }
371
+
372
+ /**
373
+ * 创建控制器代理
374
+ */
375
+ createControllerProxy(layerData: FWLayerData): FW.LayerController {
376
+ return new Proxy(layerData.controller, {
377
+ get: (target, prop) => {
378
+ if (prop === ADD_EXTERNAL_REFERENCE) {
379
+ return (cb: (ref: FW.LayerController | null) => void) => {
380
+ layerData.externalReference.add(cb);
381
+ };
382
+ }
383
+ return target[prop];
384
+ },
385
+ });
386
+ }
387
+
388
+ /**
389
+ * 清理失败的Layer
390
+ */
391
+ clearFailedLayer(layerData: FWLayerData): void {
392
+ this.layerMap.delete(layerData.controllerConstructor);
393
+ this.layerRegistry.delete(layerData.controllerConstructor);
394
+ }
395
+
396
+ /**
397
+ * 通知外部引用更新
398
+ */
399
+ notifyExternalRefUpdates(layerData: FWLayerData): void {
400
+ layerData.externalReference.forEach((cb) => {
401
+ try {
402
+ cb?.(null);
403
+ } catch (e) {
404
+ FW.Log.error('External ref update callback error:', e);
405
+ }
406
+ });
407
+ layerData.externalReference.clear();
408
+ }
409
+
410
+ getLayerMap(): Map<new () => FW.LayerController, FWLayerData> {
411
+ return this.layerMap;
412
+ }
413
+
414
+ removeFromRegistry(type: new () => FW.LayerController): void {
415
+ this.layerRegistry.delete(type);
416
+ }
417
+
418
+ removeFromMap(type: new () => FW.LayerController): void {
419
+ this.layerMap.delete(type);
420
+ }
421
+
422
+ clear(): void {
423
+ this.layerMap.clear();
424
+ this.layerRegistry.clear();
425
+ }
426
+ }
427
+
428
+ class FWLayerCreateManager {
429
+ private lifecycleManager: FWLayerLifecycleManager = new FWLayerLifecycleManager();
430
+
431
+ /**
432
+ * 创建Layer节点
433
+ */
434
+ createLayer(
435
+ prefab: cc.Prefab,
436
+ layerComponent: string,
437
+ renderOrder: number,
438
+ parent: cc.Node,
439
+ position: FW.Vec3,
440
+ ): FW.Layer {
441
+ parent = parent || FW.Entry.scene?.node;
442
+ position = position || cc.Vec3.ZERO;
443
+
444
+ if (!parent.activeInHierarchy || !cc.isValid(parent)) {
445
+ FW.Log.error(`createLayer failed , parent : ${parent}`);
446
+ return;
447
+ }
448
+
449
+ const node = cc.instantiate(prefab);
450
+ const p = cc.v3(position.x, position.y);
451
+ node.setParent(parent);
452
+ node.setPosition(p);
453
+ node.zIndex = renderOrder;
454
+
455
+ !node.getComponent(layerComponent) && node.addComponent(layerComponent);
456
+ return node.getComponent(layerComponent);
457
+ }
458
+
459
+ /**
460
+ * 设置Layer生命周期
461
+ */
462
+ setupLayerLifecycle(layer: FW.Layer, ctr: FW.LayerController): void {
463
+ this.lifecycleManager.setupLifecycleHooks(layer, ctr);
464
+ }
465
+
466
+ /**
467
+ * 初始化控制器
468
+ */
469
+ initializeController(ctr: FW.LayerController, data: any): void {
470
+ ctr.initialize();
471
+ ctr.onInit?.(data);
472
+ }
473
+ }
474
+
475
+ class FWLayerOpenManager {
476
+ constructor(
477
+ private dataManager: FWLayerDataManager,
478
+ private resourceManager: FWLayerResourceManager,
479
+ private createManager: FWLayerCreateManager,
480
+ private stackManager: FWLayerStackManager,
481
+ private queueManager: FWLayerQueueManager,
482
+ private stateManager: FWLayerStateManager,
483
+ ) {}
484
+
485
+ /**
486
+ * 统一的Layer打开方法
487
+ */
488
+ async openLayerAsync<Ctr extends FW.LayerController = FW.LayerController>(
489
+ data: FW.LayerOpenArgs,
490
+ ): Promise<Ctr> {
491
+ if (!this.validateOpenData(data)) {
492
+ return undefined;
493
+ }
494
+
495
+ const existingLayer = this.dataManager.getExistingLayer(data.type);
496
+ if (existingLayer) {
497
+ return existingLayer as Ctr;
498
+ }
499
+
500
+ const layerData = this.dataManager.createLayerData(data.type);
501
+
502
+ if (!layerData) {
503
+ return undefined;
504
+ }
505
+
506
+ if (this.dataManager.addRegistry(data.type)) {
507
+ const proxy = this.dataManager.getExistingProxy(data.type);
508
+ return proxy as Ctr;
509
+ }
510
+
511
+ if (this.queueManager.handlePopupQueue(layerData, this.dataManager.getLayerMap())) {
512
+ return undefined;
513
+ }
514
+
515
+ this.dataManager.addLayerData(data.type, layerData);
516
+
517
+ return this.asyncGenerationLayer(layerData, data);
518
+ }
519
+
520
+ openLayerSync<Ctr extends FW.LayerController = FW.LayerController>(data: FW.LayerOpenArgs): Ctr {
521
+ if (!this.validateOpenData(data)) {
522
+ return undefined;
523
+ }
524
+
525
+ const existingLayer = this.dataManager.getExistingLayer(data.type);
526
+ if (existingLayer) {
527
+ return existingLayer as Ctr;
528
+ }
529
+
530
+ const layerData = this.dataManager.createLayerData(data.type);
531
+
532
+ if (!layerData) {
533
+ return undefined;
534
+ }
535
+
536
+ if (this.dataManager.addRegistry(data.type)) {
537
+ const proxy = this.dataManager.getExistingProxy(data.type);
538
+ return proxy as Ctr;
539
+ }
540
+
541
+ if (this.queueManager.handlePopupQueue(layerData, this.dataManager.getLayerMap())) {
542
+ return undefined;
543
+ }
544
+
545
+ this.dataManager.addLayerData(data.type, layerData);
546
+
547
+ return this.syncGenerationLayer(layerData, data);
548
+ }
549
+
550
+ /**
551
+ * 验证打开数据
552
+ */
553
+ private validateOpenData(data: FW.LayerOpenArgs): boolean {
554
+ if (!data) {
555
+ FW.Log.error(`打开Layer失败:${data},请检查参数!`);
556
+ return false;
557
+ }
558
+ return true;
559
+ }
560
+
561
+ /**
562
+ * 异步生成Layer
563
+ */
564
+ private async asyncGenerationLayer<Ctr extends FW.LayerController = FW.LayerController>(
565
+ layerData: FWLayerData,
566
+ data: FW.LayerOpenArgs,
567
+ ): Promise<Ctr> {
568
+ try {
569
+ this.stateManager.setState(
570
+ layerData.controllerConstructor,
571
+ FW.SystemDefine.FWLayerState.LOADING,
572
+ );
573
+ const res = await this.resourceManager.loadLayerAsync(layerData);
574
+
575
+ this.stateManager.setState(
576
+ layerData.controllerConstructor,
577
+ FW.SystemDefine.FWLayerState.OPENING,
578
+ );
579
+ const ctr = this.createLayer(layerData, res, data) as Ctr;
580
+
581
+ this.dataManager.removeFromRegistry(layerData.controllerConstructor);
582
+
583
+ this.stateManager.setState(
584
+ layerData.controllerConstructor,
585
+ FW.SystemDefine.FWLayerState.OPENED,
586
+ );
587
+
588
+ return ctr;
589
+ } catch (e) {
590
+ FW.Log.error(`asyncGenerationLayer failed:`, e);
591
+ this.stateManager.removeState(layerData.controllerConstructor);
592
+ this.dataManager.clearFailedLayer(layerData);
593
+ throw e;
594
+ }
595
+ }
596
+
597
+ /**
598
+ * 同步创建Layer
599
+ */
600
+ private syncGenerationLayer<Ctr extends FW.LayerController = FW.LayerController>(
601
+ layerData: FWLayerData,
602
+ data: FW.LayerOpenArgs,
603
+ ): Ctr {
604
+ try {
605
+ this.stateManager.setState(
606
+ layerData.controllerConstructor,
607
+ FW.SystemDefine.FWLayerState.OPENING,
608
+ );
609
+ const res = this.resourceManager.loadLayerSync(layerData);
610
+ const ctr = this.createLayer(layerData, res, data) as Ctr;
611
+
612
+ this.stateManager.setState(
613
+ layerData.controllerConstructor,
614
+ FW.SystemDefine.FWLayerState.OPENED,
615
+ );
616
+
617
+ return ctr;
618
+ } catch (e) {
619
+ FW.Log.error(`syncGenerationLayer failed:`, e);
620
+ this.dataManager.removeFromRegistry(layerData.controllerConstructor);
621
+ this.dataManager.clearFailedLayer(layerData);
622
+ return undefined;
623
+ }
624
+ }
625
+
626
+ /**
627
+ * 创建Layer
628
+ */
629
+ private createLayer<Ctr extends FW.LayerController = FW.LayerController>(
630
+ layerData: FWLayerData,
631
+ res: { asset: cc.Prefab; uuid: string },
632
+ data: FW.LayerOpenArgs,
633
+ ): Ctr {
634
+ const layer = this.createManager.createLayer(
635
+ res.asset,
636
+ res.asset.name,
637
+ layerData.controller.renderOrder,
638
+ data.parent,
639
+ data.position,
640
+ );
641
+
642
+ if (!layer) {
643
+ this.dataManager.removeFromRegistry(layerData.controllerConstructor);
644
+ return;
645
+ }
646
+
647
+ const layerName = cc.js.getClassName(layer);
648
+
649
+ this.dataManager.setupLayerData(layerData, res, layer, layerName);
650
+
651
+ this.createManager.initializeController(layerData.controller, data.args);
652
+
653
+ this.createManager.setupLayerLifecycle(layer, layerData.controller);
654
+
655
+ if (layerData.controller.layerType !== FW.SystemDefine.FWLayerType.PERMANENT) {
656
+ this.stackManager.push(layerData);
657
+ }
658
+
659
+ this.dataManager.removeFromRegistry(layerData.controllerConstructor);
660
+
661
+ layerData.controllerProxy = this.dataManager.createControllerProxy(layerData);
662
+
663
+ return layerData.controllerProxy as Ctr;
664
+ }
665
+ }
666
+
667
+ class FWLayerResourceManager {
668
+ async loadLayerAsync(layerData: FWLayerData): Promise<{ asset: cc.Prefab; uuid: string }> {
669
+ try {
670
+ const res = await FW.Entry.resMgr.loadAssetData<cc.Prefab>(layerData.layerAssetProperty);
671
+ if (!res) return undefined;
672
+ res.user = layerData.layerName;
673
+ res.autoRelease = layerData.controller.autoRelease;
674
+ res.dependentBundle = layerData.controller.layerAssetProperty.bundle;
675
+ return { asset: res.asset as cc.Prefab, uuid: res.uuid };
676
+ } catch (e) {
677
+ FW.Log.error(`loadLayerAsync failed:`, e);
678
+ throw e;
679
+ }
680
+ }
681
+
682
+ loadLayerSync(layerData: FWLayerData): { asset: cc.Prefab; uuid: string } {
683
+ layerData.layerAssetProperty.bundle =
684
+ layerData.layerAssetProperty.bundle || FW.Entry.bundleName;
685
+ const res = FW.Entry.resMgr.getAssetData<cc.Prefab>(layerData.layerAssetProperty);
686
+ res.user = layerData.layerName;
687
+ res.autoRelease = layerData.controller.autoRelease;
688
+ res.dependentBundle = layerData.controller.layerAssetProperty.bundle;
689
+ return { asset: res.asset as cc.Prefab, uuid: res.uuid };
690
+ }
691
+ }
692
+
693
+ class FWLayerStackManager {
694
+ private layerStack: FWLayerData[] = [];
695
+
696
+ push(layerData: FWLayerData): void {
697
+ if (layerData.controller.layerType !== FW.SystemDefine.FWLayerType.PERMANENT) {
698
+ this.layerStack.push(layerData);
699
+ }
700
+ }
701
+
702
+ pop(): FWLayerData | undefined {
703
+ return this.layerStack.pop();
704
+ }
705
+
706
+ remove(layerData: FWLayerData): void {
707
+ const index = this.layerStack.findIndex((v) => v.controller === layerData.controller);
708
+ if (index > -1) {
709
+ this.layerStack.splice(index, 1);
710
+ }
711
+ }
712
+
713
+ getStack(): FWLayerData[] {
714
+ return [...this.layerStack];
715
+ }
716
+
717
+ clear(): void {
718
+ this.layerStack = [];
719
+ }
720
+ }
721
+
722
+ class FWLayerStateManager {
723
+ private layerStates = new Map<new () => FW.LayerController, FW.SystemDefine.FWLayerState>();
724
+ constructor() {}
725
+ setState(ctrType: new () => FW.LayerController, state: FW.SystemDefine.FWLayerState): void {
726
+ if (FW.Entry.layerMgr.isDebug()) {
727
+ FW.Log.debug(`${cc.js.getClassName(ctrType)}->更新状态${state}`);
728
+ }
729
+ this.layerStates.set(ctrType, state);
730
+ }
731
+
732
+ getState(ctrType: new () => FW.LayerController): FW.SystemDefine.FWLayerState {
733
+ return this.layerStates.get(ctrType) || FW.SystemDefine.FWLayerState.CLOSED;
734
+ }
735
+
736
+ isOpening(ctrType: new () => FW.LayerController): boolean {
737
+ return this.getState(ctrType) === FW.SystemDefine.FWLayerState.OPENING;
738
+ }
739
+
740
+ isOpened(ctrType: new () => FW.LayerController): boolean {
741
+ return this.getState(ctrType) === FW.SystemDefine.FWLayerState.OPENED;
742
+ }
743
+
744
+ isClosing(ctrType: new () => FW.LayerController): boolean {
745
+ return this.getState(ctrType) === FW.SystemDefine.FWLayerState.CLOSING;
746
+ }
747
+
748
+ removeState(ctrType: new () => FW.LayerController): void {
749
+ if (FW.Entry.layerMgr.isDebug()) {
750
+ FW.Log.debug(`${cc.js.getClassName(ctrType)}-> 移除状态`);
751
+ }
752
+ this.layerStates.delete(ctrType);
753
+ }
754
+
755
+ clear(): void {
756
+ this.layerStates.clear();
757
+ }
758
+ }
759
+
760
+ class FWLayerQueueManager {
761
+ private layerQueue: FWQueue<FWLayerData> = new FWQueue<FWLayerData>();
762
+
763
+ handlePopupQueue(
764
+ layerData: FWLayerData,
765
+ layerMap: Map<new () => FW.LayerController, FWLayerData>,
766
+ ): boolean {
767
+ if (layerData.controller.layerType === FW.SystemDefine.FWLayerType.POPUP_QUEUE) {
768
+ const hasNonPermanentLayers = Array.from(layerMap.values()).some(
769
+ (value) => value.layerType === FW.SystemDefine.FWLayerType.POPUP_QUEUE,
770
+ );
771
+
772
+ if (hasNonPermanentLayers) {
773
+ this.add(layerData);
774
+ return true;
775
+ }
776
+ }
777
+ return false;
778
+ }
779
+
780
+ getNextLayer(): FWLayerData | undefined {
781
+ return this.shift();
782
+ }
783
+
784
+ add(layerData: FWLayerData): void {
785
+ this.layerQueue.add(layerData);
786
+ }
787
+
788
+ shift(): FWLayerData | undefined {
789
+ return this.layerQueue.shift();
790
+ }
791
+
792
+ isEmpty(): boolean {
793
+ return this.layerQueue.isEmpty();
794
+ }
795
+
796
+ clear(): void {
797
+ this.layerQueue.clear();
798
+ }
799
+
800
+ getQueue(): FWLayerData[] {
801
+ return this.layerQueue.getQueue();
802
+ }
803
+ }
804
+
805
+ class FWLayerLifecycleManager {
806
+ setupLifecycleHooks(layer: FW.Layer, ctr: FW.LayerController): void {
807
+ const originalOnLoad = layer['onLoad'];
808
+ layer['onLoad'] = function () {
809
+ originalOnLoad?.call(this);
810
+ ctr.onLoad?.();
811
+ };
812
+
813
+ const originalStart = layer['start'];
814
+ layer['start'] = function () {
815
+ originalStart?.call(this);
816
+ ctr.onStart?.();
817
+ };
818
+
819
+ const originalOnEnable = layer['onEnable'];
820
+ layer['onEnable'] = function () {
821
+ originalOnEnable?.call(this);
822
+ ctr.onEnable?.();
823
+ };
824
+
825
+ const originalOnDisable = layer['onDisable'];
826
+ layer['onDisable'] = function () {
827
+ originalOnDisable?.call(this);
828
+ ctr.onDisable?.();
829
+ };
830
+
831
+ const originalOnDestroy = layer['onDestroy'];
832
+ layer['onDestroy'] = function () {
833
+ originalOnDestroy?.call(this);
834
+ ctr.onDestroy?.();
835
+ };
836
+
837
+ const originalUpdate = layer['update'];
838
+ layer['update'] = function (dt: number) {
839
+ originalUpdate?.call(this, dt);
840
+ ctr.onUpdate?.(dt);
841
+ };
842
+
843
+ const originalLateUpdate = layer['lateUpdate'];
844
+ layer['lateUpdate'] = function () {
845
+ originalLateUpdate?.call(this);
846
+ ctr.onLateUpdate?.();
847
+ };
848
+ }
849
+ }
850
+
851
+ class FWLayerControllerFactory {
852
+ /**
853
+ * 创建并初始化 LayerController
854
+ */
855
+ createController<Ctr extends FW.LayerController = FW.LayerController>(type: new () => Ctr): Ctr {
856
+ const ctr = new type();
857
+
858
+ ctr.initializeDependencies?.();
859
+
860
+ return ctr;
861
+ }
862
+ }