[add] Engine

This commit is contained in:
2022-08-26 16:48:17 +08:00
parent f67e566f2a
commit d9c19f096c
197 changed files with 10626 additions and 0 deletions

View File

@@ -0,0 +1,456 @@
import BusinessTypeSetting from "../../_BusinessTypeSetting/BusinessTypeSetting";
import LocalStorageData from "../Data/LocalStorageData";
import Enum_Loading from "../HUDV2/Enum_Loading";
import HUDM from "./HUDM";
export default class AssetBundleMamager {
//#region static 屬性
private static _instance: AssetBundleMamager = null;
public static get Instance(): AssetBundleMamager { return AssetBundleMamager._instance; }
//#endregion
//#region public 屬性
public HUGroup: Map<string, HUDM> = new Map<string, HUDM>();
/** 本地VerList */
public LocalVerList: Enum_Loading.VerListObj = null;
/** 遠端VerList */
public RemoteVerList: Enum_Loading.VerListObj = null;
public DownloadList_Preview: Object = {};
/** IsChangeBundleUrl */
public IsChangeBundleUrl: boolean = false;
//#endregion
//#region Lifecycle
constructor() {
AssetBundleMamager._instance = this;
CC_PREVIEW && this._initdownloadList_Preview();
}
//#endregion
//#region Custom Function
/**
* 取得Bundle
* @param {string} BundleName Bundle名稱
* @param {string} Version 版號
* @return {cc.AssetManager.Bundle} Bundle
*/
public *GetBundle(BundleName: string, Version: string = ""): IterableIterator<cc.AssetManager.Bundle> {
let bundle: cc.AssetManager.Bundle = cc.assetManager.getBundle(BundleName);
if (bundle) {
return bundle;
}
// options是可选参数引擎会根据保留字段 进行对应的操作这里添加了version和onFileProgress可用来记录热更资源版本和下载进度
let options: any = null;
let BundleUrl: string = BundleName;
if (cc.sys.isNative && !this.LocalVerList[BundleName].UseLocal) {
BundleUrl = `${(jsb.fileUtils ? jsb.fileUtils.getWritablePath() : "/")}Bundle/${BundleName}/remote/${BundleName}`;
options = {
version: Version
};
}
cc.assetManager.loadBundle(BundleUrl, options, (err: Error, resp: cc.AssetManager.Bundle) => {
if (err) {
cc.error(err);
bundle = null;
}
bundle = resp;
});
while (typeof bundle === "undefined") {
yield null;
}
return bundle;
}
/**
* 更新Bundle
* @param {HUDM} HUDName HUD
*/
public *UpdateBundle(HUDName: HUDM | string, onFileProgress?: (finish: number, total: number, item: string) => void): IterableIterator<any> {
let HUD: HUDM;
if (HUDName instanceof HUDM) {
HUD = HUDName;
} else {
HUD = this.GetHUD(HUDName);
}
let UpdateingData: Enum_Loading.UpdateingDataObj = yield* HUD.HUD(onFileProgress);
if (UpdateingData.IsUpdatecomplete) {
this.LocalVerList[HUD.BundleName] = this.RemoteVerList[HUD.BundleName];
this.LocalVerList[HUD.BundleName]["UseLocal"] = false;
LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList);
}
return UpdateingData;
}
/**
* 更新Bundle
* @param {HUDM} HUDName HUD
*/
public *RetryUpdateBundle(HUDName: HUDM | string, onFileProgress?: (finish: number, total: number, item: string) => void): IterableIterator<any> {
let HUD: HUDM;
if (HUDName instanceof HUDM) {
HUD = HUDName;
} else {
HUD = this.GetHUD(HUDName);
}
let UpdateingData: Enum_Loading.UpdateingDataObj = yield* HUD.RetryDownLoadFailedAssets();
return UpdateingData;
}
/**
* 從Bundle取得資源
* @param {cc.AssetManager.Bundle | string} BundleName Bundle名稱
* @param {string} SourceName 資源名稱
* @param {string} type 資源型別
* @return {any} Source
*/
public *GetBundleSource(BundleName: cc.AssetManager.Bundle | string, SourceName: string, type?: string | Bundle_Source_Type, onFileProgress?: (finish: number, total: number, item: cc.AssetManager.RequestItem) => void): IterableIterator<any> {
let bundle: cc.AssetManager.Bundle;
let source: any;
if (BundleName instanceof cc.AssetManager.Bundle) {
bundle = BundleName;
} else {
bundle = cc.assetManager.getBundle(BundleName);
if (!bundle) {
cc.error(`GetBundleSource Error BundleName: ${BundleName}`);
return null;
}
}
switch (type) {
case Bundle_Source_Type.Scene: {
bundle.loadScene(SourceName, onFileProgress, function (err: Error, scene: cc.SceneAsset): void {
if (err) {
cc.error(err);
return null;
}
// cc.director.runScene(scene);
source = scene;
});
break;
}
case Bundle_Source_Type.Json: {
bundle.load(SourceName, onFileProgress, function (err: Error, json: cc.JsonAsset): void {
if (err) {
cc.error(err);
return null;
}
// source = JSON.parse(json["_nativeAsset"]);
source = json;
});
break;
}
case Bundle_Source_Type.Prefab: {
bundle.load(SourceName, cc.Prefab, onFileProgress, function (err: Error, prefab: cc.Asset): void {
if (err) {
cc.error(err);
return null;
}
// source = JSON.parse(json["_nativeAsset"]);
source = prefab;
});
break;
}
default:
bundle.load(SourceName, function (err: Error, any: any): void {
if (err) {
cc.error(err);
return null;
}
source = any;
});
break;
}
while (typeof source === "undefined") {
yield null;
}
return source;
}
/**
* 釋放Bundle
* @param {string} slotID slotID
*/
public *BundleRelease(slotID: number): IterableIterator<any> {
let gameName: string = `Game_${slotID}`;
let sceneName: string = `Slot${slotID}`;
let bundle: cc.AssetManager.Bundle = cc.assetManager.getBundle(gameName);
if (!bundle) {
cc.log(`BundleRelease Error BundleName: ${gameName}`);
return;
}
// let bundles: cc.AssetManager.Cache<cc.AssetManager.Bundle> = cc.assetManager.bundles;
// let cacheDir: string = cc.assetManager.cacheManager.cacheDir;
// let cachedFiles: Object = cc.assetManager.cacheManager.cachedFiles;
yield* this.DelBundleCache(bundle);
yield* this.DelOthersCache(slotID);
bundle.release(sceneName, cc.SceneAsset);
cc.assetManager.removeBundle(bundle);
cc.sys.garbageCollect();
}
/**
* 從Bundle刪除暫存資源
* @param {string} BundleName Bundle名稱
*/
public *DelBundleCache(BundleName: cc.AssetManager.Bundle | string): IterableIterator<any> {
if (!CC_JSB) {
return;
}
let bundle: cc.AssetManager.Bundle;
let source: any;
if (BundleName instanceof cc.AssetManager.Bundle) {
bundle = BundleName;
} else {
bundle = cc.assetManager.getBundle(BundleName);
if (!bundle) {
// cc.error(`GetBundleSource Error BundleName: ${BundleName}`);
// return;
bundle = yield* AssetBundleMamager.Instance.GetBundle(BundleName, this.RemoteVerList[BundleName].Version);
}
}
let _map: Object = bundle["_config"].assetInfos._map;
for (let map of Object.keys(_map)) {
let path: string = _map[map].path;
if (!path) {
break;
}
source = yield* AssetBundleMamager.Instance.GetBundleSource(bundle, path);
cc.assetManager.cacheManager.removeCache(source.nativeUrl);
bundle.release(path);
// return;
}
}
/**
* 從cachedFiles刪除暫存資源
* @param {number} slotID slotID
*/
public *DelOthersCache(slotID: number): IterableIterator<any> {
if (!CC_JSB) {
return;
}
let cachedFiles: Object = cc.assetManager.cacheManager.cachedFiles["_map"];
let delcache_group: string[] = [`shared/jsons`, `Slot/Slot${slotID}`, "sounds/Slot/Default", `${BusinessTypeSetting.FolderUrlBundle}project.manifest`, "submit.txt"];
for (let cached of Object.keys(cachedFiles)) {
for (var i: number = 0; i < delcache_group.length; ++i) {
let delcache: string = delcache_group[i];
if (cached.includes(delcache)) {
cc.assetManager.cacheManager.removeCache(cached);
// console.log(`removeCache: ${cached}`);
break;
}
}
}
}
public GetHUD(BundleName: HUDM | string): HUDM {
let HUD: HUDM;
if (BundleName instanceof HUDM) {
HUD = BundleName;
} else {
if (!this.HUGroup.has(BundleName)) {
HUD = new HUDM(BundleName);
this.HUGroup.set(BundleName, HUD);
} else {
HUD = this.HUGroup.get(BundleName);
}
HUD = this.HUGroup.get(BundleName);
}
return HUD;
}
/** 刪除全部暫存資源 */
public ClearAllCache(): void {
cc.assetManager.cacheManager.clearCache();
cc.game.restart();
}
public *CheckBundleNeedHUD(BundleName: HUDM | string): IterableIterator<Enum_Loading.NeedUpdateDataObj> {
let HUD: HUDM;
if (BundleName instanceof HUDM) {
HUD = BundleName;
} else {
HUD = this.GetHUD(BundleName);
}
if (!this.LocalVerList[HUD.BundleName]) {
this.LocalVerList[HUD.BundleName] = new Enum_Loading.BundleDataObj();
let apkVersion: string = this.RemoteVerList[HUD.BundleName].ApkVersion;
if (apkVersion && apkVersion !== "0") {
this.LocalVerList[HUD.BundleName].UseLocal = true;
this.LocalVerList[HUD.BundleName].Version = apkVersion;
}
LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList);
} else {
if (this.RemoteVerList[HUD.BundleName].Version === this.RemoteVerList[HUD.BundleName].ApkVersion) {
this.LocalVerList[HUD.BundleName] = this.RemoteVerList[HUD.BundleName];
this.LocalVerList[HUD.BundleName].UseLocal = true;
}
}
let UpdateData: Enum_Loading.NeedUpdateDataObj = new Enum_Loading.NeedUpdateDataObj();
if (this.LocalVerList[HUD.BundleName].UseLocal) {
UpdateData.IsNeedUpdate = AssetBundleMamager.Instance.versionCompareHandle(this.LocalVerList[HUD.BundleName].Version, this.RemoteVerList[HUD.BundleName].Version) < 0 ? true : false;
if (UpdateData.IsNeedUpdate) {
UpdateData = yield* HUD.CheckUpdate();
}
} else {
UpdateData = yield* HUD.CheckUpdate();
}
return UpdateData;
}
// public *CheckBundleNeedHUD(BundleName: string): IterableIterator<boolean> {
// if (!this.LocalVerList[BundleName]) {
// this.LocalVerList[BundleName] = new Enum_Loading.BundleDataObj();
// let apkVersion: string = this.RemoteVerList[BundleName].ApkVersion;
// if (apkVersion && apkVersion !== "0") {
// this.LocalVerList[BundleName].UseLocal = true;
// this.LocalVerList[BundleName].Version = apkVersion;
// }
// LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList);
// }
// let IsUpdate: boolean = AssetBundleMamager.Instance.versionCompareHandle(this.LocalVerList[BundleName].Version, this.RemoteVerList[BundleName].Version) < 0 ? true : false;
// return IsUpdate;
// }
public CheckGameNeedUpdate(GameID: number): boolean {
let IsUpdate: boolean = false;
let bundleName: string = `Game_${GameID}`;
if (!this.RemoteVerList[bundleName]) {
this.RemoteVerList[bundleName] = new Enum_Loading.BundleDataObj();
this.RemoteVerList[bundleName].HasBundle = false;
LocalStorageData.Instance.RemoteVerList = JSON.stringify(this.RemoteVerList);
IsUpdate = true;
}
if (!this.LocalVerList[bundleName]) {
this.LocalVerList[bundleName] = new Enum_Loading.BundleDataObj();
let apkVersion: string = this.RemoteVerList[bundleName].ApkVersion;
if (apkVersion && apkVersion !== "0") {
this.LocalVerList[bundleName].UseLocal = true;
this.LocalVerList[bundleName].Version = apkVersion;
}
LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList);
}
if (CC_PREVIEW) {
return this._getIsDownload_Preview(GameID);
}
if (IsUpdate) {
return IsUpdate;
}
IsUpdate = AssetBundleMamager.Instance.versionCompareHandle(this.LocalVerList[bundleName].Version, this.RemoteVerList[bundleName].Version) < 0 ? true : false;
return IsUpdate;
}
/**
* 比對版號(熱更能從1.0.0更新到2.0.0從2.0.0回退到1.0.0)
* 官方提供的版本比較函數,只有服務端版本>客戶端版本時才會進行更新。所以不能從2.0.0回退到1.0.0版本。
* @param {string} versionA 本地版號
* @param {string} versionB 遠程版號
* @return {number} num = -1 須更新
* @return {number} num = 0 不須更新
*/
public versionCompareHandle(versionA: string, versionB: string): number {
// console.log("Ver A " + versionA + "VerB " + versionB);
var vA: string[] = versionA.split(".");
var vB: string[] = versionB.split(".");
// 長度不相等,則進行更新
if (vA.length !== vB.length) {
return -1;
}
for (var i: number = 0; i < vA.length; ++i) {
var a: number = +vA[i];
var b: number = +vB[i] || 0;
if (a === b) {
// 數字相同,則跳過
continue;
} else {
// 數字不同,則進行更新
return -1;
}
}
// 長度相等且數字相等,則不更新
return 0;
}
//#endregion
//#region DownloadList_Preview
private _initdownloadList_Preview(): void {
this.DownloadList_Preview = JSON.parse(LocalStorageData.Instance.DownloadList_Preview);
this.DownloadList_Preview = this.DownloadList_Preview ? this.DownloadList_Preview : {};
}
private _getIsDownload_Preview(slotID: number): boolean {
if (!this.DownloadList_Preview[slotID]) {
this.SetIsDownload_Preview(slotID, false);
}
return !this.DownloadList_Preview[slotID];
}
public SetIsDownload_Preview(slotID: number, isDownload: boolean = true): void {
this.DownloadList_Preview[slotID] = isDownload;
LocalStorageData.Instance.DownloadList_Preview = JSON.stringify(this.DownloadList_Preview);
}
//#endregion
}
//#region enum
/** Bundle資源類型 */
export enum Bundle_Source_Type {
/** Json */
Json = "json",
/** Scene */
Scene = "scene",
/** Prefab */
Prefab = "prefab"
}
//#endregion
//#region 廢棄 Function
// /**
// * 從Bundle刪除暫存資源
// * @param {string} BundleName Bundle名稱
// */
// public *DelBundleCache(BundleName: cc.AssetManager.Bundle | string): IterableIterator<any> {
// if (!CC_JSB) {
// return;
// }
// let WritablePath: string = `${jsb.fileUtils.getWritablePath()}gamecaches/${BundleName}`;
// if (jsb.fileUtils.isDirectoryExist(WritablePath)) {
// jsb.fileUtils.removeDirectory(WritablePath);
// }
// }
//#endregion

View File

@@ -0,0 +1,10 @@
{
"ver": "1.1.0",
"uuid": "97a0b2c9-72f8-4797-874a-263e4558f765",
"importer": "typescript",
"isPlugin": false,
"loadPluginInWeb": true,
"loadPluginInNative": true,
"loadPluginInEditor": false,
"subMetas": {}
}

View File

@@ -0,0 +1,425 @@
import BusinessTypeSetting from "../../_BusinessTypeSetting/BusinessTypeSetting";
import Enum_Loading from "../HUDV2/Enum_Loading";
import AssetBundleMamager from "./AssetBundleMamager";
const { ccclass, property } = cc._decorator;
/** HUDManager */
@ccclass
export default class HUDM extends cc.Component {
//#region static 屬性
private static _instance: HUDM = null;
public static get Instance(): HUDM { return HUDM._instance; }
//#endregion
//#region static 屬性
public BundleName: string = "";
//#endregion
//#region private 屬性
private _am: jsb.AssetsManager;
private _onFileProgress: (finish: number, total: number, item: string) => void;
private _updateListener: any;
private _checkListener: any;
private _versionCompareHandle: any = null;
private _needUpdateData: Enum_Loading.NeedUpdateDataObj = null;
private _updateingData: Enum_Loading.UpdateingDataObj = null;
private _updating: boolean = false;
private _canRetry: boolean = false;
private _isChangeUrl: boolean = false;
private _path: string = "Bundle";
private _customManifest: string = "";
private _storagePath: string = "";
//#endregion
//#region Lifecycle
constructor(...params: any[]) {
super();
if (!cc.sys.isNative) {
return;
} else if (params.length === 0) {
return;
}
HUDM._instance = this;
this.BundleName = params[0];
// let packageUrl: string = params[1];
// let BundleData: Enum_Loading.BundleDataObj = AssetBundleMamager.Instance.RemoteVerList[this.BundleName];
// let packageUrl: string = BundleData.BundleUrl;
let packageUrl: string = `${BusinessTypeSetting.UsePatch}${BusinessTypeSetting.FolderUrlBundle}${this.BundleName}`;
this._customManifest = JSON.stringify({
"packageUrl": packageUrl,
"remoteManifestUrl": `${packageUrl}/project.manifest`,
"remoteVersionUrl": `${packageUrl}/version.json`,
"version": "0.0.0",
});
this._storagePath = `${(jsb.fileUtils ? jsb.fileUtils.getWritablePath() : "./")}${this._path}/${this.BundleName}`;
// 本地熱更目錄下已存在project.manifest則直接修改已存在的project.manifest
if (AssetBundleMamager.Instance.IsChangeBundleUrl) {
if (jsb.fileUtils.isFileExist(this._storagePath + "/project.manifest")) {
this._isChangeUrl = true;
this._modifyAppLoadUrlForManifestFile(this._storagePath, packageUrl);
}
}
this._versionCompareHandle = function (versionA: string, versionB: string): number {
// console.log("Ver A " + versionA + "VerB " + versionB);
var vA: string[] = versionA.split(".");
var vB: string[] = versionB.split(".");
// 長度不相等,則進行更新
if (vA.length !== vB.length) {
return -1;
}
for (var i: number = 0; i < vA.length; ++i) {
var a: number = +vA[i];
var b: number = +vB[i] || 0;
if (a === b) {
// 數字相同,則跳過
continue;
} else {
// 數字不同,則進行更新
return -1;
}
}
// 長度相等且數字相等,則不更新
return 0;
};
this._initAssetManaget();
}
private _initAssetManaget(): void {
//
this._am = new jsb.AssetsManager("", this._storagePath, this._versionCompareHandle);
// Setup the verification callback, but we don't have md5 check function yet, so only print some message
// Return true if the verification passed, otherwise return false
this._am.setVerifyCallback(function (path: any, asset: { compressed: any; md5: any; path: any; size: any; }): boolean {
// When asset is compressed, we don't need to check its md5, because zip file have been deleted.
var compressed: any = asset.compressed;
// Retrieve the correct md5 value.
var expectedMD5: string = asset.md5;
// asset.path is relative path and path is absolute.
var relativePath: string = asset.path;
// The size of asset file, but this value could be absent.
var size: any = asset.size;
if (compressed) {
// panel.info.string = "Verification passed : " + relativePath;
// cc.log("onLoad -> Verification passed : " + relativePath);
return true;
} else {
// panel.info.string = "Verification passed : " + relativePath + ' (' + expectedMD5 + ')';
// cc.log("onLoad -> setVerifyCallbackVerification passed : " + relativePath + " (" + expectedMD5 + ")");
return true;
}
});
if (cc.sys.os === cc.sys.OS_ANDROID) {
// Some Android device may slow down the download process when concurrent tasks is too much.
// The value may not be accurate, please do more test and find what's most suitable for your game.
// this._am.setMaxConcurrentTask(10);
this._am["setMaxConcurrentTask"](10);
// this.panel.info.string = "Max concurrent tasks count have been limited to 2";
// cc.log("onLoad -> Max concurrent tasks count have been limited to 10");
}
}
private _modifyAppLoadUrlForManifestFile(filePath: string, newBundleUrl: string): void {
let allpath: string[] = [filePath, filePath + "_temp"];
let manifestname: string[] = ["project.manifest", "project.manifest.temp"];
for (var i: number = 0; i < allpath.length; ++i) {
let path: string = `${allpath[i]}/${manifestname[i]}`;
if (jsb.fileUtils.isFileExist(path)) {
// console.log(`[HUD] modifyAppLoadUrlForManifestFile: 有下載的manifest文件直接修改熱更地址`);
// 修改project.manifest
let projectManifest: string = jsb.fileUtils.getStringFromFile(path);
let projectManifestObj: any = JSON.parse(projectManifest);
projectManifestObj.packageUrl = newBundleUrl;
projectManifestObj.remoteManifestUrl = newBundleUrl + "/project.manifest";
projectManifestObj.remoteVersionUrl = newBundleUrl + "/version.json";
let afterString: string = JSON.stringify(projectManifestObj);
let isWrittenProject: boolean = jsb.fileUtils.writeStringToFile(afterString, path);
// // 更新數據庫中的新請求地址,下次如果檢測到不一致就重新修改 manifest 文件
// if (isWrittenProject) {
// LocalStorageData.Instance.BundleUrl = BusinessTypeSetting.UsePatch;
// }
// console.log("[HUD] 修改是否成功,project.manifest:", isWrittenProject);
// console.log("[HUD] 修改後文件:", projectManifestObj.packageUrl, projectManifestObj.remoteManifestUrl, projectManifestObj.remoteVersionUrl);
}
}
}
//#endregion
public *CheckUpdate(): IterableIterator<any> {
this._needUpdateData = null;
if (this._updating) {
// this.panel.info.string = 'Checking or updating ...';
console.error("checkUpdate -> Checking or updating ...");
return;
}
if (this._am.getState() === jsb.AssetsManager.State.UNINITED) {
let manifest: jsb.Manifest = new jsb.Manifest(this._customManifest, this._storagePath);
this._am.loadLocalManifest(manifest, this._storagePath);
}
if (!this._am.getLocalManifest() || !this._am.getLocalManifest().isLoaded()) {
// this.tipsLabel.string = "Failed to load local manifest ...";
console.error("checkUpdate -> Failed to load local manifest ...");
return;
}
this._am.setEventCallback(this.checkCb.bind(this));
this._am.checkUpdate();
this._updating = true;
while (this._needUpdateData === null) {
yield null;
}
let newBundleUrl: string = `${BusinessTypeSetting.UsePatch}${BusinessTypeSetting.FolderUrlBundle}${this.BundleName}`;
this._modifyAppLoadUrlForManifestFile(this._storagePath, newBundleUrl);
this._initAssetManaget();
let manifest: jsb.Manifest = new jsb.Manifest(this._customManifest, this._storagePath);
this._am.loadLocalManifest(manifest, this._storagePath);
if (!this._am.getLocalManifest() || !this._am.getLocalManifest().isLoaded()) {
// this.tipsLabel.string = "Failed to load local manifest ...";
console.error("checkUpdate -> Failed to load local manifest ...");
return;
}
// 更新動態路徑後再跑一次
this._am.setEventCallback(this.checkCb.bind(this));
this._needUpdateData = null;
this._am.checkUpdate();
this._updating = true;
while (this._needUpdateData === null) {
yield null;
}
if (this._isChangeUrl && (!this._needUpdateData.IsNeedUpdate || this._needUpdateData.TotalBytes === "0 B")) {
if (jsb.fileUtils.isFileExist(this._storagePath)) {
let isremoveDirectory: boolean = jsb.fileUtils.removeDirectory(this._storagePath);
let isremoveDirectory_temp: boolean = jsb.fileUtils.removeDirectory(this._storagePath + "_temp");
if (isremoveDirectory_temp) {
console.log(`removeDirectory: ${this._storagePath}_temp`);
}
if (isremoveDirectory) {
console.log(`removeDirectory: ${this._storagePath}`);
this._needUpdateData = null;
this._initAssetManaget();
this._needUpdateData = yield* this.CheckUpdate();
}
}
}
return this._needUpdateData;
}
private checkCb(event: jsb.EventAssetsManager): void {
var failed: boolean = false;
switch (event.getEventCode()) {
case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
// this.tipsLabel.string = "No local manifest file found, HUD skipped.";
console.error("checkCb -> No local manifest file found, HUD skipped.");
failed = true;
break;
case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
// this.tipsLabel.string = "Fail to download manifest file, HUD skipped.";
console.error("checkCb -> Fail to download manifest file, HUD skipped.");
failed = true;
break;
case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
// this.tipsLabel.string = "Already up to date with the latest remote version.";
// cc.log("checkCb -> Already up to date with the latest remote version.");
this._needUpdateData = new Enum_Loading.NeedUpdateDataObj(false);
break;
case jsb.EventAssetsManager.NEW_VERSION_FOUND:
// this.downloadLabel.node.active = true;
// this.downloadLabel.string = "New version found, please try to update." + event.getTotalBytes();
// this.panel.checkBtn.active = false;
// this.panel.fileProgress.progress = 0;
// this.panel.byteProgress.progress = 0;
// cc.log("checkCb -> New version found, please try to update." + event.getTotalBytes());
this._needUpdateData = new Enum_Loading.NeedUpdateDataObj(true, this._bytesToSize(event.getTotalBytes()));
break;
default:
return;
}
this._am.setEventCallback(null);
this._checkListener = null;
this._updating = false;
if (failed) {
//
}
}
public *HUD(onFileProgress?: (finish: number, total: number, item: string) => void): IterableIterator<any> {
this._updateingData = null;
if (this._am && !this._updating) {
this._am.setEventCallback(this._updateCb.bind(this));
if (this._am.getState() === jsb.AssetsManager.State.UNINITED) {
let manifest: jsb.Manifest = new jsb.Manifest(this._customManifest, this._storagePath);
this._am.loadLocalManifest(manifest, this._storagePath);
}
this._onFileProgress = onFileProgress ? onFileProgress : null;
this._am.update();
this._updating = true;
while (this._updateingData === null) {
yield null;
}
return this._updateingData;
} else {
return new Enum_Loading.UpdateingDataObj(false);
}
}
private _updateCb(event: jsb.EventAssetsManager): void {
var needRestart: boolean = false;
var failed: boolean = false;
switch (event.getEventCode()) {
case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
// this.panel.info.string = 'No local manifest file found, HUD skipped.';
cc.log("updateCb -> No local manifest file found, HUD skipped.");
failed = true;
break;
case jsb.EventAssetsManager.UPDATE_PROGRESSION:
// this.panel.byteProgress.progress = event.getPercent();
// this.panel.fileProgress.progress = event.getPercentByFile();
// this.panel.fileLabel.string = event.getDownloadedFiles() + ' / ' + event.getTotalFiles();
// this.tipsLabel.string = event.getDownloadedBytes() + " / " + event.getTotalBytes();
// cc.log("updateCb -> " + event.getDownloadedBytes() + " / " + event.getTotalBytes());
// var msg: string = event.getMessage();
// if (msg) {
// // this.panel.info.string = 'Updated file: ' + msg;
// cc.log("updateCb -> Updated file: " + msg);
// console.log("updateCb -> " + event.getPercent() / 100 + "% : " + msg);
// }
var msg: string = event.getMessage();
if (this._onFileProgress) {
this._onFileProgress(event.getDownloadedBytes(), event.getTotalBytes(), msg ? msg : "");
}
break;
case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
// this.panel.info.string = 'Fail to download manifest file, HUD skipped.';
console.error("updateCb -> Fail to download manifest file, HUD skipped.");
failed = true;
break;
case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
// this.panel.info.string = 'Already up to date with the latest remote version.';
console.error("updateCb -> Already up to date with the latest remote version.");
failed = true;
break;
case jsb.EventAssetsManager.UPDATE_FINISHED:
// this.tipsLabel.string = "更新完成. " + event.getMessage();
// cc.log("updateCb -> 更新完成. " + event.getMessage());
this._updateingData = new Enum_Loading.UpdateingDataObj(true);
needRestart = true;
break;
case jsb.EventAssetsManager.UPDATE_FAILED:
// this.panel.info.string = 'Update failed. ' + event.getMessage();
console.error("updateCb -> Update failed. " + event.getMessage());
// this.panel.retryBtn.active = true;
this._canRetry = true;
this._updateingData = new Enum_Loading.UpdateingDataObj(false);
this._updating = false;
break;
case jsb.EventAssetsManager.ERROR_UPDATING:
// this.panel.info.string = 'Asset update error: ' + event.getAssetId() + ', ' + event.getMessage();
console.error("updateCb -> Asset update error: " + event.getAssetId() + ", " + event.getMessage());
break;
case jsb.EventAssetsManager.ERROR_DECOMPRESS:
// this.panel.info.string = event.getMessage();
console.error("updateCb -> " + event.getMessage());
break;
default:
break;
}
if (failed) {
this._am.setEventCallback(null);
this._updateListener = null;
this._updating = false;
}
// 測試先不restart 之後看情況
// if (needRestart) {
// this._am.setEventCallback(null);
// this._updateListener = null;
// // Prepend the manifest's search path
// var searchPaths: string[] = jsb.fileUtils.getSearchPaths();
// // var newPaths = this._am.getLocalManifest().getSearchPaths();
// // cc.log("newPath."+JSON.stringify(newPaths));
// // Array.prototype.unshift.apply(searchPaths, newPaths);
// cc.sys.localStorage.setItem("HUDSearchPaths", JSON.stringify(searchPaths));
// jsb.fileUtils.setSearchPaths(searchPaths);
// cc.audioEngine.stopAll();
// cc.game.restart();
// }
}
public *RetryDownLoadFailedAssets(): IterableIterator<any> {
if (!this._updating && this._canRetry) {
this._updateingData = null;
// this.panel.retryBtn.active = false;
this._canRetry = false;
// this.panel.info.string = 'Retry failed Assets...';
// cc.log("retry -> Retry failed Assets...");
this._am.downloadFailedAssets();
while (this._updateingData === null) {
yield null;
}
return this._updateingData;
} else {
console.error(`retry -> error updating: ${this._updating}, canRetry: ${this._canRetry}`);
this._updateingData = new Enum_Loading.UpdateingDataObj(false);
}
}
private _bytesToSize(bytes: number): string {
if (bytes === 0) {
return "0 B";
}
let k: number = 1024;
let sizes: string[] = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
let i: number = Math.floor(Math.log(bytes) / Math.log(k));
return (bytes / Math.pow(k, i)).toPrecision(3) + " " + sizes[i];
}
protected onDestroy(): void {
if (this._updateListener) {
this._am.setEventCallback(null);
this._updateListener = null;
}
}
}

View File

@@ -0,0 +1,10 @@
{
"ver": "1.1.0",
"uuid": "dd9501f7-957a-4e62-8630-d43f62d171d1",
"importer": "typescript",
"isPlugin": false,
"loadPluginInWeb": true,
"loadPluginInNative": true,
"loadPluginInEditor": false,
"subMetas": {}
}