195 lines
8.3 KiB
JavaScript
195 lines
8.3 KiB
JavaScript
|
// @ts-nocheck
|
|||
|
const unityNamespace = {
|
|||
|
canvas: GameGlobal.canvas,
|
|||
|
// cache width
|
|||
|
canvas_width: GameGlobal.canvas.width,
|
|||
|
// cache height
|
|||
|
canvas_height: GameGlobal.canvas.height,
|
|||
|
navigator: GameGlobal.navigator,
|
|||
|
XMLHttpRequest: GameGlobal.XMLHttpRequest,
|
|||
|
// 是否显示耗时的弹框,默认开发版时显示弹出耗时弹框
|
|||
|
hideTimeLogModal: true,
|
|||
|
// 是否打印详细日志
|
|||
|
enableDebugLog: false,
|
|||
|
// 自定义bundle中的hash长度
|
|||
|
bundleHashLength: $BUNDLE_HASH_LENGTH,
|
|||
|
// 单位Bytes, 1MB = 1024 KB = 1024*1024Bytes
|
|||
|
releaseMemorySize: $DEFAULT_RELEASE_SIZE,
|
|||
|
unityVersion: '$UNITY_VERSION',
|
|||
|
// Color Space: Gamma、Linear、Uninitialized(未初始化的颜色空间)
|
|||
|
unityColorSpace: '$UNITY_COLORSPACE',
|
|||
|
convertPluginVersion: '$PLUGIN_VERSION',
|
|||
|
// 拼在StreamingAssets前面的path,DATA_CDN + streamingUrlPrefixPath + StreamingAssets
|
|||
|
streamingUrlPrefixPath: '',
|
|||
|
// DATA_CDN + dataFileSubPrefix + datafilename
|
|||
|
dataFileSubPrefix: '$DATA_FILE_SUB_PREFIX',
|
|||
|
// 当前appid扩容后,通过本字段告知插件本地存储最大容量,单位MB
|
|||
|
maxStorage: $MAX_STORAGE_SIZE,
|
|||
|
// 纹理中的hash长度
|
|||
|
texturesHashLength: $TEXTURE_HASH_LENGTH,
|
|||
|
// 纹理存放路径
|
|||
|
texturesPath: '$TEXTURES_PATH',
|
|||
|
// 是否需要缓存纹理,
|
|||
|
needCacheTextures: $NEED_CACHE_TEXTURES,
|
|||
|
// AssetBundle在内存中的存活时间
|
|||
|
ttlAssetBundle: 5,
|
|||
|
// 是否显示性能面板
|
|||
|
enableProfileStats: $ENABLE_PROFILE_STATS,
|
|||
|
// 是否预载微信系统字体
|
|||
|
preloadWXFont: $PRELOAD_WXFONT,
|
|||
|
// iOS高性能模式定期GC间隔
|
|||
|
iOSAutoGCInterval: $IOS_AUTO_GC_INTERVAL,
|
|||
|
// 是否使用微信压缩纹理
|
|||
|
usedTextureCompression: GameGlobal.USED_TEXTURE_COMPRESSION,
|
|||
|
// 是否使用autostreaming
|
|||
|
usedAutoStreaming: $USED_AUTO_STREAMING,
|
|||
|
// 是否显示渲染日志(dev only)
|
|||
|
enableRenderAnalysisLog: $ENABLE_RENDER_ANALYSIS_LOG,
|
|||
|
// 是否dotnet runtime
|
|||
|
useDotnetRuntime: $USE_DOTNET_RUNTIME,
|
|||
|
// 是否用了多线程brotli压缩
|
|||
|
useBrotliMT: $USE_BROTLI_MT,
|
|||
|
// Boot config配置,包含例如wait-for-native-debugger、player-connection-ip等信息
|
|||
|
bootConfig: '$BOOT_CONFIG_INFO',
|
|||
|
// 是否以Development Build构建
|
|||
|
isDevelopmentBuild: $Is_Development_Build,
|
|||
|
// 是否以Profiling Build导出
|
|||
|
isProfilingBuild: $Is_Profiling_Build,
|
|||
|
// 预留的堆内存
|
|||
|
unityHeapReservedMemory: $UnityHeapReservedMemory,
|
|||
|
};
|
|||
|
// 最佳实践检测配置
|
|||
|
unityNamespace.monitorConfig = {
|
|||
|
// 显示优化建议弹框
|
|||
|
showSuggestModal: $SHOW_SUGGEST_MODAL,
|
|||
|
// 是否开启检测(只影响开发版/体验版,线上版本不会检测)
|
|||
|
enableMonitor: true,
|
|||
|
// 帧率低于此值的帧会被记录,用于分析长耗时帧,做了限帧的游戏应该适当调低
|
|||
|
fps: 10,
|
|||
|
// 是否一直检测到游戏可交互完成
|
|||
|
showResultAfterLaunch: true,
|
|||
|
// 仅当showResultAfterLaunch=false时有效, 在引擎初始化完成(即callmain)后多长时间停止检测
|
|||
|
monitorDuration: 30000,
|
|||
|
};
|
|||
|
// 判断是否需要自动缓存的文件,返回true自动缓存;false不自动缓存
|
|||
|
unityNamespace.isCacheableFile = function (path) {
|
|||
|
// 判定为下载bundle的路径标识符,此路径下的下载,会自动缓存
|
|||
|
const cacheableFileIdentifier = [$BUNDLE_PATH_IDENTIFIER];
|
|||
|
// 命中路径标识符的情况下,并不是所有文件都有必要缓存,过滤下不需要缓存的文件
|
|||
|
const excludeFileIdentifier = [$EXCLUDE_FILE_EXTENSIONS];
|
|||
|
if (cacheableFileIdentifier.some(identifier => path.includes(identifier)
|
|||
|
&& excludeFileIdentifier.every(excludeIdentifier => !path.includes(excludeIdentifier)))) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
};
|
|||
|
// 是否上报此条网络异常, 返回true则上报, 返回false则忽略
|
|||
|
unityNamespace.isReportableHttpError = function (_info) {
|
|||
|
// const { url, error } = _info;
|
|||
|
return true;
|
|||
|
};
|
|||
|
// 判断是否是AssetBundle
|
|||
|
unityNamespace.isWXAssetBundle = function (path) {
|
|||
|
return unityNamespace.WXAssetBundles.has(unityNamespace.PathInFileOS(path));
|
|||
|
};
|
|||
|
unityNamespace.PathInFileOS = function (path) {
|
|||
|
return path.replace(`${wx.env.USER_DATA_PATH}/__GAME_FILE_CACHE`, '');
|
|||
|
};
|
|||
|
unityNamespace.WXAssetBundles = new Map();
|
|||
|
// 清理缓存时是否可被自动清理;返回true可自动清理;返回false不可自动清理
|
|||
|
unityNamespace.isErasableFile = function (info) {
|
|||
|
// 用于特定AssetBundle的缓存保持
|
|||
|
if (unityNamespace.WXAssetBundles.has(info.path)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// 达到缓存上限时,不会被自动清理的文件
|
|||
|
const inErasableIdentifier = [];
|
|||
|
if (inErasableIdentifier.some(identifier => info.path.includes(identifier))) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
};
|
|||
|
GameGlobal.WebAssembly = GameGlobal.WXWebAssembly;
|
|||
|
GameGlobal.unityNamespace = GameGlobal.unityNamespace || unityNamespace;
|
|||
|
GameGlobal.realtimeLogManager = wx.getRealtimeLogManager();
|
|||
|
GameGlobal.logmanager = wx.getLogManager({ level: 0 });
|
|||
|
// 提前监听错误并打日志
|
|||
|
function bindGloblException() {
|
|||
|
// 默认上报小游戏实时日志与用户反馈日志(所有error日志+小程序框架异常)
|
|||
|
wx.onError((result) => {
|
|||
|
// 若manager已初始化,则直接用manager打日志即可
|
|||
|
if (GameGlobal.manager) {
|
|||
|
GameGlobal.manager.printErr(result.message);
|
|||
|
}
|
|||
|
else {
|
|||
|
GameGlobal.realtimeLogManager.error(result);
|
|||
|
const isErrorObj = result && result.stack;
|
|||
|
GameGlobal.logmanager.warn(isErrorObj ? result.stack : result);
|
|||
|
console.error('onError:', result);
|
|||
|
}
|
|||
|
});
|
|||
|
wx.onUnhandledRejection((result) => {
|
|||
|
GameGlobal.realtimeLogManager.error(result);
|
|||
|
const isErrorObj = result && result.reason && result.reason.stack;
|
|||
|
GameGlobal.logmanager.warn(isErrorObj ? result.reason.stack : result.reason);
|
|||
|
console.error('unhandledRejection:', result.reason);
|
|||
|
});
|
|||
|
// 上报初始信息
|
|||
|
function printSystemInfo(appBaseInfo, deviceInfo) {
|
|||
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|||
|
const { version, SDKVersion } = appBaseInfo;
|
|||
|
const { platform, system } = deviceInfo;
|
|||
|
unityNamespace.version = version;
|
|||
|
unityNamespace.SDKVersion = SDKVersion;
|
|||
|
unityNamespace.platform = platform;
|
|||
|
unityNamespace.system = system;
|
|||
|
unityNamespace.isPc = platform === 'windows' || platform === 'mac';
|
|||
|
unityNamespace.isDevtools = platform === 'devtools';
|
|||
|
unityNamespace.isMobile = !unityNamespace.isPc && !unityNamespace.isDevtools;
|
|||
|
unityNamespace.isH5Renderer = GameGlobal.isIOSHighPerformanceMode;
|
|||
|
unityNamespace.isIOS = platform === 'ios';
|
|||
|
unityNamespace.isAndroid = platform === 'android';
|
|||
|
const bootinfo = {
|
|||
|
renderer: GameGlobal.isIOSHighPerformanceMode ? 'h5' : '',
|
|||
|
isH5Plus: GameGlobal.isIOSHighPerformanceModePlus || false,
|
|||
|
abi: deviceInfo.abi || '',
|
|||
|
brand: deviceInfo.brand,
|
|||
|
model: deviceInfo.model,
|
|||
|
platform: deviceInfo.platform,
|
|||
|
system: deviceInfo.system,
|
|||
|
version: appBaseInfo.version,
|
|||
|
SDKVersion: appBaseInfo.SDKVersion,
|
|||
|
benchmarkLevel: deviceInfo.benchmarkLevel,
|
|||
|
};
|
|||
|
GameGlobal.realtimeLogManager.info('game starting', bootinfo);
|
|||
|
GameGlobal.logmanager.info('game starting', bootinfo);
|
|||
|
console.info('game starting', bootinfo);
|
|||
|
}
|
|||
|
const appBaseInfo = wx.getAppBaseInfo();
|
|||
|
const deviceInfo = wx.getDeviceInfo();
|
|||
|
printSystemInfo(appBaseInfo, deviceInfo);
|
|||
|
}
|
|||
|
bindGloblException();
|
|||
|
// eslint-disable-next-line no-multi-assign
|
|||
|
GameGlobal.onCrash = GameGlobal.unityNamespace.onCrash = function () {
|
|||
|
GameGlobal.manager.showAbort();
|
|||
|
const windowInfo = wx.getWindowInfo();
|
|||
|
wx.createFeedbackButton({
|
|||
|
type: 'text',
|
|||
|
text: '提交反馈',
|
|||
|
style: {
|
|||
|
left: (windowInfo.screenWidth - 184) / 2,
|
|||
|
top: windowInfo.screenHeight / 3 + 140,
|
|||
|
width: 184,
|
|||
|
height: 40,
|
|||
|
lineHeight: 40,
|
|||
|
backgroundColor: '#07C160',
|
|||
|
color: '#ffffff',
|
|||
|
textAlign: 'center',
|
|||
|
fontSize: 16,
|
|||
|
borderRadius: 4,
|
|||
|
},
|
|||
|
});
|
|||
|
};
|
|||
|
export default GameGlobal.unityNamespace;
|