[del] HUD
This commit is contained in:
parent
e5b166415f
commit
370f0e99db
13
assets/Script/Engine/CatanEngine/TableV3.meta
Normal file
13
assets/Script/Engine/CatanEngine/TableV3.meta
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"ver": "1.1.3",
|
||||
"uuid": "c12c11f7-2e17-4727-a114-d4b19dfbe650",
|
||||
"importer": "folder",
|
||||
"isBundle": false,
|
||||
"bundleName": "",
|
||||
"priority": 1,
|
||||
"compressionType": {},
|
||||
"optimizeHotUpdate": {},
|
||||
"inlineSpriteFrames": {},
|
||||
"isRemoteBundle": {},
|
||||
"subMetas": {}
|
||||
}
|
13
assets/Script/Engine/Component.meta
Normal file
13
assets/Script/Engine/Component.meta
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"ver": "1.1.3",
|
||||
"uuid": "63dab366-ead1-4057-a9c2-a2548219328e",
|
||||
"importer": "folder",
|
||||
"isBundle": false,
|
||||
"bundleName": "",
|
||||
"priority": 1,
|
||||
"compressionType": {},
|
||||
"optimizeHotUpdate": {},
|
||||
"inlineSpriteFrames": {},
|
||||
"isRemoteBundle": {},
|
||||
"subMetas": {}
|
||||
}
|
13
assets/Script/Engine/Data.meta
Normal file
13
assets/Script/Engine/Data.meta
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"ver": "1.1.3",
|
||||
"uuid": "edf98a7e-294c-4e7a-8a53-c0b10ea75a45",
|
||||
"importer": "folder",
|
||||
"isBundle": false,
|
||||
"bundleName": "",
|
||||
"priority": 1,
|
||||
"compressionType": {},
|
||||
"optimizeHotUpdate": {},
|
||||
"inlineSpriteFrames": {},
|
||||
"isRemoteBundle": {},
|
||||
"subMetas": {}
|
||||
}
|
@ -1,456 +0,0 @@
|
||||
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
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"ver": "1.1.0",
|
||||
"uuid": "97a0b2c9-72f8-4797-874a-263e4558f765",
|
||||
"importer": "typescript",
|
||||
"isPlugin": false,
|
||||
"loadPluginInWeb": true,
|
||||
"loadPluginInNative": true,
|
||||
"loadPluginInEditor": false,
|
||||
"subMetas": {}
|
||||
}
|
@ -1,425 +0,0 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"ver": "1.1.0",
|
||||
"uuid": "dd9501f7-957a-4e62-8630-d43f62d171d1",
|
||||
"importer": "typescript",
|
||||
"isPlugin": false,
|
||||
"loadPluginInWeb": true,
|
||||
"loadPluginInNative": true,
|
||||
"loadPluginInEditor": false,
|
||||
"subMetas": {}
|
||||
}
|
@ -1,522 +0,0 @@
|
||||
import BusinessTypeSetting from "../../_BusinessTypeSetting/BusinessTypeSetting";
|
||||
import { CoroutineV2 } from "../CatanEngine/CoroutineV2/CoroutineV2";
|
||||
import LocalStorageData from "../Data/LocalStorageData";
|
||||
import Enum_Loading from "./Enum_Loading";
|
||||
|
||||
export default class AssetBundleMamagerV2 {
|
||||
//#region static 屬性
|
||||
|
||||
private static _instance: AssetBundleMamagerV2 = null;
|
||||
public static get Instance(): AssetBundleMamagerV2 { return AssetBundleMamagerV2._instance; }
|
||||
|
||||
//#endregion
|
||||
|
||||
//#region public 屬性
|
||||
|
||||
/** 本地VerList */
|
||||
public LocalVerList: Enum_Loading.VerListObj = null;
|
||||
|
||||
/** 遠端VerList */
|
||||
public RemoteVerList: JSON = null;
|
||||
|
||||
public DownloadList_Preview: Object = {};
|
||||
|
||||
/** 快取資源 */
|
||||
public CachedFiles: Map<string, cc.Asset> = new Map<string, cc.Asset>();
|
||||
|
||||
//#endregion
|
||||
|
||||
//#region Lifecycle
|
||||
|
||||
constructor() {
|
||||
AssetBundleMamagerV2._instance = this;
|
||||
CC_PREVIEW && this._initdownloadList_Preview();
|
||||
}
|
||||
|
||||
//#endregion
|
||||
|
||||
//#region 清除資料
|
||||
|
||||
/** 判斷更改編譯版號.清除BUNDLE記錄 */
|
||||
public CheckCompileVersion(): void {
|
||||
let oldCompileVersion: string = LocalStorageData.Instance.CompileVersion;
|
||||
let newCompileVersion: string = BusinessTypeSetting.COMPILE_VERSION;
|
||||
if (oldCompileVersion && oldCompileVersion !== newCompileVersion) {
|
||||
this.ClearBundleData();
|
||||
console.log("change compile version.");
|
||||
}
|
||||
LocalStorageData.Instance.CompileVersion = BusinessTypeSetting.COMPILE_VERSION;
|
||||
}
|
||||
|
||||
/** 判斷更改PATCH環境.清除BUNDLE記錄 */
|
||||
public CheckChangePatchUrl(): void {
|
||||
let oldBundleUrl: string = LocalStorageData.Instance.BundleUrl;
|
||||
let newBundleUrl: string = BusinessTypeSetting.UsePatch;
|
||||
if (oldBundleUrl && oldBundleUrl !== newBundleUrl) {
|
||||
this.ClearBundleData();
|
||||
console.log("change patch url.");
|
||||
}
|
||||
LocalStorageData.Instance.BundleUrl = BusinessTypeSetting.UsePatch;
|
||||
}
|
||||
|
||||
/** 清除Bundle資料 */
|
||||
public ClearBundleData(): void {
|
||||
cc.sys.localStorage.removeItem("LocalVerList");
|
||||
cc.sys.localStorage.removeItem("RemoteVerList");
|
||||
cc.assetManager.bundles.clear();
|
||||
if (CC_JSB) {
|
||||
cc.assetManager.cacheManager.clearCache();
|
||||
console.log("clear bundle data.");
|
||||
}
|
||||
}
|
||||
|
||||
/** 清除所有資料重啟 */
|
||||
public ClearAppDataToRestart(): void {
|
||||
cc.sys.localStorage.clear();
|
||||
cc.assetManager.bundles.clear();
|
||||
if (CC_JSB) {
|
||||
cc.assetManager.cacheManager.clearCache();
|
||||
cc.game.restart();
|
||||
} else {
|
||||
window.location.reload();
|
||||
}
|
||||
}
|
||||
|
||||
//#endregion
|
||||
|
||||
//#region Custom Function
|
||||
|
||||
/**
|
||||
* 取得Bundle
|
||||
* @param {string} BundleName Bundle名稱
|
||||
* @param {string} Version 版號
|
||||
* @return {cc.AssetManager.Bundle} Bundle
|
||||
*/
|
||||
public *GetBundle(BundleName: string): IterableIterator<cc.AssetManager.Bundle> {
|
||||
let self: this = this;
|
||||
let bundle: cc.AssetManager.Bundle | boolean = cc.assetManager.getBundle(BundleName);
|
||||
if (bundle) {
|
||||
yield* this.GetDepsBundle(bundle.deps);
|
||||
return bundle;
|
||||
}
|
||||
/** 判斷是不是要下載新版本 */
|
||||
let isNeedUpdate: boolean = this.IsNeedUpdate(BundleName);
|
||||
if (isNeedUpdate) {
|
||||
// 下載新版本前需要先清除暫存
|
||||
console.log(`removeCache: ${BundleName}`);
|
||||
this.DelBundleCache(BundleName);
|
||||
this.LocalVerList[BundleName].UseLocal = false;
|
||||
}
|
||||
/** Bundle路徑 */
|
||||
let BundleUrl: string = BusinessTypeSetting.GetRemoteFileUrl(BundleName);
|
||||
if (CC_DEV) {
|
||||
// CC_DEVBundle路徑為: BundleName
|
||||
// if (BundleName.indexOf("Script") != -1) {
|
||||
BundleUrl = `${BundleName}`;
|
||||
// } else {
|
||||
// BundleUrl = "http://192.168.7.57/bj_casino/test/" + BundleName;
|
||||
// }
|
||||
} else if (this.LocalVerList[BundleName].UseLocal) {
|
||||
// 本地Bundle路徑為: assets/assets/${BundleName}
|
||||
BundleUrl = `assets/${BundleName}`;
|
||||
}
|
||||
if (CC_DEV) {
|
||||
cc.assetManager.loadBundle(BundleUrl, (err: Error, resp: cc.AssetManager.Bundle) => {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
bundle = null;
|
||||
return;
|
||||
}
|
||||
bundle = resp;
|
||||
});
|
||||
while (typeof bundle === "undefined") {
|
||||
yield null;
|
||||
}
|
||||
} else if (BundleName.includes("Script")) {
|
||||
bundle = yield* self.loadScriptBundle(BundleUrl);
|
||||
} else {
|
||||
if (CC_JSB && !this.LocalVerList[BundleName].UseLocal) {
|
||||
let bundlePath: string = `${jsb.fileUtils.getWritablePath()}gamecaches/${BundleName}/`;
|
||||
if (!jsb.fileUtils.isFileExist(bundlePath)) {
|
||||
cc.assetManager.cacheManager["makeBundleFolder"](BundleName);
|
||||
}
|
||||
}
|
||||
bundle = yield* self.loadUIBundle(BundleUrl);
|
||||
}
|
||||
if (bundle) {
|
||||
yield* this.GetDepsBundle((<cc.AssetManager.Bundle>bundle).deps);
|
||||
if (isNeedUpdate) {
|
||||
// 下載成功後更改本地Bundle版本
|
||||
self.LocalVerList[BundleName].Version = self.RemoteVerList[BundleName];
|
||||
LocalStorageData.Instance.LocalVerList = JSON.stringify(self.LocalVerList);
|
||||
}
|
||||
}
|
||||
return bundle;
|
||||
}
|
||||
|
||||
/**
|
||||
* 從Bundle取得資源
|
||||
* @param {string} BundleUrl Bundle路徑
|
||||
*/
|
||||
public *loadScriptBundle(BundleUrl: string): IterableIterator<any> {
|
||||
let fileName: string = `index.${CC_DEBUG ? "js" : "jsc"}`;
|
||||
let fileUrl: string = `${BundleUrl}/${fileName}`;
|
||||
let run: boolean = true;
|
||||
let isSuceess: boolean = false;
|
||||
cc.assetManager.loadScript(fileUrl, (err: Error) => {
|
||||
if (err) {
|
||||
console.error(`[Error] ${fileUrl}載入失敗 err: ${err}`);
|
||||
run = false;
|
||||
return;
|
||||
}
|
||||
isSuceess = true;
|
||||
run = false;
|
||||
});
|
||||
while (run) {
|
||||
yield null;
|
||||
}
|
||||
return isSuceess;
|
||||
}
|
||||
|
||||
/**
|
||||
* 從Bundle取得資源
|
||||
* @param {string} BundleUrl Bundle路徑
|
||||
*/
|
||||
public *loadUIBundle(BundleUrl: string): IterableIterator<cc.AssetManager.Bundle> {
|
||||
let fileName: string = "config.json";
|
||||
let fileUrl: string = `${BundleUrl}/${fileName}`;
|
||||
let data: any;
|
||||
let run: boolean = true;
|
||||
cc.assetManager.loadRemote(fileUrl, (err: Error, res: cc.JsonAsset) => {
|
||||
if (err) {
|
||||
console.error(`[Error] ${fileUrl}載入失敗 err: ${err}`);
|
||||
return;
|
||||
}
|
||||
data = res.json;
|
||||
run = false;
|
||||
});
|
||||
while (run) {
|
||||
yield null;
|
||||
}
|
||||
let bundle: cc.AssetManager.Bundle = new cc.AssetManager.Bundle();
|
||||
data.base = `${BundleUrl}/`;
|
||||
bundle.init(data);
|
||||
return bundle;
|
||||
}
|
||||
|
||||
/**
|
||||
* 取得Bundle
|
||||
* @param {string} BundleName Bundle名稱
|
||||
* @param {string} Version 版號
|
||||
* @return {cc.AssetManager.Bundle} Bundle
|
||||
*/
|
||||
public *GetDepsBundle(deps: string[]): IterableIterator<any> {
|
||||
if (!deps || deps.length <= 2) {
|
||||
return;
|
||||
}
|
||||
let self: this = this;
|
||||
let GetBundle_F_Arr: IterableIterator<any>[] = [];
|
||||
for (const bundleName of deps) {
|
||||
if (!["main", "internal"].includes(bundleName)) {
|
||||
let GetBundle_F: IterableIterator<any> = function* (): IterableIterator<any> {
|
||||
yield* self.GetBundle(bundleName);
|
||||
}();
|
||||
GetBundle_F_Arr.push(GetBundle_F);
|
||||
}
|
||||
}
|
||||
yield CoroutineV2.Parallel(...GetBundle_F_Arr).Start();
|
||||
}
|
||||
|
||||
/**
|
||||
* 從Bundle取得資源
|
||||
* @param {number} slotID slotID
|
||||
* @param {Function} onFileProgress onFileProgress
|
||||
*/
|
||||
public *PreloadBundleScene(slotID: number, onFileProgress?: (finish: number, total: number, item: cc.AssetManager.RequestItem) => void): IterableIterator<any> {
|
||||
let BundleName: string = `Game_${slotID}`;
|
||||
let SourceName: string = `Slot${slotID}`;
|
||||
let run: boolean = true;
|
||||
let UpdateingData: Enum_Loading.UpdateingDataObj = new Enum_Loading.UpdateingDataObj(false);
|
||||
let bundle: cc.AssetManager.Bundle = yield* AssetBundleMamagerV2.Instance.GetBundle(BundleName);
|
||||
if (!bundle) {
|
||||
console.error(`GetBundleSource Error BundleName: ${BundleName}`);
|
||||
return UpdateingData;
|
||||
}
|
||||
|
||||
bundle.preloadScene(SourceName, onFileProgress, function (error: Error): void {
|
||||
if (error) {
|
||||
console.error(error);
|
||||
run = false;
|
||||
return;
|
||||
}
|
||||
UpdateingData.IsUpdatecomplete = true;
|
||||
run = false;
|
||||
});
|
||||
|
||||
while (run) {
|
||||
yield null;
|
||||
}
|
||||
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 = yield* AssetBundleMamagerV2.Instance.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} bundleName bundleName
|
||||
* @param {string} sourcePath Bundle資料夾下的路徑
|
||||
*/
|
||||
public static GetBundleSourceV2(bundleName: cc.bundleName | string, sourcePath: string): cc.Prefab {
|
||||
let bundle: cc.AssetManager.Bundle = cc.assetManager.getBundle(bundleName);
|
||||
if (!bundle) {
|
||||
cc.error(`GetBundleSourceV2 getBundle error bundleName: ${bundleName}`);
|
||||
return null;
|
||||
}
|
||||
let source: cc.Prefab = bundle.get(sourcePath, cc.Prefab);
|
||||
if (!source) {
|
||||
cc.error(`GetBundleSourceV2 bundle.get error bundleName: ${bundleName}, sourcePath: ${sourcePath}`);
|
||||
return 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;
|
||||
}
|
||||
this.ReleaseSlotCache(slotID);
|
||||
}
|
||||
|
||||
/**
|
||||
* 從cachedFiles刪除暫存資源
|
||||
* @param {string} BundleName Bundle名稱
|
||||
*/
|
||||
public DelBundleCache(BundleName: string): void {
|
||||
if (CC_BUILD && cc.sys.isNative) {
|
||||
let cachedFiles: Object = cc.assetManager.cacheManager.cachedFiles["_map"];
|
||||
let delcache: string = BusinessTypeSetting.GetRemoteFileUrl(BundleName) + "/";
|
||||
for (let cached of Object.keys(cachedFiles)) {
|
||||
if (cached.includes(delcache)) {
|
||||
cc.assetManager.cacheManager.removeCache(cached);
|
||||
// console.log(`removeCache: ${cached}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 從cachedFiles釋放暫存資源
|
||||
* @param {number} slotID slotID
|
||||
*/
|
||||
public ReleaseSlotCache(slotID: number): void {
|
||||
if (!CC_JSB) {
|
||||
return;
|
||||
}
|
||||
let delcachedKeys: string[] = [];
|
||||
let cachedFiles: Map<string, cc.Asset> = this.CachedFiles;
|
||||
let delcache_group: string[] = [`shared/jsons`, `Slot/Slot${slotID}`, "sounds/Slot/Default", "submit.txt"];
|
||||
cachedFiles.forEach((cached: cc.Asset, key: string, map: Map<string, cc.Asset>) => {
|
||||
for (var i: number = 0; i < delcache_group.length; ++i) {
|
||||
let delcache: string = delcache_group[i];
|
||||
if (key.includes(delcache)) {
|
||||
cc.assetManager.releaseAsset(cached);
|
||||
delcachedKeys.push(key);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
for (var i: number = 0; i < delcachedKeys.length; ++i) {
|
||||
this.CachedFiles.delete(delcachedKeys[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 判斷要不要更新
|
||||
* @param {string} BundleName Bundle名稱
|
||||
*/
|
||||
public IsNeedUpdate(BundleName: string): boolean {
|
||||
let isNeedUpdate: boolean;
|
||||
// 判斷本地有無Bundle資料
|
||||
if (this.LocalVerList[BundleName] && !this.LocalVerList[BundleName].HasBundle) {
|
||||
if (this.RemoteVerList[BundleName]) {
|
||||
// 改成有包過Bundle了,重新走下面流程
|
||||
this.LocalVerList[BundleName] = null;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!this.LocalVerList[BundleName]) {
|
||||
// 本地無Bundle資料需要新增
|
||||
this.LocalVerList[BundleName] = new Enum_Loading.BundleDataObj();
|
||||
LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList);
|
||||
}
|
||||
let version: string = this.RemoteVerList[BundleName];
|
||||
if (!version) {
|
||||
// !version代表還沒包Bundle
|
||||
this.LocalVerList[BundleName].HasBundle = false;
|
||||
LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList);
|
||||
return true;
|
||||
} else if (version === "0") {
|
||||
// version === "0" 代表要使用本體Bundle
|
||||
this.LocalVerList[BundleName].UseLocal = true;
|
||||
this.LocalVerList[BundleName].Version = "0";
|
||||
LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList);
|
||||
}
|
||||
isNeedUpdate = AssetBundleMamagerV2.Instance.versionCompareHandle(this.LocalVerList[BundleName].Version, this.RemoteVerList[BundleName]) !== 0 ? true : false;
|
||||
return isNeedUpdate;
|
||||
}
|
||||
|
||||
/**
|
||||
* 比對版號(熱更能從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 a - b;
|
||||
}
|
||||
}
|
||||
|
||||
// 長度相等且數字相等,則不更新
|
||||
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 : {};
|
||||
}
|
||||
|
||||
public 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
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"ver": "1.1.0",
|
||||
"uuid": "383b4628-2b2a-4de4-8aca-913015e91cae",
|
||||
"importer": "typescript",
|
||||
"isPlugin": false,
|
||||
"loadPluginInWeb": true,
|
||||
"loadPluginInNative": true,
|
||||
"loadPluginInEditor": false,
|
||||
"subMetas": {}
|
||||
}
|
@ -1,72 +0,0 @@
|
||||
const { ccclass, property } = cc._decorator;
|
||||
export module Enum_Loading {
|
||||
|
||||
//#region Enum
|
||||
|
||||
//#endregion
|
||||
|
||||
//#region Class
|
||||
|
||||
// /** BaseBundle資料 */
|
||||
// @ccclass("BaseBundleObj")
|
||||
// export class BaseBundleObj {
|
||||
// @property({ displayName: "Bundle名稱", tooltip: "Bundle名稱" })
|
||||
// public BundleName: string = "";
|
||||
|
||||
// @property({ displayName: "優先度", tooltip: "優先度", type: cc.Integer })
|
||||
// public Priority: number = 1;
|
||||
// }
|
||||
|
||||
class BundleDictionary<T> {
|
||||
[x: string]: T;
|
||||
}
|
||||
|
||||
/** VerList資料 */
|
||||
@ccclass("VerListObj")
|
||||
export class VerListObj extends BundleDictionary<BundleDataObj> {
|
||||
}
|
||||
|
||||
/** Bundle資料 */
|
||||
@ccclass("BundleDataObj")
|
||||
export class BundleDataObj {
|
||||
public Version: string = "0";
|
||||
|
||||
public ApkVersion: string = "0";
|
||||
|
||||
public UseLocal: boolean = false;
|
||||
|
||||
/** 有沒有包到Bundle */
|
||||
public HasBundle: boolean = true;
|
||||
}
|
||||
|
||||
/** Bundle資料 */
|
||||
@ccclass("NeedUpdateDataObj")
|
||||
export class NeedUpdateDataObj {
|
||||
|
||||
/** 是否需要更新 */
|
||||
public IsNeedUpdate: boolean;
|
||||
|
||||
/** 更新大小 */
|
||||
public TotalBytes: string;
|
||||
|
||||
constructor(...params: any[]) {
|
||||
this.IsNeedUpdate = params[0];
|
||||
this.TotalBytes = params[1] ? params[1] : null;
|
||||
}
|
||||
}
|
||||
|
||||
/** Bundle資料 */
|
||||
@ccclass("UpdateingDataObj")
|
||||
export class UpdateingDataObj {
|
||||
|
||||
/** 是否更新完成 */
|
||||
public IsUpdatecomplete: boolean;
|
||||
|
||||
constructor(...params: any[]) {
|
||||
this.IsUpdatecomplete = params[0];
|
||||
}
|
||||
}
|
||||
|
||||
//#endregion
|
||||
}
|
||||
export default Enum_Loading;
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"ver": "1.1.0",
|
||||
"uuid": "573d847e-893c-4fa2-8bd2-41918709fcf4",
|
||||
"importer": "typescript",
|
||||
"isPlugin": false,
|
||||
"loadPluginInWeb": true,
|
||||
"loadPluginInNative": true,
|
||||
"loadPluginInEditor": false,
|
||||
"subMetas": {}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
|
||||
const { ccclass, property } = cc._decorator;
|
||||
|
||||
export module GameData_HUD {
|
||||
|
||||
//#region Enum
|
||||
|
||||
/** BundleName */
|
||||
export enum BundleName {
|
||||
/** CommonSound */
|
||||
CommonSound = "CommonSound",
|
||||
CommonLanguageTexture = "CommonLanguageTexture",
|
||||
Common = "Common",
|
||||
ResourceItem = "ResourceItem",
|
||||
MainControl = "MainControl",
|
||||
Login = "Login",
|
||||
Lobby = "Lobby",
|
||||
BindAccount = "BindAccount",
|
||||
Shop = "Shop",
|
||||
Vip = "Vip",
|
||||
Ad = "Ad",
|
||||
SettingPanel = "SettingPanel",
|
||||
PlayerInfo = "PlayerInfo",
|
||||
Rank = "Rank",
|
||||
Chat = "Chat",
|
||||
Gift = "Gift",
|
||||
Activity = "Activity",
|
||||
Mail = "Mail",
|
||||
GettingPanel = "GettingPanel",
|
||||
Backpack = "Backpack",
|
||||
Game_GetCoin = "Game_GetCoin",
|
||||
Game_BigWinJackpot = "Game_BigWinJackpot",
|
||||
Game_BottomUI_BJ = "Game_BottomUI_BJ",
|
||||
Game_BottomUI_SD = "Game_BottomUI_SD",
|
||||
SlotCommom = "SlotCommom",
|
||||
TableCommon = "TableCommon",
|
||||
FishCommon = "FishCommon",
|
||||
ActivityMission = "ActivityMission"
|
||||
}
|
||||
|
||||
//#endregion
|
||||
}
|
||||
export default GameData_HUD;
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"ver": "1.1.0",
|
||||
"uuid": "e85368d6-e018-430e-bf1d-6ecd2973c6a8",
|
||||
"importer": "typescript",
|
||||
"isPlugin": false,
|
||||
"loadPluginInWeb": true,
|
||||
"loadPluginInNative": true,
|
||||
"loadPluginInEditor": false,
|
||||
"subMetas": {}
|
||||
}
|
13
assets/Script/Engine/Timer.meta
Normal file
13
assets/Script/Engine/Timer.meta
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"ver": "1.1.3",
|
||||
"uuid": "fd4b4720-4e75-4bfe-a27c-1520c3f18eb0",
|
||||
"importer": "folder",
|
||||
"isBundle": false,
|
||||
"bundleName": "",
|
||||
"priority": 1,
|
||||
"compressionType": {},
|
||||
"optimizeHotUpdate": {},
|
||||
"inlineSpriteFrames": {},
|
||||
"isRemoteBundle": {},
|
||||
"subMetas": {}
|
||||
}
|
13
assets/Script/Engine/Utils.meta
Normal file
13
assets/Script/Engine/Utils.meta
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"ver": "1.1.3",
|
||||
"uuid": "eba93305-455d-4d2d-a914-db71bc7f0022",
|
||||
"importer": "folder",
|
||||
"isBundle": false,
|
||||
"bundleName": "",
|
||||
"priority": 1,
|
||||
"compressionType": {},
|
||||
"optimizeHotUpdate": {},
|
||||
"inlineSpriteFrames": {},
|
||||
"isRemoteBundle": {},
|
||||
"subMetas": {}
|
||||
}
|
10
tslint.json
10
tslint.json
@ -1,4 +1,5 @@
|
||||
{
|
||||
"defaultSeverity": "warning",
|
||||
"rules": {
|
||||
"ban": [
|
||||
true,
|
||||
@ -33,7 +34,6 @@
|
||||
],
|
||||
"jsdoc-format": true,
|
||||
"label-position": true,
|
||||
"label-undefined": true,
|
||||
"max-line-length": [
|
||||
false,
|
||||
140
|
||||
@ -50,16 +50,13 @@
|
||||
],
|
||||
"no-construct": true,
|
||||
"no-debugger": true,
|
||||
"no-duplicate-key": true,
|
||||
"no-duplicate-variable": true,
|
||||
"no-empty": true,
|
||||
// "no-eval": true,
|
||||
"no-string-literal": false,
|
||||
"no-trailing-comma": true,
|
||||
"no-trailing-whitespace": true,
|
||||
"no-unused-expression": false,
|
||||
"no-unused-variable": true,
|
||||
"no-unreachable": true,
|
||||
"no-use-before-declare": false,
|
||||
"one-line": [
|
||||
true,
|
||||
@ -97,11 +94,6 @@
|
||||
"index-signature": "space"
|
||||
}
|
||||
],
|
||||
"use-strict": [
|
||||
true,
|
||||
"check-module",
|
||||
"check-function"
|
||||
],
|
||||
"variable-name": false,
|
||||
"whitespace": [
|
||||
false,
|
||||
|
Loading…
Reference in New Issue
Block a user