@cc-component/cc-core 1.2.8
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.
- package/.cc-ex-component.md +12 -0
- package/assets/core/config/CommonEnum.ts +94 -0
- package/assets/core/config/CommonEnum.ts.meta +9 -0
- package/assets/core/config/IConfig.ts +89 -0
- package/assets/core/config/IConfig.ts.meta +9 -0
- package/assets/core/config/LayerType.ts +44 -0
- package/assets/core/config/LayerType.ts.meta +9 -0
- package/assets/core/config/LayerUI.ts +113 -0
- package/assets/core/config/LayerUI.ts.meta +9 -0
- package/assets/core/config.meta +9 -0
- package/assets/core/editor/LanguageManager.ts +323 -0
- package/assets/core/editor/LanguageManager.ts.meta +9 -0
- package/assets/core/editor/SpineRunner.ts +39 -0
- package/assets/core/editor/SpineRunner.ts.meta +9 -0
- package/assets/core/editor/i18nEditorComponent.ts +137 -0
- package/assets/core/editor/i18nEditorComponent.ts.meta +9 -0
- package/assets/core/editor.meta +9 -0
- package/assets/core/home/AudioUtil.ts +164 -0
- package/assets/core/home/AudioUtil.ts.meta +9 -0
- package/assets/core/home/BaseBoxView.ts +60 -0
- package/assets/core/home/BaseBoxView.ts.meta +9 -0
- package/assets/core/home/BaseLaunchComponent.ts +9 -0
- package/assets/core/home/BaseLaunchComponent.ts.meta +9 -0
- package/assets/core/home/BaseLoading.ts +136 -0
- package/assets/core/home/BaseLoading.ts.meta +9 -0
- package/assets/core/home/BaseSkeleton.ts +39 -0
- package/assets/core/home/BaseSkeleton.ts.meta +9 -0
- package/assets/core/home/CameraAngel.ts +326 -0
- package/assets/core/home/CameraAngel.ts.meta +9 -0
- package/assets/core/home/DouYinShow.ts +27 -0
- package/assets/core/home/DouYinShow.ts.meta +9 -0
- package/assets/core/home/EventManager.ts +39 -0
- package/assets/core/home/EventManager.ts.meta +9 -0
- package/assets/core/home/ExView.ts +9 -0
- package/assets/core/home/ExView.ts.meta +9 -0
- package/assets/core/home/FollowCamera.ts +205 -0
- package/assets/core/home/FollowCamera.ts.meta +9 -0
- package/assets/core/home/InViewCenter.ts +52 -0
- package/assets/core/home/InViewCenter.ts.meta +9 -0
- package/assets/core/home/JsonUtil.ts +102 -0
- package/assets/core/home/JsonUtil.ts.meta +9 -0
- package/assets/core/home/LoadingWindow.ts +44 -0
- package/assets/core/home/LoadingWindow.ts.meta +9 -0
- package/assets/core/home/ParabolaTween.ts +110 -0
- package/assets/core/home/ParabolaTween.ts.meta +9 -0
- package/assets/core/home/ProgessView.ts +96 -0
- package/assets/core/home/ProgessView.ts.meta +9 -0
- package/assets/core/home/Quaternion.ts +237 -0
- package/assets/core/home/Quaternion.ts.meta +9 -0
- package/assets/core/home/ResUtil.ts +132 -0
- package/assets/core/home/ResUtil.ts.meta +9 -0
- package/assets/core/home/ResourceManager.ts +430 -0
- package/assets/core/home/ResourceManager.ts.meta +9 -0
- package/assets/core/home/StateMachine.ts +93 -0
- package/assets/core/home/StateMachine.ts.meta +9 -0
- package/assets/core/home/StorageManager.ts +161 -0
- package/assets/core/home/StorageManager.ts.meta +9 -0
- package/assets/core/home/ThirdFreeLookCamera.ts +201 -0
- package/assets/core/home/ThirdFreeLookCamera.ts.meta +9 -0
- package/assets/core/home/TimeManager.ts +486 -0
- package/assets/core/home/TimeManager.ts.meta +9 -0
- package/assets/core/home/Tools.ts +103 -0
- package/assets/core/home/Tools.ts.meta +9 -0
- package/assets/core/home/prefabs.meta +12 -0
- package/assets/core/home/util/EncryptUtil.ts +60 -0
- package/assets/core/home/util/EncryptUtil.ts.meta +11 -0
- package/assets/core/home/util/MathUtil.ts +22 -0
- package/assets/core/home/util/MathUtil.ts.meta +9 -0
- package/assets/core/home/util/Md5.ts +202 -0
- package/assets/core/home/util/Md5.ts.meta +11 -0
- package/assets/core/home/util/RandomUtil.ts +61 -0
- package/assets/core/home/util/RandomUtil.ts.meta +9 -0
- package/assets/core/home/util/ResUtil.ts +129 -0
- package/assets/core/home/util/ResUtil.ts.meta +9 -0
- package/assets/core/home/util/crypto-js.d.ts +30 -0
- package/assets/core/home/util/crypto-js.d.ts.meta +11 -0
- package/assets/core/home/util/crypto-js.js +6030 -0
- package/assets/core/home/util/crypto-js.js.meta +9 -0
- package/assets/core/home/util.meta +12 -0
- package/assets/core/home.meta +12 -0
- package/assets/core/interface/ISceneParam.ts +11 -0
- package/assets/core/interface/ISceneParam.ts.meta +9 -0
- package/assets/core/interface/Interface.ts +160 -0
- package/assets/core/interface/Interface.ts.meta +1 -0
- package/assets/core/interface/MainModule.ts +1019 -0
- package/assets/core/interface/MainModule.ts.meta +9 -0
- package/assets/core/interface.meta +9 -0
- package/assets/core/lib/Logger.ts +286 -0
- package/assets/core/lib/Logger.ts.meta +9 -0
- package/assets/core/lib/language/.language.md +1 -0
- package/assets/core/lib/language/Language.ts +133 -0
- package/assets/core/lib/language/Language.ts.meta +13 -0
- package/assets/core/lib/language/LanguageData.ts +114 -0
- package/assets/core/lib/language/LanguageData.ts.meta +9 -0
- package/assets/core/lib/language/LanguageLabel.ts +172 -0
- package/assets/core/lib/language/LanguageLabel.ts.meta +13 -0
- package/assets/core/lib/language/LanguagePack.ts +126 -0
- package/assets/core/lib/language/LanguagePack.ts.meta +13 -0
- package/assets/core/lib/language/LanguagePointLabel.ts.meta +16 -0
- package/assets/core/lib/language/LanguageSpine.ts +60 -0
- package/assets/core/lib/language/LanguageSpine.ts.meta +9 -0
- package/assets/core/lib/language/LanguageSprite.ts +138 -0
- package/assets/core/lib/language/LanguageSprite.ts.meta +13 -0
- package/assets/core/lib/language.meta +9 -0
- package/assets/core/lib/logger/ELoggerLevel.ts +16 -0
- package/assets/core/lib/logger/ELoggerLevel.ts.meta +9 -0
- package/assets/core/lib/logger/MLogger.ts +118 -0
- package/assets/core/lib/logger/MLogger.ts.meta +9 -0
- package/assets/core/lib/logger.meta +9 -0
- package/assets/core/lib/net/libs/proto/output/protobuf.d.ts +2729 -0
- package/assets/core/lib/net/libs/proto/output/protobuf.d.ts.meta +9 -0
- package/assets/core/lib/net/libs/proto/output/protobuf.min.js +8 -0
- package/assets/core/lib/net/libs/proto/output/protobuf.min.js.meta +9 -0
- package/assets/core/lib/net/libs/proto/output/protobuf_custom.d.ts +102 -0
- package/assets/core/lib/net/libs/proto/output/protobuf_custom.d.ts.meta +9 -0
- package/assets/core/lib/net/libs/proto/output/protobuf_custom.js +222 -0
- package/assets/core/lib/net/libs/proto/output/protobuf_custom.js.meta +9 -0
- package/assets/core/lib/net/libs/proto/output.meta +9 -0
- package/assets/core/lib/net/libs/proto/source/Cmd.proto +6 -0
- package/assets/core/lib/net/libs/proto/source/Cmd.proto.meta +11 -0
- package/assets/core/lib/net/libs/proto/source/UserLogin.proto +12 -0
- package/assets/core/lib/net/libs/proto/source/UserLogin.proto.meta +11 -0
- package/assets/core/lib/net/libs/proto/source/base.proto +24 -0
- package/assets/core/lib/net/libs/proto/source/base.proto.meta +11 -0
- package/assets/core/lib/net/libs/proto/source/command.proto +31 -0
- package/assets/core/lib/net/libs/proto/source/command.proto.meta +11 -0
- package/assets/core/lib/net/libs/proto/source/domain/boos_battle_info.proto +13 -0
- package/assets/core/lib/net/libs/proto/source/domain/boos_battle_info.proto.meta +11 -0
- package/assets/core/lib/net/libs/proto/source/domain/player_auth.proto +26 -0
- package/assets/core/lib/net/libs/proto/source/domain/player_auth.proto.meta +11 -0
- package/assets/core/lib/net/libs/proto/source/domain.meta +9 -0
- package/assets/core/lib/net/libs/proto/source/message/game_push.proto +23 -0
- package/assets/core/lib/net/libs/proto/source/message/game_push.proto.meta +11 -0
- package/assets/core/lib/net/libs/proto/source/message/game_request.proto +24 -0
- package/assets/core/lib/net/libs/proto/source/message/game_request.proto.meta +11 -0
- package/assets/core/lib/net/libs/proto/source/message/game_response.proto +24 -0
- package/assets/core/lib/net/libs/proto/source/message/game_response.proto.meta +11 -0
- package/assets/core/lib/net/libs/proto/source/message.meta +9 -0
- package/assets/core/lib/net/libs/proto/source/push/boss_battle_events.proto +43 -0
- package/assets/core/lib/net/libs/proto/source/push/boss_battle_events.proto.meta +11 -0
- package/assets/core/lib/net/libs/proto/source/push.meta +9 -0
- package/assets/core/lib/net/libs/proto/source.meta +12 -0
- package/assets/core/lib/net/libs/proto.meta +9 -0
- package/assets/core/lib/net/libs.meta +9 -0
- package/assets/core/lib/net/net/HttpManager.ts +307 -0
- package/assets/core/lib/net/net/HttpManager.ts.meta +9 -0
- package/assets/core/lib/net/net/NetInterface.ts +114 -0
- package/assets/core/lib/net/net/NetInterface.ts.meta +9 -0
- package/assets/core/lib/net/net/NetManager.ts +77 -0
- package/assets/core/lib/net/net/NetManager.ts.meta +9 -0
- package/assets/core/lib/net/net/NetNode.ts +471 -0
- package/assets/core/lib/net/net/NetNode.ts.meta +9 -0
- package/assets/core/lib/net/net/WebSock.ts +81 -0
- package/assets/core/lib/net/net/WebSock.ts.meta +9 -0
- package/assets/core/lib/net/net/custom/NetChannelManager.ts +41 -0
- package/assets/core/lib/net/net/custom/NetChannelManager.ts.meta +9 -0
- package/assets/core/lib/net/net/custom/NetConfig.ts +11 -0
- package/assets/core/lib/net/net/custom/NetConfig.ts.meta +9 -0
- package/assets/core/lib/net/net/custom/NetErrorCode.ts +4 -0
- package/assets/core/lib/net/net/custom/NetErrorCode.ts.meta +9 -0
- package/assets/core/lib/net/net/custom/NetGameTips.ts +53 -0
- package/assets/core/lib/net/net/custom/NetGameTips.ts.meta +9 -0
- package/assets/core/lib/net/net/custom/NetNodeGame.ts +105 -0
- package/assets/core/lib/net/net/custom/NetNodeGame.ts.meta +9 -0
- package/assets/core/lib/net/net/custom.meta +9 -0
- package/assets/core/lib/net/net/protocol/NetProtocolJson.ts +39 -0
- package/assets/core/lib/net/net/protocol/NetProtocolJson.ts.meta +9 -0
- package/assets/core/lib/net/net/protocol/NetProtocolProtobuf.ts +85 -0
- package/assets/core/lib/net/net/protocol/NetProtocolProtobuf.ts.meta +9 -0
- package/assets/core/lib/net/net/protocol.meta +9 -0
- package/assets/core/lib/net/net.meta +9 -0
- package/assets/core/lib/net/prompt.meta +9 -0
- package/assets/core/lib/net.meta +9 -0
- package/assets/core/lib/old/VM2.ts +619 -0
- package/assets/core/lib/old/VM2.ts.meta +9 -0
- package/assets/core/lib/old/ViewModel.ts +905 -0
- package/assets/core/lib/old/ViewModel.ts.meta +9 -0
- package/assets/core/lib/old/ViewSearch.ts +125 -0
- package/assets/core/lib/old/ViewSearch.ts.meta +9 -0
- package/assets/core/lib/old.meta +9 -0
- package/assets/core/lib/tabbar/TabBarComponent.ts +113 -0
- package/assets/core/lib/tabbar/TabBarComponent.ts.meta +9 -0
- package/assets/core/lib/tabbar/TabBarController.ts +86 -0
- package/assets/core/lib/tabbar/TabBarController.ts.meta +9 -0
- package/assets/core/lib/tabbar/TabBarItem.ts +52 -0
- package/assets/core/lib/tabbar/TabBarItem.ts.meta +9 -0
- package/assets/core/lib/tabbar.meta +9 -0
- package/assets/core/lib.meta +12 -0
- package/assets/core.meta +9 -0
- package/assets.meta +9 -0
- package/index.ts +3 -0
- package/index.ts.meta +9 -0
- package/package.json +19 -0
- package/package.json.meta +11 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @file ResUtil.ts
|
|
4
|
+
* @author dream
|
|
5
|
+
* @description Cocos方法整合,如果Cocos版本升级,造成API修改,仅需修改此处
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { Asset, assetManager, AssetManager, ImageAsset, resources, Texture2D } from "cc";
|
|
10
|
+
|
|
11
|
+
export type Constructor<T extends Asset> = new () => T;
|
|
12
|
+
|
|
13
|
+
export const headImgExt = ".head";
|
|
14
|
+
|
|
15
|
+
export module ResUtil {
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @description 原生加载资源
|
|
19
|
+
* @param object {url: 远程地址 option: 参数类型}
|
|
20
|
+
* @returns
|
|
21
|
+
*/
|
|
22
|
+
export function loadRemote<T extends Asset>(object: { url: string, option?: any }) {
|
|
23
|
+
if (null == object.option) {
|
|
24
|
+
object.option = {};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const { url, option } = object;
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
assetManager.loadRemote(url, option, (err: Error | null, asset: T) => {
|
|
30
|
+
resolve && resolve(err ? null : asset);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* 加载bundle
|
|
38
|
+
* @param bundleName
|
|
39
|
+
* @returns
|
|
40
|
+
*/
|
|
41
|
+
export function loadBundle(bundleName: string) {
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
assetManager.loadBundle(bundleName, (err, bundle) => {
|
|
44
|
+
resolve && resolve(err ? null : bundle);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function getBundle(bundleName?: string, bundle?: AssetManager.Bundle) {
|
|
50
|
+
if (!bundle) {
|
|
51
|
+
if (null == bundleName || '' === bundleName) {
|
|
52
|
+
bundle = resources;
|
|
53
|
+
} else {
|
|
54
|
+
bundle = assetManager.getBundle(bundleName)!;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return bundle;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* 加载资源
|
|
62
|
+
* @param option
|
|
63
|
+
* @returns
|
|
64
|
+
*/
|
|
65
|
+
export function loadAsset<T extends Asset>(option: { path: string, bundleName?: string, bundle?: AssetManager.Bundle, type: Constructor<T> }) {
|
|
66
|
+
const bundle = getBundle(option.bundleName, option.bundle);
|
|
67
|
+
const asset = bundle.get(option.path, option.type);
|
|
68
|
+
if (null != asset) {
|
|
69
|
+
return Promise.resolve(asset);
|
|
70
|
+
}
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
bundle.load(option.path, option.type, (err, asset: T) => {
|
|
73
|
+
resolve(err ? null : asset);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* 自定义头像加载流程
|
|
80
|
+
* 加载头像使用 ResUtil.loadRemote({url, option:{ext:headImgExt}})
|
|
81
|
+
*/
|
|
82
|
+
export function registerHeadImgLoader() {
|
|
83
|
+
assetManager.downloader.register(headImgExt, (content, options, onComplete) => {
|
|
84
|
+
onComplete(null, content);
|
|
85
|
+
});
|
|
86
|
+
assetManager.parser.register(headImgExt, downloadDomImage);
|
|
87
|
+
assetManager.factory.register(headImgExt, createTexture);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function createTexture(id: string, data: any, options: any, onComplete: Function) {
|
|
91
|
+
let out: Texture2D | null = null;
|
|
92
|
+
let err: Error | null = null;
|
|
93
|
+
try {
|
|
94
|
+
out = new Texture2D();
|
|
95
|
+
const imageAsset = new ImageAsset(data);
|
|
96
|
+
out.image = imageAsset;
|
|
97
|
+
} catch (e) {
|
|
98
|
+
err = e as any as Error;
|
|
99
|
+
}
|
|
100
|
+
onComplete && onComplete(err, out);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function downloadDomImage(url: string, options: any, onComplete: Function) {
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
const img = new Image();
|
|
107
|
+
if (window.location.protocol !== 'file:') {
|
|
108
|
+
img.crossOrigin = 'anonymous';
|
|
109
|
+
}
|
|
110
|
+
function loadCallback() {
|
|
111
|
+
img.removeEventListener('load', loadCallback);
|
|
112
|
+
img.removeEventListener('error', errorCallback);
|
|
113
|
+
if (onComplete) {
|
|
114
|
+
onComplete(null, img);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function errorCallback() {
|
|
119
|
+
img.removeEventListener('load', loadCallback);
|
|
120
|
+
img.removeEventListener('error', errorCallback);
|
|
121
|
+
if (onComplete) {
|
|
122
|
+
onComplete(new Error(url));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
img.addEventListener('load', loadCallback);
|
|
127
|
+
img.addEventListener('error', errorCallback);
|
|
128
|
+
img.src = url;
|
|
129
|
+
return img;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
}
|
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import { AssetManager } from 'cc';
|
|
2
|
+
import { director } from 'cc';
|
|
3
|
+
import { SpriteAtlas } from 'cc';
|
|
4
|
+
import { __private } from 'cc';
|
|
5
|
+
import { isValid } from 'cc';
|
|
6
|
+
import { SceneAsset } from 'cc';
|
|
7
|
+
import { assetManager, Asset, Node, SpriteFrame, Constructor } from 'cc';
|
|
8
|
+
import { DEBUG } from 'cc/env';
|
|
9
|
+
import { ResConfig } from '../config/CommonEnum';
|
|
10
|
+
|
|
11
|
+
export enum AssetType {
|
|
12
|
+
SpriteFrame = 1,
|
|
13
|
+
Prefab = 2,
|
|
14
|
+
Scene = 3,
|
|
15
|
+
AudioClip = 4,
|
|
16
|
+
SpriteAtlas = 5,
|
|
17
|
+
TextAsset = 6,
|
|
18
|
+
JsonAsset = 7,
|
|
19
|
+
Font = 8,
|
|
20
|
+
Material = 9,
|
|
21
|
+
AnimationClip = 10,
|
|
22
|
+
EffectAsset = 11,
|
|
23
|
+
Texture2D = 12,
|
|
24
|
+
RawAsset = 13,
|
|
25
|
+
}
|
|
26
|
+
export type AssetsType<T = Asset> = __private.__types_globals__Constructor<T> | null;
|
|
27
|
+
|
|
28
|
+
export class ResourceManager {
|
|
29
|
+
private static _instance: ResourceManager;
|
|
30
|
+
private loadedAssets: Map<string, { refCount, asset: Asset; bundleName: string }> = new Map(); // 记录已加载的资源及其所属 Bundle
|
|
31
|
+
|
|
32
|
+
timeout: any;;
|
|
33
|
+
private constructor() { }
|
|
34
|
+
|
|
35
|
+
public static get instance(): ResourceManager {
|
|
36
|
+
if (!ResourceManager._instance) {
|
|
37
|
+
ResourceManager._instance = new ResourceManager();
|
|
38
|
+
}
|
|
39
|
+
return ResourceManager._instance;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 记录加载的资源
|
|
44
|
+
* @param path 资源路径
|
|
45
|
+
* @param asset 资源对象
|
|
46
|
+
* @param bundleName Bundle 名称
|
|
47
|
+
*/
|
|
48
|
+
public trackAsset(path: string, asset: Asset, bundleName: string): void {
|
|
49
|
+
let key = this.getAssetKey(path, bundleName);
|
|
50
|
+
if (!this.loadedAssets.has(key)) {
|
|
51
|
+
asset.asset_path = key;
|
|
52
|
+
this.loadedAssets.set(key, { refCount: 1, asset, bundleName });
|
|
53
|
+
asset.addRef(); // 增加引用计数
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* 根据路径和 Bundle 名称获取已加载的资源
|
|
59
|
+
* @param path 资源路径
|
|
60
|
+
* @param bundleName Bundle 名称
|
|
61
|
+
* @returns 资源对象,如果未加载则返回 null
|
|
62
|
+
*/
|
|
63
|
+
public getAsset(path: string, bundleName: string): Asset | null {
|
|
64
|
+
const asset = assetManager.getBundle(bundleName).get(path);
|
|
65
|
+
|
|
66
|
+
return asset;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 根据路径和 Bundle 名称释放资源
|
|
71
|
+
* @param path 资源路径
|
|
72
|
+
* @param bundleName Bundle 名称
|
|
73
|
+
*/
|
|
74
|
+
public releaseAssetPath(path: string, bundleName: string): void {
|
|
75
|
+
const key = this.getAssetKey(path, bundleName);
|
|
76
|
+
const record = this.loadedAssets.get(key);
|
|
77
|
+
if (record) {
|
|
78
|
+
let { asset } = record;
|
|
79
|
+
record.refCount--;
|
|
80
|
+
ResourceManager.instance.LogAssets(bundleName)
|
|
81
|
+
if (record.refCount <= 0) {
|
|
82
|
+
asset.decRef(); // 减少引用计数
|
|
83
|
+
this.loadedAssets.delete(key);
|
|
84
|
+
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* 根据路径和 Bundle 名称释放资源
|
|
91
|
+
* @param path 资源路径
|
|
92
|
+
* @param bundleName Bundle 名称
|
|
93
|
+
*/
|
|
94
|
+
public releaseAsset(node: Node, bundleName: string): void {
|
|
95
|
+
const key = this.assetPath(node)
|
|
96
|
+
const record = this.loadedAssets.get(key);
|
|
97
|
+
if (record) {
|
|
98
|
+
const { asset } = record;
|
|
99
|
+
record.refCount--;
|
|
100
|
+
ResourceManager.instance.LogAssets(bundleName)
|
|
101
|
+
|
|
102
|
+
if (record.refCount <= 0) {
|
|
103
|
+
asset.decRef(); // 减少引用计数
|
|
104
|
+
this.loadedAssets.delete(key);
|
|
105
|
+
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
assetPath(node: Node) {
|
|
111
|
+
return (node["_prefab"]["asset"] as Asset).asset_path;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* 根据 Bundle 名称释放资源
|
|
117
|
+
* @param bundleName Bundle 名称
|
|
118
|
+
*/
|
|
119
|
+
public releaseAssetsByBundle(bundleName: string): void {
|
|
120
|
+
const loadedAssets = new Map(this.loadedAssets)
|
|
121
|
+
loadedAssets.forEach((record, key) => {
|
|
122
|
+
if (record.bundleName === bundleName) {
|
|
123
|
+
const { asset } = record;
|
|
124
|
+
record.refCount--;
|
|
125
|
+
ResourceManager.instance.LogAssets(bundleName)
|
|
126
|
+
if (record.refCount <= 0) {
|
|
127
|
+
asset.decRef(); // 减少引用计数
|
|
128
|
+
//assetManager.releaseAsset(asset);
|
|
129
|
+
this.loadedAssets.delete(key);
|
|
130
|
+
if (asset.refCount > 0) {
|
|
131
|
+
const sys_key = asset.asset_path.replace(asset.asset_path.split(':').shift(), "sys")
|
|
132
|
+
if (!this.loadedAssets.has(sys_key)) {
|
|
133
|
+
this.loadedAssets.set(sys_key, { refCount: asset.refCount, asset, bundleName: "sys:" + bundleName });
|
|
134
|
+
}
|
|
135
|
+
} else {
|
|
136
|
+
const sys_key = asset.asset_path.replace(asset.asset_path.split(':').shift(), "sys:" + bundleName)
|
|
137
|
+
if (this.loadedAssets.has(sys_key)) {
|
|
138
|
+
this.loadedAssets.delete(sys_key);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
//等待系统 释放资源
|
|
145
|
+
clearTimeout(this.timeout)
|
|
146
|
+
this.timeout = setTimeout(() => {
|
|
147
|
+
loadedAssets.forEach((record, key) => {
|
|
148
|
+
if (record.bundleName.includes("sys:")) {
|
|
149
|
+
const { asset } = record;
|
|
150
|
+
//console.error(asset.refCount, asset.name)
|
|
151
|
+
if (asset.refCount <= 0) {
|
|
152
|
+
const asset_info: { uuid: string, path: string } = assetManager.getBundle(record.bundleName.split(":").pop()).getAssetInfo(asset.uuid) as { uuid: string, path: string }
|
|
153
|
+
const sys_key = "sys:" + asset_info.path
|
|
154
|
+
if (this.loadedAssets.has(sys_key)) {
|
|
155
|
+
this.loadedAssets.delete(sys_key);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}, 500)
|
|
161
|
+
// ResourceManager.instance.LogAssetsAll()
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private remove_list: Map<string, { asset: Asset; bundleName: string }> = new Map(); // 记录已加载的资源及其所属 Bundle
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* 释放所有加载的资源
|
|
168
|
+
*/
|
|
169
|
+
public releaseAllAssets(): void {
|
|
170
|
+
this.loadedAssets.forEach((record) => {
|
|
171
|
+
const { asset } = record;
|
|
172
|
+
assetManager.releaseAsset(asset);
|
|
173
|
+
});
|
|
174
|
+
this.loadedAssets.clear(); // 清空记录
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* 获取当前加载的资源数量
|
|
179
|
+
*/
|
|
180
|
+
public getLoadedAssetCount(): number {
|
|
181
|
+
return this.loadedAssets.size;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* 生成资源的唯一键
|
|
187
|
+
* @param path 资源路径
|
|
188
|
+
* @param bundleName Bundle 名称
|
|
189
|
+
* @returns 资源的唯一键
|
|
190
|
+
*/
|
|
191
|
+
private getAssetKey(path: string, bundleName: string): string {
|
|
192
|
+
path = path.replace("/spriteFrame", "")
|
|
193
|
+
return `${bundleName}:${path}`;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
LogAssets(bundleName: string) {
|
|
197
|
+
if (!DEBUG) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
return
|
|
201
|
+
if (!ResConfig.DEBUG) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
let list: { name: string, refCount: number }[] = []
|
|
205
|
+
this.loadedAssets.forEach((record, key) => {
|
|
206
|
+
if (record.bundleName === bundleName) {
|
|
207
|
+
const { asset } = record;
|
|
208
|
+
list.push({ name: asset.name, refCount: asset.refCount })
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
console.warn("资源计数:\n", list)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
LogAssetsAll() {
|
|
215
|
+
if (!DEBUG) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (!ResConfig.DEBUG) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
setTimeout(() => {
|
|
223
|
+
let bundle_map: Map<string, { bundle_name: string, name: string, refCount: number, refCountAsset: number }[]> = new Map()
|
|
224
|
+
this.loadedAssets.forEach((record, key) => {
|
|
225
|
+
if (!bundle_map.has(record.bundleName)) {
|
|
226
|
+
bundle_map.set(record.bundleName, [])
|
|
227
|
+
}
|
|
228
|
+
const list = bundle_map.get(record.bundleName)
|
|
229
|
+
const { asset, refCount } = record;
|
|
230
|
+
list.push({ bundle_name: record.bundleName, name: asset.name, refCount: refCount, refCountAsset: asset.refCount })
|
|
231
|
+
});
|
|
232
|
+
console.warn("资源计数:\n", Array.from(bundle_map.values()))
|
|
233
|
+
|
|
234
|
+
console.warn("资源总数:", assetManager.assets.count)
|
|
235
|
+
console.warn("资源总数:", assetManager.assets)
|
|
236
|
+
}, 500)
|
|
237
|
+
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
//=====================
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* 加载资源并自动记录
|
|
249
|
+
* @param bundleName Bundle 名称
|
|
250
|
+
* @param path 资源路径
|
|
251
|
+
* @param type 资源类型
|
|
252
|
+
* @returns 加载的资源
|
|
253
|
+
*/
|
|
254
|
+
public static getAsset<T extends Asset>(bundleName: string, path: string, type: any) {
|
|
255
|
+
const bundle = assetManager.getBundle(bundleName);
|
|
256
|
+
if (!bundle) {
|
|
257
|
+
throw new Error(`Bundle "${bundleName}" is not loaded.`);
|
|
258
|
+
}
|
|
259
|
+
try {
|
|
260
|
+
// 检查资源是否已加载
|
|
261
|
+
let asset = bundle.get(path);
|
|
262
|
+
if (!asset || asset.name === '') {
|
|
263
|
+
asset = bundle.get(path + '/spriteFrame');
|
|
264
|
+
}
|
|
265
|
+
if (!asset || asset.name === '') {
|
|
266
|
+
//console.error('getAsset报错了1:', bundleName, path)
|
|
267
|
+
}
|
|
268
|
+
return asset as T
|
|
269
|
+
} catch (error) {
|
|
270
|
+
console.error('报错了:', path)
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
public static async loadAsset<T extends Asset>(
|
|
276
|
+
bundleName: string,
|
|
277
|
+
path: string,
|
|
278
|
+
type?: any
|
|
279
|
+
): Promise<T> {
|
|
280
|
+
let bundle = assetManager.getBundle(bundleName);
|
|
281
|
+
if (!bundle) {
|
|
282
|
+
bundle = await new Promise<AssetManager.Bundle>((resolve, reject) => {
|
|
283
|
+
assetManager.loadBundle(bundleName, (err, bundle) => {
|
|
284
|
+
if (err) {
|
|
285
|
+
console.error(`${bundleName}加载失败`);
|
|
286
|
+
reject(err);
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
resolve(bundle);
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
// 检查资源是否已加载
|
|
294
|
+
let asset = bundle.get(path);
|
|
295
|
+
|
|
296
|
+
if (asset) {
|
|
297
|
+
//console.log('已加载==', asset.refCount)
|
|
298
|
+
// 记录加载的资源
|
|
299
|
+
ResourceManager.instance.trackAsset(path, asset, bundleName);
|
|
300
|
+
ResourceManager.instance.LogAssets(bundleName)
|
|
301
|
+
return asset as T;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// 加载资源
|
|
305
|
+
return new Promise<T>((resolve, reject) => {
|
|
306
|
+
bundle.load(path, (err, asset) => {
|
|
307
|
+
if (err) {
|
|
308
|
+
console.error(`${bundleName}-加载资源失败: ${path}`);
|
|
309
|
+
resolve(null);
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
console.log('--加载', path)
|
|
313
|
+
// 记录加载的资源
|
|
314
|
+
ResourceManager.instance.trackAsset(path, asset, bundleName);
|
|
315
|
+
ResourceManager.instance.LogAssets(bundleName)
|
|
316
|
+
|
|
317
|
+
resolve(asset as T);
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// ab.preloadDir("home", (finished: number, total: number, item: any) => {
|
|
323
|
+
// pre(parseInt((finished / total * 100).toFixed(1)));
|
|
324
|
+
// }, () => {
|
|
325
|
+
|
|
326
|
+
// })
|
|
327
|
+
|
|
328
|
+
static async loadBundle(name: string): Promise<AssetManager.Bundle> {
|
|
329
|
+
|
|
330
|
+
const ab = assetManager.getBundle(name)
|
|
331
|
+
if (ab) {
|
|
332
|
+
return ab
|
|
333
|
+
} else {
|
|
334
|
+
var promise = new Promise<AssetManager.Bundle>(resolve => {
|
|
335
|
+
//加载bundle——预制体
|
|
336
|
+
assetManager.loadBundle(name, (err, ab: AssetManager.Bundle) => {
|
|
337
|
+
if (err) {
|
|
338
|
+
console.warn(`bundle名称:${name} `, err);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
resolve(ab);
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
return promise;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
static async preloadDir(bundleName: string, dirName: string, pre: Function) {
|
|
349
|
+
return new Promise<void>(resolve => {
|
|
350
|
+
assetManager.getBundle(bundleName).preloadDir(dirName, (finished: number, total: number, item: any) => {
|
|
351
|
+
pre(Math.floor((finished / total * 100)));
|
|
352
|
+
}, async () => {
|
|
353
|
+
resolve();
|
|
354
|
+
})
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
static async loadDir(bundleName: string, dirName: string, type: any, pre: Function) {
|
|
360
|
+
return new Promise<void>(resolve => {
|
|
361
|
+
//console.warn(bundleName, dirName)
|
|
362
|
+
|
|
363
|
+
assetManager.getBundle(bundleName).loadDir(dirName, type, (finished: number, total: number, item: any) => {
|
|
364
|
+
pre(Math.floor((finished / total * 100)));
|
|
365
|
+
}, async (error, assets) => {
|
|
366
|
+
// 记录加载的资源
|
|
367
|
+
assets.forEach(asset => {
|
|
368
|
+
const asset_info: { uuid: string, path: string } = assetManager.getBundle(bundleName).getAssetInfo(asset.uuid) as { uuid: string, path: string }
|
|
369
|
+
//console.warn(asset_info.path)
|
|
370
|
+
ResourceManager.instance.trackAsset(asset_info.path, asset, bundleName);
|
|
371
|
+
});
|
|
372
|
+
resolve();
|
|
373
|
+
})
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
static runScene(scene: SceneAsset) {
|
|
379
|
+
director.runScene(scene);
|
|
380
|
+
}
|
|
381
|
+
///加载场景
|
|
382
|
+
static async loadScene(bundleName: string, name: string, pre: Function): Promise<SceneAsset> {
|
|
383
|
+
var promise = new Promise<SceneAsset>(async resolve => {
|
|
384
|
+
let bundle = assetManager.getBundle(bundleName)
|
|
385
|
+
// console.warn("-111-加载c错了=", bun);
|
|
386
|
+
if (!bundle) {
|
|
387
|
+
bundle = await new Promise<any>(resolve => {
|
|
388
|
+
assetManager.loadBundle(bundleName, (err, bundle) => {
|
|
389
|
+
resolve(bundle)
|
|
390
|
+
});
|
|
391
|
+
})
|
|
392
|
+
}
|
|
393
|
+
if (bundle) {
|
|
394
|
+
bundle.loadScene(name, SceneAsset, (finished: number, total: number, item: any) => {
|
|
395
|
+
pre(Math.floor((finished / total * 100)));
|
|
396
|
+
}, (err, prefab) => {
|
|
397
|
+
if (err) {
|
|
398
|
+
console.warn("--加载c错了=", bundleName, name, err);
|
|
399
|
+
}
|
|
400
|
+
resolve(prefab);
|
|
401
|
+
});
|
|
402
|
+
} else {
|
|
403
|
+
resolve(null)
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
return promise;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
///加载场景
|
|
410
|
+
static async preloadScene(bundleName: string, name: string, pre: Function): Promise<SceneAsset> {
|
|
411
|
+
var promise = new Promise<SceneAsset>(resolve => {
|
|
412
|
+
const bun = assetManager.getBundle(bundleName)
|
|
413
|
+
if (bun) {
|
|
414
|
+
bun.preloadScene(name, SceneAsset, (finished: number, total: number, item: any) => {
|
|
415
|
+
pre(Math.floor((finished / total * 100)));
|
|
416
|
+
}, (err) => {
|
|
417
|
+
if (err) {
|
|
418
|
+
console.warn("预加载c错了=", bundleName, name, err);
|
|
419
|
+
}
|
|
420
|
+
resolve(null)
|
|
421
|
+
});
|
|
422
|
+
} else {
|
|
423
|
+
resolve(null)
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
return promise;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// 抽象状态基类
|
|
2
|
+
abstract class GameState {
|
|
3
|
+
delegate: IStateMachine;
|
|
4
|
+
constructor(delegate: IStateMachine) {
|
|
5
|
+
this.delegate = delegate;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
abstract enter(): void;
|
|
9
|
+
abstract execute(): void;
|
|
10
|
+
exit(): void {
|
|
11
|
+
console.log(`${this.constructor.name} 状态退出`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export interface IStateMachine {
|
|
15
|
+
/**下一个状态 */
|
|
16
|
+
next(): void;
|
|
17
|
+
/**跳转到指定状态 */
|
|
18
|
+
goToState(index: number): void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// 状态机类
|
|
22
|
+
export class StateMachine implements IStateMachine {
|
|
23
|
+
public states: GameState[];
|
|
24
|
+
private currentStateIndex: number = 0;
|
|
25
|
+
constructor() {
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
private transitionToState(index: number) {
|
|
29
|
+
const currentState = this.states[this.currentStateIndex];
|
|
30
|
+
currentState.exit();
|
|
31
|
+
this.currentStateIndex = index;
|
|
32
|
+
this.states[this.currentStateIndex].enter();
|
|
33
|
+
this.states[this.currentStateIndex].execute();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public next() {
|
|
37
|
+
this.transitionToState(this.currentStateIndex + 1);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public goToState(index: number) {
|
|
41
|
+
if (index >= 0 && index < this.states.length) {
|
|
42
|
+
this.transitionToState(index);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export class GameController {
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 具体状态类:开始游戏
|
|
52
|
+
export class StartGameState extends GameState {
|
|
53
|
+
enter() { console.log("进入游戏..."); }
|
|
54
|
+
execute() {
|
|
55
|
+
console.log("准备开始游戏...");
|
|
56
|
+
setTimeout(() => this.delegate.next(), 1000); // 自动进入下一个状态
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// 具体状态类:游戏中
|
|
61
|
+
export class InGameState extends GameState {
|
|
62
|
+
enter() { console.log("进入游戏中..."); }
|
|
63
|
+
execute() {
|
|
64
|
+
console.log("正在游戏中...");
|
|
65
|
+
setTimeout(() => this.delegate.next(), 1000);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// 具体状态类:弹出选择框
|
|
70
|
+
export class PopupState extends GameState {
|
|
71
|
+
enter() { console.log("弹出选择框..."); }
|
|
72
|
+
execute() {
|
|
73
|
+
console.log("等待玩家选择...");
|
|
74
|
+
setTimeout(() => {
|
|
75
|
+
const choice = prompt("请选择 (确认/取消): ");
|
|
76
|
+
this.onUserChoice(choice || "取消");
|
|
77
|
+
}, 1000);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private onUserChoice(choice: string): void {
|
|
81
|
+
if (choice === "确认") {
|
|
82
|
+
this.delegate.goToState(0)
|
|
83
|
+
} else {
|
|
84
|
+
this.delegate.next()
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// 具体状态类:结束游戏
|
|
90
|
+
export class EndGameState extends GameState {
|
|
91
|
+
enter() { console.log("游戏结束..."); }
|
|
92
|
+
execute() { console.log("感谢您的游玩!"); }
|
|
93
|
+
}
|