diff --git a/CHANGELOG.md b/CHANGELOG.md index 92ac350d7..61b40d7ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,32 +6,6 @@ Removed - 删除功能/接口 Fixed - 修复问题 Others - 其他 --> -## 2026-3-15 v0.1.32 【普通更新】 -### Feature -* 普通:更新基础库版本 -* 普通:擂台赛api新增subScoreKey参数 -* 普通:支持gameeventreport(试玩) -* 普通:添加WX数据保护插件,支持游戏数据加密存储和篡改检测 -### Fixed -* 普通:修复订阅消息报错问题 - -## 2026-1-13 v0.1.31 【普通更新】 -### Fixed -* 普通:修复glx模式下 createVideo underGameView为true 黑屏的问题 -* 普通:修复build profile在团结1.6之后的导出问题 - -## 2025-11-6 v0.1.30 【重要更新】 -### Feature -* 重要:EmscriptenGLX支持微信压缩纹理 -* 普通:EmscriptenGLX支持Android glReadpixels -* 普通:EmscriptenGLX优化Android CPU与功耗 -* 普通:Metal高帧率下功耗优化 -* 普通:团结引擎buildprofile支持 -### Fixed -* 重要:Metal编码库batch size修复 -* 普通:PageManager相关问题修复 -* 普通:iOS18的微信字体修复 - ## 2025-9-8 v0.1.29 【重要更新】 ### Feature * 普通:本地缓存存在时,UnityWebRequest支持同步方式(API:wx.SetSyncReadCacheEnabled)以加快读取速度 diff --git a/Editor/WXEditorSettingHelper.cs b/Editor/WXEditorSettingHelper.cs index a7f7417b2..c6f91baae 100644 --- a/Editor/WXEditorSettingHelper.cs +++ b/Editor/WXEditorSettingHelper.cs @@ -80,14 +80,54 @@ namespace WeChatWASM PluginUpdateManager.CheckUpdateOnce(); scrollRoot = EditorGUILayout.BeginScrollView(scrollRoot); - GUIStyle linkStyle = GetLinkStyle(); + GUIStyle linkStyle = new GUIStyle(GUI.skin.label); + linkStyle.normal.textColor = Color.yellow; + linkStyle.hover.textColor = Color.yellow; + linkStyle.stretchWidth = false; + linkStyle.alignment = TextAnchor.UpperLeft; + linkStyle.wordWrap = true; foldBaseInfo = EditorGUILayout.Foldout(foldBaseInfo, "基本信息"); if (foldBaseInfo) { EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); - OnSettingBaseInfo(); - OnSettingChooseFolder(); + + this.formInput("appid", "游戏AppID"); + this.formInput("cdn", "游戏资源CDN"); + this.formInput("projectName", "小游戏项目名"); + this.formIntPopup("orientation", "游戏方向", new[] { "Portrait", "Landscape", "LandscapeLeft", "LandscapeRight" }, new[] { 0, 1, 2, 3 }); + this.formInput("memorySize", "UnityHeap预留内存(?)", "单位MB,预分配内存值,超休闲游戏256/中轻度496/重度游戏768,需预估游戏最大UnityHeap值以防止内存自动扩容带来的峰值尖刺。预估方法请查看GIT文档《优化Unity WebGL的内存》"); + + GUILayout.BeginHorizontal(); + string targetDst = "dst"; + if (!formInputData.ContainsKey(targetDst)) + { + formInputData[targetDst] = ""; + } + EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); + GUILayout.Label(new GUIContent("导出路径(?)", "支持输入相对于项目根目录的相对路径,如:wxbuild"), GUILayout.Width(140)); + formInputData[targetDst] = GUILayout.TextField(formInputData[targetDst], GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 270)); + if (GUILayout.Button(new GUIContent("打开"), GUILayout.Width(40))) + { + if (!formInputData[targetDst].Trim().Equals(string.Empty)) + { + EditorUtility.RevealInFinder(GetAbsolutePath(formInputData[targetDst])); + } + GUIUtility.ExitGUI(); + } + if (GUILayout.Button(new GUIContent("选择"), GUILayout.Width(40))) + { + var dstPath = EditorUtility.SaveFolderPanel("选择你的游戏导出目录", string.Empty, string.Empty); + if (dstPath != string.Empty) + { + formInputData[targetDst] = dstPath; + this.saveData(); + } + GUIUtility.ExitGUI(); + } + GUILayout.EndHorizontal(); + + EditorGUILayout.EndVertical(); } @@ -108,7 +148,12 @@ namespace WeChatWASM } GUILayout.EndHorizontal(); - OnSettingLoadingConfig(); + this.formInput("videoUrl", "加载阶段视频URL"); + this.formIntPopup("assetLoadType", "首包资源加载方式", new[] { "CDN", "小游戏包内" }, new[] { 0, 1 }); + this.formCheckbox("compressDataPackage", "压缩首包资源(?)", "将首包资源Brotli压缩, 降低资源大小. 注意: 首次启动耗时可能会增加200ms, 仅推荐使用小游戏分包加载时节省包体大小使用"); + this.formInput("bundleExcludeExtensions", "不自动缓存文件类型(?)", "(使用;分割)当请求url包含资源'cdn+StreamingAssets'时会自动缓存,但StreamingAssets目录下不是所有文件都需缓存,此选项配置不需要自动缓存的文件拓展名。默认值json"); + this.formInput("bundleHashLength", "Bundle名称Hash长度(?)", "自定义Bundle文件名中hash部分长度,默认值32,用于缓存控制。"); + this.formInput("preloadFiles", "预下载文件列表(?)", "使用;间隔,支持模糊匹配"); EditorGUILayout.EndVertical(); } @@ -117,14 +162,55 @@ namespace WeChatWASM if (foldSDKOptions) { EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); - OnSettingSDKOptions(); + + this.formCheckbox("useFriendRelation", "使用好友关系链"); + this.formCheckbox("useMiniGameChat", "使用社交组件"); + this.formCheckbox("preloadWXFont", "预加载微信字体(?)", "在game.js执行开始时预载微信系统字体,运行期间可使用WX.GetWXFont获取微信字体"); + this.formCheckbox("disableMultiTouch", "禁用多点触控"); + EditorGUILayout.EndVertical(); } foldDebugOptions = EditorGUILayout.Foldout(foldDebugOptions, "调试编译选项"); if (foldDebugOptions) { - OnSettingDebugOptions(true); + EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); + + + this.formCheckbox("developBuild", "Development Build", "", false, null, OnDevelopmentBuildToggleChanged); + this.formCheckbox("autoProfile", "Auto connect Profiler"); + this.formCheckbox("scriptOnly", "Scripts Only Build"); + this.formCheckbox("il2CppOptimizeSize", "Il2Cpp Optimize Size(?)", "对应于Il2CppCodeGeneration选项,勾选时使用OptimizeSize(默认推荐),生成代码小15%左右,取消勾选则使用OptimizeSpeed。游戏中大量泛型集合的高频访问建议OptimizeSpeed,在使用HybridCLR等第三方组件时只能用OptimizeSpeed。(Dotnet Runtime模式下该选项无效)", !UseIL2CPP); + this.formCheckbox("profilingFuncs", "Profiling Funcs"); + this.formCheckbox("profilingMemory", "Profiling Memory"); + this.formCheckbox("webgl2", "WebGL2.0"); + this.formCheckbox("iOSPerformancePlus", "iOSPerformancePlus(?)", "是否使用iOS高性能+渲染方案,有助于提升渲染兼容性、降低WebContent进程内存"); + this.formCheckbox("EmscriptenGLX", "EmscriptenGLX(?)", "是否使用EmscriptenGLX渲染方案"); + this.formCheckbox("iOSMetal", "iOSMetal(?)", "是否使用iOSMetal渲染方案,需要开启iOS高性能+模式,有助于提升运行性能,降低iOS功耗"); + this.formCheckbox("deleteStreamingAssets", "Clear Streaming Assets"); + this.formCheckbox("cleanBuild", "Clean WebGL Build"); + // this.formCheckbox("cleanCloudDev", "Clean Cloud Dev"); + this.formCheckbox("fbslim", "首包资源优化(?)", "导出时自动清理UnityEditor默认打包但游戏项目从未使用的资源,瘦身首包资源体积。(团结引擎已无需开启该能力)", UnityUtil.GetEngineVersion() > 0, (res) => + { + var fbWin = EditorWindow.GetWindow(typeof(WXFbSettingWindow), false, "首包资源优化配置面板", true); + fbWin.minSize = new Vector2(680, 350); + fbWin.Show(); + }); + this.formCheckbox("autoAdaptScreen", "自适应屏幕尺寸(?)", "移动端旋转屏幕和PC端拉伸窗口时,自动调整画布尺寸"); + this.formCheckbox("showMonitorSuggestModal", "显示优化建议弹窗"); + this.formCheckbox("enableProfileStats", "显示性能面板"); + this.formCheckbox("enableRenderAnalysis", "显示渲染日志(dev only)"); + this.formCheckbox("brotliMT", "brotli多线程压缩(?)", "开启多线程压缩可以提高出包速度,但会降低压缩率。如若不使用wasm代码分包请勿用多线程出包上线"); +#if UNITY_6000_0_OR_NEWER + this.formCheckbox("enableWasm2023", "WebAssembly 2023(?)", "WebAssembly 2023包括对WebAssembly.Table和BigInt的支持。(Android (Android 10 or later recommended), iOS (iOS 15 or later recommended))"); +#endif + + if (m_EnablePerfTool) + { + this.formCheckbox("enablePerfAnalysis", "集成性能分析工具", "将性能分析工具集成入Development Build包中", false, null, OnPerfAnalysisFeatureToggleChanged); + } + + EditorGUILayout.EndVertical(); } @@ -179,268 +265,31 @@ namespace WeChatWASM if (foldFontOptions) { EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); - OnSettingFontOptions(); + this.formCheckbox("CJK_Unified_Ideographs", "基本汉字(?)", "Unicode [0x4e00, 0x9fff]"); + this.formCheckbox("C0_Controls_and_Basic_Latin", "基本拉丁语(英文大小写、数字、英文标点)(?)", "Unicode [0x0, 0x7f]"); + this.formCheckbox("CJK_Symbols_and_Punctuation", "中文标点符号(?)", "Unicode [0x3000, 0x303f]"); + this.formCheckbox("General_Punctuation", "通用标点符号(?)", "Unicode [0x2000, 0x206f]"); + this.formCheckbox("Enclosed_CJK_Letters_and_Months", "CJK字母及月份(?)", "Unicode [0x3200, 0x32ff]"); + this.formCheckbox("Vertical_Forms", "中文竖排标点(?)", "Unicode [0xfe10, 0xfe1f]"); + this.formCheckbox("CJK_Compatibility_Forms", "CJK兼容符号(?)", "Unicode [0xfe30, 0xfe4f]"); + this.formCheckbox("Miscellaneous_Symbols", "杂项符号(?)", "Unicode [0x2600, 0x26ff]"); + this.formCheckbox("CJK_Compatibility", "CJK特殊符号(?)", "Unicode [0x3300, 0x33ff]"); + this.formCheckbox("Halfwidth_and_Fullwidth_Forms", "全角ASCII、全角中英文标点、半宽片假名、半宽平假名、半宽韩文字母(?)", "Unicode [0xff00, 0xffef]"); + this.formCheckbox("Dingbats", "装饰符号(?)", "Unicode [0x2700, 0x27bf]"); + this.formCheckbox("Letterlike_Symbols", "字母式符号(?)", "Unicode [0x2100, 0x214f]"); + this.formCheckbox("Enclosed_Alphanumerics", "带圈或括号的字母数字(?)", "Unicode [0x2460, 0x24ff]"); + this.formCheckbox("Number_Forms", "数字形式(?)", "Unicode [0x2150, 0x218f]"); + this.formCheckbox("Currency_Symbols", "货币符号(?)", "Unicode [0x20a0, 0x20cf]"); + this.formCheckbox("Arrows", "箭头(?)", "Unicode [0x2190, 0x21ff]"); + this.formCheckbox("Geometric_Shapes", "几何图形(?)", "Unicode [0x25a0, 0x25ff]"); + this.formCheckbox("Mathematical_Operators", "数学运算符号(?)", "Unicode [0x2200, 0x22ff]"); + this.formInput("CustomUnicode", "自定义Unicode(?)", "将填入的所有字符强制加入字体预加载列表"); EditorGUILayout.EndVertical(); } EditorGUILayout.EndScrollView(); } - public void OnSettingsGUI(SerializedObject serializedObject, SerializedProperty miniGameProperty) - { - loadData(serializedObject, miniGameProperty); - - scrollRoot = EditorGUILayout.BeginScrollView(scrollRoot); - - GUIStyle linkStyle = GetLinkStyle(); - - foldBaseInfo = EditorGUILayout.Foldout(foldBaseInfo, "基本信息"); - if (foldBaseInfo) - { - EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); - OnSettingBaseInfo(); - EditorGUILayout.EndVertical(); - } - - foldLoadingConfig = EditorGUILayout.Foldout(foldLoadingConfig, "启动Loading配置"); - if (foldLoadingConfig) - { - EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); - - // Call saveData(serializedObject, miniGameProperty) not saveData() - GUILayout.BeginHorizontal(); - string targetBg = "bgImageSrc"; - EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); - tex = (Texture)EditorGUILayout.ObjectField("启动背景图/视频封面", tex, typeof(Texture2D), false); - var currentBgSrc = AssetDatabase.GetAssetPath(tex); - if (!string.IsNullOrEmpty(currentBgSrc) && currentBgSrc != formInputData[targetBg]) - { - formInputData[targetBg] = currentBgSrc; - saveData(serializedObject, miniGameProperty); - } - GUILayout.EndHorizontal(); - - OnSettingLoadingConfig(); - - EditorGUILayout.EndVertical(); - } - - foldSDKOptions = EditorGUILayout.Foldout(foldSDKOptions, "SDK功能选项"); - if (foldSDKOptions) - { - EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); - OnSettingSDKOptions(); - EditorGUILayout.EndVertical(); - } - - foldDebugOptions = EditorGUILayout.Foldout(foldDebugOptions, "调试编译选项"); - if (foldDebugOptions) - { - OnSettingDebugOptions(false); - } - - if (WXConvertCore.IsInstantGameAutoStreaming()) - { - foldInstantGame = EditorGUILayout.Foldout(foldInstantGame, "Instant Game - AutoStreaming"); - if (foldInstantGame) - { - EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); - formInput("bundlePathIdentifier", "Bundle Path Identifier"); - formInput("dataFileSubPrefix", "Data File Sub Prefix"); - - EditorGUI.BeginDisabledGroup(true); - formCheckbox("autoUploadFirstBundle", "构建后自动上传首包(?)", "仅在开启AutoStreaming生效", true); - EditorGUI.EndDisabledGroup(); - - GUILayout.BeginHorizontal(); - EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); - GUILayout.Label(new GUIContent("清理AS配置(?)", "如需关闭AutoStreaming选用默认发布方案则需要清理AS配置项目。"), GUILayout.Width(140)); - EditorGUI.BeginDisabledGroup(WXConvertCore.IsInstantGameAutoStreaming()); - // It is not same as OnSettingsGUI(EditorWindow) - if (GUILayout.Button(new GUIContent("恢复"), GUILayout.Width(60))) - { - var ProjectConf = miniGameProperty.FindPropertyRelative("ProjectConf"); - string identifier = ProjectConf.FindPropertyRelative("bundlePathIdentifier").stringValue; - string[] identifiers = identifier.Split(";"); - string idStr = ""; - foreach (string id in identifiers) - { - if (id != "AS" && id != "CUS/CustomAB") - { - idStr += id + ";"; - } - } - ProjectConf.FindPropertyRelative("bundlePathIdentifier").stringValue = idStr.Trim(';'); - - if (ProjectConf.FindPropertyRelative("dataFileSubPrefix").stringValue == "CUS") - { - ProjectConf.FindPropertyRelative("dataFileSubPrefix").stringValue = ""; - } - loadData(serializedObject, miniGameProperty); - } - EditorGUI.EndDisabledGroup(); - GUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - EditorGUILayout.LabelField(string.Empty); - if (GUILayout.Button(new GUIContent("了解Instant Game AutoStreaming", ""), linkStyle)) - { - Application.OpenURL("https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/InstantGameGuide.md"); - } - EditorGUILayout.EndHorizontal(); - EditorGUILayout.EndVertical(); - } - } - - foldFontOptions = EditorGUILayout.Foldout(foldFontOptions, "字体配置"); - if (foldFontOptions) - { - EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); - OnSettingFontOptions(); - EditorGUILayout.EndVertical(); - } - - EditorGUILayout.EndScrollView(); - saveData(serializedObject, miniGameProperty); - } - - private GUIStyle GetLinkStyle() - { - GUIStyle linkStyle = new GUIStyle(GUI.skin.label); - linkStyle.normal.textColor = Color.yellow; - linkStyle.hover.textColor = Color.yellow; - linkStyle.stretchWidth = false; - linkStyle.alignment = TextAnchor.UpperLeft; - linkStyle.wordWrap = true; - return linkStyle; - } - - private void OnSettingBaseInfo() - { - this.formInput("appid", "游戏AppID"); - this.formInput("cdn", "游戏资源CDN"); - this.formInput("projectName", "小游戏项目名"); - this.formIntPopup("orientation", "游戏方向", new[] { "Portrait", "Landscape", "LandscapeLeft", "LandscapeRight" }, new[] { 0, 1, 2, 3 }); - this.formInput("memorySize", "UnityHeap预留内存(?)", "单位MB,预分配内存值,超休闲游戏256/中轻度496/重度游戏768,需预估游戏最大UnityHeap值以防止内存自动扩容带来的峰值尖刺。预估方法请查看GIT文档《优化Unity WebGL的内存》"); - } - - private void OnSettingChooseFolder() - { - GUILayout.BeginHorizontal(); - string targetDst = "dst"; - if (!formInputData.ContainsKey(targetDst)) - { - formInputData[targetDst] = ""; - } - EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); - GUILayout.Label(new GUIContent("导出路径(?)", "支持输入相对于项目根目录的相对路径,如:wxbuild"), GUILayout.Width(140)); - formInputData[targetDst] = GUILayout.TextField(formInputData[targetDst], GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 270)); - if (GUILayout.Button(new GUIContent("打开"), GUILayout.Width(40))) - { - if (!formInputData[targetDst].Trim().Equals(string.Empty)) - { - EditorUtility.RevealInFinder(GetAbsolutePath(formInputData[targetDst])); - } - GUIUtility.ExitGUI(); - } - if (GUILayout.Button(new GUIContent("选择"), GUILayout.Width(40))) - { - var dstPath = EditorUtility.SaveFolderPanel("选择你的游戏导出目录", string.Empty, string.Empty); - if (dstPath != string.Empty) - { - formInputData[targetDst] = dstPath; - this.saveData(); - } - GUIUtility.ExitGUI(); - } - GUILayout.EndHorizontal(); - } - - private void OnSettingLoadingConfig() - { - this.formInput("videoUrl", "加载阶段视频URL"); - this.formIntPopup("assetLoadType", "首包资源加载方式", new[] { "CDN", "小游戏包内" }, new[] { 0, 1 }); - this.formCheckbox("compressDataPackage", "压缩首包资源(?)", "将首包资源Brotli压缩, 降低资源大小. 注意: 首次启动耗时可能会增加200ms, 仅推荐使用小游戏分包加载时节省包体大小使用"); - this.formInput("bundleExcludeExtensions", "不自动缓存文件类型(?)", "(使用;分割)当请求url包含资源'cdn+StreamingAssets'时会自动缓存,但StreamingAssets目录下不是所有文件都需缓存,此选项配置不需要自动缓存的文件拓展名。默认值json"); - this.formInput("bundleHashLength", "Bundle名称Hash长度(?)", "自定义Bundle文件名中hash部分长度,默认值32,用于缓存控制。"); - this.formInput("preloadFiles", "预下载文件列表(?)", "使用;间隔,支持模糊匹配"); - } - - private void OnSettingSDKOptions() - { - formCheckbox("useFriendRelation", "使用好友关系链"); - formCheckbox("useMiniGameChat", "使用社交组件"); - formCheckbox("preloadWXFont", "预加载微信字体(?)", "在game.js执行开始时预载微信系统字体,运行期间可使用WX.GetWXFont获取微信字体"); - formCheckbox("disableMultiTouch", "禁止多点触控"); - } - - private void OnSettingDebugOptions(bool showDevBuild) - { - EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); - - if (showDevBuild) - { - this.formCheckbox("developBuild", "Development Build", "", false, null, OnDevelopmentBuildToggleChanged); - } - this.formCheckbox("autoProfile", "Auto connect Profiler"); - this.formCheckbox("scriptOnly", "Scripts Only Build"); - this.formCheckbox("il2CppOptimizeSize", "Il2Cpp Optimize Size(?)", "对应于Il2CppCodeGeneration选项,勾选时使用OptimizeSize(默认推荐),生成代码小15%左右,取消勾选则使用OptimizeSpeed。游戏中大量泛型集合的高频访问建议OptimizeSpeed,在使用HybridCLR等第三方组件时只能用OptimizeSpeed。(Dotnet Runtime模式下该选项无效)", !UseIL2CPP); - this.formCheckbox("profilingFuncs", "Profiling Funcs"); - this.formCheckbox("profilingMemory", "Profiling Memory"); - this.formCheckbox("webgl2", "WebGL2.0"); - this.formCheckbox("iOSPerformancePlus", "iOSPerformancePlus(?)", "是否使用iOS高性能+渲染方案,有助于提升渲染兼容性、降低WebContent进程内存"); - this.formCheckbox("EmscriptenGLX", "EmscriptenGLX(?)", "是否使用EmscriptenGLX渲染方案"); - this.formCheckbox("iOSMetal", "iOSMetal(?)", "是否使用iOSMetal渲染方案,需要开启iOS高性能+模式,有助于提升运行性能,降低iOS功耗"); - this.formCheckbox("deleteStreamingAssets", "Clear Streaming Assets"); - this.formCheckbox("cleanBuild", "Clean WebGL Build"); - // this.formCheckbox("cleanCloudDev", "Clean Cloud Dev"); - this.formCheckbox("fbslim", "首包资源优化(?)", "导出时自动清理UnityEditor默认打包但游戏项目从未使用的资源,瘦身首包资源体积。(团结引擎已无需开启该能力)", UnityUtil.GetEngineVersion() > 0, (res) => - { - var fbWin = EditorWindow.GetWindow(typeof(WXFbSettingWindow), false, "首包资源优化配置面板", true); - fbWin.minSize = new Vector2(680, 350); - fbWin.Show(); - }); - this.formCheckbox("autoAdaptScreen", "自适应屏幕尺寸(?)", "移动端旋转屏幕和PC端拉伸窗口时,自动调整画布尺寸"); - this.formCheckbox("showMonitorSuggestModal", "显示优化建议弹窗"); - this.formCheckbox("enableProfileStats", "显示性能面板"); - this.formCheckbox("enableRenderAnalysis", "显示渲染日志(dev only)"); - this.formCheckbox("brotliMT", "brotli多线程压缩(?)", "开启多线程压缩可以提高出包速度,但会降低压缩率。如若不使用wasm代码分包请勿用多线程出包上线"); -#if UNITY_6000_0_OR_NEWER - this.formCheckbox("enableWasm2023", "WebAssembly 2023(?)", "WebAssembly 2023包括对WebAssembly.Table和BigInt的支持。(Android (Android 10 or later recommended), iOS (iOS 15 or later recommended))"); -#endif - - if (m_EnablePerfTool) - { - this.formCheckbox("enablePerfAnalysis", "集成性能分析工具", "将性能分析工具集成入Development Build包中", false, null, OnPerfAnalysisFeatureToggleChanged); - } - - EditorGUILayout.EndVertical(); - } - - private void OnSettingFontOptions() - { - formCheckbox("CJK_Unified_Ideographs", "基本汉字(?)", "Unicode [0x4e00, 0x9fff]"); - formCheckbox("C0_Controls_and_Basic_Latin", "基本拉丁语(英文大小写、数字、英文标点)(?)", "Unicode [0x0, 0x7f]"); - formCheckbox("CJK_Symbols_and_Punctuation", "中文标点符号(?)", "Unicode [0x3000, 0x303f]"); - formCheckbox("General_Punctuation", "通用标点符号(?)", "Unicode [0x2000, 0x206f]"); - formCheckbox("Enclosed_CJK_Letters_and_Months", "CJK字母及月份(?)", "Unicode [0x3200, 0x32ff]"); - formCheckbox("Vertical_Forms", "中文竖排标点(?)", "Unicode [0xfe10, 0xfe1f]"); - formCheckbox("CJK_Compatibility_Forms", "CJK兼容符号(?)", "Unicode [0xfe30, 0xfe4f]"); - formCheckbox("Miscellaneous_Symbols", "杂项符号(?)", "Unicode [0x2600, 0x26ff]"); - formCheckbox("CJK_Compatibility", "CJK特殊符号(?)", "Unicode [0x3300, 0x33ff]"); - formCheckbox("Halfwidth_and_Fullwidth_Forms", "全角ASCII、全角中英文标点、半宽片假名、半宽平假名、半宽韩文字母(?)", "Unicode [0xff00, 0xffef]"); - formCheckbox("Dingbats", "装饰符号(?)", "Unicode [0x2700, 0x27bf]"); - formCheckbox("Letterlike_Symbols", "字母式符号(?)", "Unicode [0x2100, 0x214f]"); - formCheckbox("Enclosed_Alphanumerics", "带圈或括号的字母数字(?)", "Unicode [0x2460, 0x24ff]"); - formCheckbox("Number_Forms", "数字形式(?)", "Unicode [0x2150, 0x218f]"); - formCheckbox("Currency_Symbols", "货币符号(?)", "Unicode [0x20a0, 0x20cf]"); - formCheckbox("Arrows", "箭头(?)", "Unicode [0x2190, 0x21ff]"); - formCheckbox("Geometric_Shapes", "几何图形(?)", "Unicode [0x25a0, 0x25ff]"); - formCheckbox("Mathematical_Operators", "数学运算符号(?)", "Unicode [0x2200, 0x22ff]"); - formInput("CustomUnicode", "自定义Unicode(?)", "将填入的所有字符强制加入字体预加载列表"); - } - - public void OnBuildButtonGUI(EditorWindow window) { GUIStyle linkStyle = new GUIStyle(GUI.skin.label); @@ -577,454 +426,162 @@ namespace WeChatWASM } } - this.setData("autoUploadFirstBundle", true); - loadProjectConfData(config.ProjectConf); - loadSDKOptionsData(config.SDKOptions); - loadCompileOptionsData(config.CompileOptions); - loadFontOptionsData(config.FontOptions); - } + this.setData("projectName", config.ProjectConf.projectName); + this.setData("appid", config.ProjectConf.Appid); + this.setData("cdn", config.ProjectConf.CDN); + this.setData("assetLoadType", config.ProjectConf.assetLoadType); + this.setData("compressDataPackage", config.ProjectConf.compressDataPackage); + this.setData("videoUrl", config.ProjectConf.VideoUrl); + this.setData("orientation", (int)config.ProjectConf.Orientation); + this.setData("dst", config.ProjectConf.relativeDST); + this.setData("bundleHashLength", config.ProjectConf.bundleHashLength.ToString()); + this.setData("bundlePathIdentifier", config.ProjectConf.bundlePathIdentifier); + this.setData("bundleExcludeExtensions", config.ProjectConf.bundleExcludeExtensions); + this.setData("preloadFiles", config.ProjectConf.preloadFiles); + this.setData("developBuild", config.CompileOptions.DevelopBuild); + this.setData("autoProfile", config.CompileOptions.AutoProfile); + this.setData("scriptOnly", config.CompileOptions.ScriptOnly); + this.setData("il2CppOptimizeSize", config.CompileOptions.Il2CppOptimizeSize); + this.setData("profilingFuncs", config.CompileOptions.profilingFuncs); + this.setData("profilingMemory", config.CompileOptions.ProfilingMemory); + this.setData("deleteStreamingAssets", config.CompileOptions.DeleteStreamingAssets); + this.setData("cleanBuild", config.CompileOptions.CleanBuild); + this.setData("customNodePath", config.CompileOptions.CustomNodePath); + this.setData("webgl2", config.CompileOptions.Webgl2); + this.setData("iOSPerformancePlus", config.CompileOptions.enableIOSPerformancePlus); + this.setData("iOSMetal", config.CompileOptions.enableiOSMetal); + this.setData("EmscriptenGLX", config.CompileOptions.enableEmscriptenGLX); + this.setData("fbslim", config.CompileOptions.fbslim); + this.setData("useFriendRelation", config.SDKOptions.UseFriendRelation); + this.setData("useMiniGameChat", config.SDKOptions.UseMiniGameChat); + this.setData("preloadWXFont", config.SDKOptions.PreloadWXFont); + this.setData("disableMultiTouch", config.SDKOptions.disableMultiTouch); + this.setData("bgImageSrc", config.ProjectConf.bgImageSrc); + tex = AssetDatabase.LoadAssetAtPath(config.ProjectConf.bgImageSrc); + this.setData("memorySize", config.ProjectConf.MemorySize.ToString()); + this.setData("hideAfterCallMain", config.ProjectConf.HideAfterCallMain); - private void loadData(SerializedObject serializedObject, SerializedProperty miniGameProperty) - { - serializedObject.UpdateIfRequiredOrScript(); - var ProjectConf = miniGameProperty.FindPropertyRelative("ProjectConf"); - - // Instant Game - if (WXConvertCore.IsInstantGameAutoStreaming()) - { - var automaticfillinstantgame = miniGameProperty.FindPropertyRelative("m_AutomaticFillInstantGame"); - if (automaticfillinstantgame.boolValue) - { - ProjectConf.FindPropertyRelative("CDN").stringValue = WXConvertCore.GetInstantGameAutoStreamingCDN(); - if (!ProjectConf.FindPropertyRelative("bundlePathIdentifier").stringValue.Contains("AS;")) - { - ProjectConf.FindPropertyRelative("bundlePathIdentifier").stringValue += "AS;"; - } - if (!ProjectConf.FindPropertyRelative("bundlePathIdentifier").stringValue.Contains("CUS/CustomAB;")) - { - ProjectConf.FindPropertyRelative("bundlePathIdentifier").stringValue += "CUS/CustomAB;"; - } - ProjectConf.FindPropertyRelative("dataFileSubPrefix").stringValue = "CUS"; - } - } - - var _ProjectConf = new WXProjectConf(); - deserializeProjectConf(_ProjectConf, ProjectConf); - loadProjectConfData(_ProjectConf); - - var SDKOptions = miniGameProperty.FindPropertyRelative("SDKOptions"); - var _SDKOptions = new SDKOptions(); - deserializeSDKOptions(_SDKOptions, SDKOptions); - loadSDKOptionsData(_SDKOptions); - - var CompileOptions = miniGameProperty.FindPropertyRelative("CompileOptions"); - var _CompileOptions = new CompileOptions(); - deserializeCompileOptions(_CompileOptions, CompileOptions); - loadCompileOptionsData(_CompileOptions); - - var FontOptions = miniGameProperty.FindPropertyRelative("FontOptions"); - var _FontOptions = new FontOptions(); - deserializeFontOptions(_FontOptions, FontOptions); - loadFontOptionsData(_FontOptions); - } - - private void loadProjectConfData(WXProjectConf ProjectConf) - { - this.setData("projectName", ProjectConf.projectName); - this.setData("appid", ProjectConf.Appid); - this.setData("cdn", ProjectConf.CDN); - this.setData("assetLoadType", ProjectConf.assetLoadType); - this.setData("compressDataPackage", ProjectConf.compressDataPackage); - this.setData("videoUrl", ProjectConf.VideoUrl); - this.setData("orientation", (int)ProjectConf.Orientation); - this.setData("dst", ProjectConf.relativeDST); - this.setData("bundleHashLength", ProjectConf.bundleHashLength.ToString()); - this.setData("bundlePathIdentifier", ProjectConf.bundlePathIdentifier); - this.setData("bundleExcludeExtensions", ProjectConf.bundleExcludeExtensions); - this.setData("preloadFiles", ProjectConf.preloadFiles); - this.setData("bgImageSrc", ProjectConf.bgImageSrc); - - tex = AssetDatabase.LoadAssetAtPath(ProjectConf.bgImageSrc); - this.setData("memorySize", ProjectConf.MemorySize.ToString()); - this.setData("hideAfterCallMain", ProjectConf.HideAfterCallMain); - - this.setData("dataFileSubPrefix", ProjectConf.dataFileSubPrefix); - this.setData("maxStorage", ProjectConf.maxStorage.ToString()); - this.setData("defaultReleaseSize", ProjectConf.defaultReleaseSize.ToString()); - this.setData("texturesHashLength", ProjectConf.texturesHashLength.ToString()); - this.setData("texturesPath", ProjectConf.texturesPath); - this.setData("needCacheTextures", ProjectConf.needCacheTextures); - this.setData("loadingBarWidth", ProjectConf.loadingBarWidth.ToString()); - this.setData("needCheckUpdate", ProjectConf.needCheckUpdate); - this.setData("disableHighPerformanceFallback", ProjectConf.disableHighPerformanceFallback); - } - - private void loadSDKOptionsData(SDKOptions SDKOptions) - { - this.setData("useFriendRelation", SDKOptions.UseFriendRelation); - this.setData("useMiniGameChat", SDKOptions.UseMiniGameChat); - this.setData("preloadWXFont", SDKOptions.PreloadWXFont); - this.setData("disableMultiTouch", SDKOptions.disableMultiTouch); - } - - private void loadCompileOptionsData(CompileOptions CompileOptions) - { - this.setData("developBuild", CompileOptions.DevelopBuild); - this.setData("autoProfile", CompileOptions.AutoProfile); - this.setData("scriptOnly", CompileOptions.ScriptOnly); - this.setData("il2CppOptimizeSize", CompileOptions.Il2CppOptimizeSize); - this.setData("profilingFuncs", CompileOptions.profilingFuncs); - this.setData("profilingMemory", CompileOptions.ProfilingMemory); - this.setData("deleteStreamingAssets", CompileOptions.DeleteStreamingAssets); - this.setData("cleanBuild", CompileOptions.CleanBuild); - this.setData("customNodePath", CompileOptions.CustomNodePath); - this.setData("webgl2", CompileOptions.Webgl2); - this.setData("iOSPerformancePlus", CompileOptions.enableIOSPerformancePlus); - this.setData("iOSMetal", CompileOptions.enableiOSMetal); - this.setData("EmscriptenGLX", CompileOptions.enableEmscriptenGLX); - this.setData("fbslim", CompileOptions.fbslim); - this.setData("autoAdaptScreen", CompileOptions.autoAdaptScreen); - this.setData("showMonitorSuggestModal", CompileOptions.showMonitorSuggestModal); - this.setData("enableProfileStats", CompileOptions.enableProfileStats); - this.setData("enableRenderAnalysis", CompileOptions.enableRenderAnalysis); - this.setData("brotliMT", CompileOptions.brotliMT); + this.setData("dataFileSubPrefix", config.ProjectConf.dataFileSubPrefix); + this.setData("maxStorage", config.ProjectConf.maxStorage.ToString()); + this.setData("defaultReleaseSize", config.ProjectConf.defaultReleaseSize.ToString()); + this.setData("texturesHashLength", config.ProjectConf.texturesHashLength.ToString()); + this.setData("texturesPath", config.ProjectConf.texturesPath); + this.setData("needCacheTextures", config.ProjectConf.needCacheTextures); + this.setData("loadingBarWidth", config.ProjectConf.loadingBarWidth.ToString()); + this.setData("needCheckUpdate", config.ProjectConf.needCheckUpdate); + this.setData("disableHighPerformanceFallback", config.ProjectConf.disableHighPerformanceFallback); + this.setData("autoAdaptScreen", config.CompileOptions.autoAdaptScreen); + this.setData("showMonitorSuggestModal", config.CompileOptions.showMonitorSuggestModal); + this.setData("enableProfileStats", config.CompileOptions.enableProfileStats); + this.setData("enableRenderAnalysis", config.CompileOptions.enableRenderAnalysis); + this.setData("brotliMT", config.CompileOptions.brotliMT); #if UNITY_6000_0_OR_NEWER - this.setData("enableWasm2023", CompileOptions.enableWasm2023); + this.setData("enableWasm2023", config.CompileOptions.enableWasm2023); #endif - this.setData("enablePerfAnalysis", CompileOptions.enablePerfAnalysis); - } + this.setData("enablePerfAnalysis", config.CompileOptions.enablePerfAnalysis); + this.setData("autoUploadFirstBundle", true); - private void loadFontOptionsData(FontOptions FontOptions) - { - this.setData("CJK_Unified_Ideographs", FontOptions.CJK_Unified_Ideographs); - this.setData("C0_Controls_and_Basic_Latin", FontOptions.C0_Controls_and_Basic_Latin); - this.setData("CJK_Symbols_and_Punctuation", FontOptions.CJK_Symbols_and_Punctuation); - this.setData("General_Punctuation", FontOptions.General_Punctuation); - this.setData("Enclosed_CJK_Letters_and_Months", FontOptions.Enclosed_CJK_Letters_and_Months); - this.setData("Vertical_Forms", FontOptions.Vertical_Forms); - this.setData("CJK_Compatibility_Forms", FontOptions.CJK_Compatibility_Forms); - this.setData("Miscellaneous_Symbols", FontOptions.Miscellaneous_Symbols); - this.setData("CJK_Compatibility", FontOptions.CJK_Compatibility); - this.setData("Halfwidth_and_Fullwidth_Forms", FontOptions.Halfwidth_and_Fullwidth_Forms); - this.setData("Dingbats", FontOptions.Dingbats); - this.setData("Letterlike_Symbols", FontOptions.Letterlike_Symbols); - this.setData("Enclosed_Alphanumerics", FontOptions.Enclosed_Alphanumerics); - this.setData("Number_Forms", FontOptions.Number_Forms); - this.setData("Currency_Symbols", FontOptions.Currency_Symbols); - this.setData("Arrows", FontOptions.Arrows); - this.setData("Geometric_Shapes", FontOptions.Geometric_Shapes); - this.setData("Mathematical_Operators", FontOptions.Mathematical_Operators); - this.setData("CustomUnicode", FontOptions.CustomUnicode); + // font options + this.setData("CJK_Unified_Ideographs", config.FontOptions.CJK_Unified_Ideographs); + this.setData("C0_Controls_and_Basic_Latin", config.FontOptions.C0_Controls_and_Basic_Latin); + this.setData("CJK_Symbols_and_Punctuation", config.FontOptions.CJK_Symbols_and_Punctuation); + this.setData("General_Punctuation", config.FontOptions.General_Punctuation); + this.setData("Enclosed_CJK_Letters_and_Months", config.FontOptions.Enclosed_CJK_Letters_and_Months); + this.setData("Vertical_Forms", config.FontOptions.Vertical_Forms); + this.setData("CJK_Compatibility_Forms", config.FontOptions.CJK_Compatibility_Forms); + this.setData("Miscellaneous_Symbols", config.FontOptions.Miscellaneous_Symbols); + this.setData("CJK_Compatibility", config.FontOptions.CJK_Compatibility); + this.setData("Halfwidth_and_Fullwidth_Forms", config.FontOptions.Halfwidth_and_Fullwidth_Forms); + this.setData("Dingbats", config.FontOptions.Dingbats); + this.setData("Letterlike_Symbols", config.FontOptions.Letterlike_Symbols); + this.setData("Enclosed_Alphanumerics", config.FontOptions.Enclosed_Alphanumerics); + this.setData("Number_Forms", config.FontOptions.Number_Forms); + this.setData("Currency_Symbols", config.FontOptions.Currency_Symbols); + this.setData("Arrows", config.FontOptions.Arrows); + this.setData("Geometric_Shapes", config.FontOptions.Geometric_Shapes); + this.setData("Mathematical_Operators", config.FontOptions.Mathematical_Operators); + this.setData("CustomUnicode", config.FontOptions.CustomUnicode); } private void saveData() { - saveProjectConfData(config.ProjectConf); - saveSDKOptionsData(config.SDKOptions); - saveCompileOptionsData(config.CompileOptions); - saveFontOptionsData(config.FontOptions); + config.ProjectConf.projectName = this.getDataInput("projectName"); + config.ProjectConf.Appid = this.getDataInput("appid"); + config.ProjectConf.CDN = this.getDataInput("cdn"); + config.ProjectConf.assetLoadType = this.getDataPop("assetLoadType"); + config.ProjectConf.compressDataPackage = this.getDataCheckbox("compressDataPackage"); + config.ProjectConf.VideoUrl = this.getDataInput("videoUrl"); + config.ProjectConf.Orientation = (WXScreenOritation)this.getDataPop("orientation"); + config.ProjectConf.relativeDST = this.getDataInput("dst"); + config.ProjectConf.DST = GetAbsolutePath(config.ProjectConf.relativeDST); + config.ProjectConf.bundleHashLength = int.Parse(this.getDataInput("bundleHashLength")); + config.ProjectConf.bundlePathIdentifier = this.getDataInput("bundlePathIdentifier"); + config.ProjectConf.bundleExcludeExtensions = this.getDataInput("bundleExcludeExtensions"); + config.ProjectConf.preloadFiles = this.getDataInput("preloadFiles"); + config.CompileOptions.DevelopBuild = this.getDataCheckbox("developBuild"); + config.CompileOptions.AutoProfile = this.getDataCheckbox("autoProfile"); + config.CompileOptions.ScriptOnly = this.getDataCheckbox("scriptOnly"); + config.CompileOptions.Il2CppOptimizeSize = this.getDataCheckbox("il2CppOptimizeSize"); + config.CompileOptions.profilingFuncs = this.getDataCheckbox("profilingFuncs"); + config.CompileOptions.ProfilingMemory = this.getDataCheckbox("profilingMemory"); + config.CompileOptions.DeleteStreamingAssets = this.getDataCheckbox("deleteStreamingAssets"); + config.CompileOptions.CleanBuild = this.getDataCheckbox("cleanBuild"); + config.CompileOptions.CustomNodePath = this.getDataInput("customNodePath"); + config.CompileOptions.Webgl2 = this.getDataCheckbox("webgl2"); + config.CompileOptions.enableIOSPerformancePlus = this.getDataCheckbox("iOSPerformancePlus"); + config.CompileOptions.enableiOSMetal = this.getDataCheckbox("iOSMetal"); + config.CompileOptions.enableEmscriptenGLX = this.getDataCheckbox("EmscriptenGLX"); + config.CompileOptions.fbslim = this.getDataCheckbox("fbslim"); + config.SDKOptions.UseFriendRelation = this.getDataCheckbox("useFriendRelation"); + config.SDKOptions.UseMiniGameChat = this.getDataCheckbox("useMiniGameChat"); + config.SDKOptions.PreloadWXFont = this.getDataCheckbox("preloadWXFont"); + config.SDKOptions.disableMultiTouch = this.getDataCheckbox("disableMultiTouch"); + config.ProjectConf.bgImageSrc = this.getDataInput("bgImageSrc"); + config.ProjectConf.MemorySize = int.Parse(this.getDataInput("memorySize")); + config.ProjectConf.HideAfterCallMain = this.getDataCheckbox("hideAfterCallMain"); + config.ProjectConf.dataFileSubPrefix = this.getDataInput("dataFileSubPrefix"); + config.ProjectConf.maxStorage = int.Parse(this.getDataInput("maxStorage")); + config.ProjectConf.defaultReleaseSize = int.Parse(this.getDataInput("defaultReleaseSize")); + config.ProjectConf.texturesHashLength = int.Parse(this.getDataInput("texturesHashLength")); + config.ProjectConf.texturesPath = this.getDataInput("texturesPath"); + config.ProjectConf.needCacheTextures = this.getDataCheckbox("needCacheTextures"); + config.ProjectConf.loadingBarWidth = int.Parse(this.getDataInput("loadingBarWidth")); + config.ProjectConf.needCheckUpdate = this.getDataCheckbox("needCheckUpdate"); + config.ProjectConf.disableHighPerformanceFallback = this.getDataCheckbox("disableHighPerformanceFallback"); + config.CompileOptions.autoAdaptScreen = this.getDataCheckbox("autoAdaptScreen"); + config.CompileOptions.showMonitorSuggestModal = this.getDataCheckbox("showMonitorSuggestModal"); + config.CompileOptions.enableProfileStats = this.getDataCheckbox("enableProfileStats"); + config.CompileOptions.enableRenderAnalysis = this.getDataCheckbox("enableRenderAnalysis"); + config.CompileOptions.brotliMT = this.getDataCheckbox("brotliMT"); +#if UNITY_6000_0_OR_NEWER + config.CompileOptions.enableWasm2023 = this.getDataCheckbox("enableWasm2023"); +#endif + config.CompileOptions.enablePerfAnalysis = this.getDataCheckbox("enablePerfAnalysis"); + + // font options + config.FontOptions.CJK_Unified_Ideographs = this.getDataCheckbox("CJK_Unified_Ideographs"); + config.FontOptions.C0_Controls_and_Basic_Latin = this.getDataCheckbox("C0_Controls_and_Basic_Latin"); + config.FontOptions.CJK_Symbols_and_Punctuation = this.getDataCheckbox("CJK_Symbols_and_Punctuation"); + config.FontOptions.General_Punctuation = this.getDataCheckbox("General_Punctuation"); + config.FontOptions.Enclosed_CJK_Letters_and_Months = this.getDataCheckbox("Enclosed_CJK_Letters_and_Months"); + config.FontOptions.Vertical_Forms = this.getDataCheckbox("Vertical_Forms"); + config.FontOptions.CJK_Compatibility_Forms = this.getDataCheckbox("CJK_Compatibility_Forms"); + config.FontOptions.Miscellaneous_Symbols = this.getDataCheckbox("Miscellaneous_Symbols"); + config.FontOptions.CJK_Compatibility = this.getDataCheckbox("CJK_Compatibility"); + config.FontOptions.Halfwidth_and_Fullwidth_Forms = this.getDataCheckbox("Halfwidth_and_Fullwidth_Forms"); + config.FontOptions.Dingbats = this.getDataCheckbox("Dingbats"); + config.FontOptions.Letterlike_Symbols = this.getDataCheckbox("Letterlike_Symbols"); + config.FontOptions.Enclosed_Alphanumerics = this.getDataCheckbox("Enclosed_Alphanumerics"); + config.FontOptions.Number_Forms = this.getDataCheckbox("Number_Forms"); + config.FontOptions.Currency_Symbols = this.getDataCheckbox("Currency_Symbols"); + config.FontOptions.Arrows = this.getDataCheckbox("Arrows"); + config.FontOptions.Geometric_Shapes = this.getDataCheckbox("Geometric_Shapes"); + config.FontOptions.Mathematical_Operators = this.getDataCheckbox("Mathematical_Operators"); + config.FontOptions.CustomUnicode = this.getDataInput("CustomUnicode"); ApplyPerfAnalysisSetting(); } - private void saveData(SerializedObject serializedObject, SerializedProperty miniGameProperty) - { - serializedObject.UpdateIfRequiredOrScript(); - - var ProjectConf = miniGameProperty.FindPropertyRelative("ProjectConf"); - var _ProjectConf = new WXProjectConf(); - saveProjectConfData(_ProjectConf); - serializeProjectConf(_ProjectConf, ProjectConf); - - var CompileOptions = miniGameProperty.FindPropertyRelative("CompileOptions"); - var _CompileOptions = new CompileOptions(); - saveCompileOptionsData(_CompileOptions); - serializeCompileOptions(_CompileOptions, CompileOptions); - - var SDKOptions = miniGameProperty.FindPropertyRelative("SDKOptions"); - var _SDKOptions = new SDKOptions(); - saveSDKOptionsData(_SDKOptions); - serializeSDKOptions(_SDKOptions, SDKOptions); - - var FontOptions = miniGameProperty.FindPropertyRelative("FontOptions"); - var _FontOptions = new FontOptions(); - saveFontOptionsData(_FontOptions); - serializeFontOptions(_FontOptions, FontOptions); - - miniGameProperty.FindPropertyRelative("m_AutomaticFillInstantGame").boolValue = getDataCheckbox("m_AutomaticFillInstantGame"); - - serializedObject.ApplyModifiedProperties(); - } - - private void saveProjectConfData(WXProjectConf ProjectConf) - { - ProjectConf.projectName = this.getDataInput("projectName"); - ProjectConf.Appid = this.getDataInput("appid"); - ProjectConf.CDN = this.getDataInput("cdn"); - ProjectConf.assetLoadType = this.getDataPop("assetLoadType"); - ProjectConf.compressDataPackage = this.getDataCheckbox("compressDataPackage"); - ProjectConf.VideoUrl = this.getDataInput("videoUrl"); - ProjectConf.Orientation = (WXScreenOritation)this.getDataPop("orientation"); - ProjectConf.relativeDST = this.getDataInput("dst"); - ProjectConf.DST = GetAbsolutePath(ProjectConf.relativeDST); - ProjectConf.bundleHashLength = int.Parse(this.getDataInput("bundleHashLength")); - ProjectConf.bundlePathIdentifier = this.getDataInput("bundlePathIdentifier"); - ProjectConf.bundleExcludeExtensions = this.getDataInput("bundleExcludeExtensions"); - ProjectConf.preloadFiles = this.getDataInput("preloadFiles"); - - ProjectConf.bgImageSrc = this.getDataInput("bgImageSrc"); - ProjectConf.MemorySize = int.Parse(this.getDataInput("memorySize")); - ProjectConf.HideAfterCallMain = this.getDataCheckbox("hideAfterCallMain"); - ProjectConf.dataFileSubPrefix = this.getDataInput("dataFileSubPrefix"); - ProjectConf.maxStorage = int.Parse(this.getDataInput("maxStorage")); - ProjectConf.defaultReleaseSize = int.Parse(this.getDataInput("defaultReleaseSize")); - ProjectConf.texturesHashLength = int.Parse(this.getDataInput("texturesHashLength")); - ProjectConf.texturesPath = this.getDataInput("texturesPath"); - ProjectConf.needCacheTextures = this.getDataCheckbox("needCacheTextures"); - ProjectConf.loadingBarWidth = int.Parse(this.getDataInput("loadingBarWidth")); - ProjectConf.needCheckUpdate = this.getDataCheckbox("needCheckUpdate"); - ProjectConf.disableHighPerformanceFallback = this.getDataCheckbox("disableHighPerformanceFallback"); - } - - private void saveSDKOptionsData(SDKOptions SDKOptions) - { - SDKOptions.UseFriendRelation = this.getDataCheckbox("useFriendRelation"); - SDKOptions.UseMiniGameChat = this.getDataCheckbox("useMiniGameChat"); - SDKOptions.PreloadWXFont = this.getDataCheckbox("preloadWXFont"); - SDKOptions.disableMultiTouch = this.getDataCheckbox("disableMultiTouch"); - } - - private void saveCompileOptionsData(CompileOptions CompileOptions) - { - CompileOptions.DevelopBuild = this.getDataCheckbox("developBuild"); - CompileOptions.AutoProfile = this.getDataCheckbox("autoProfile"); - CompileOptions.ScriptOnly = this.getDataCheckbox("scriptOnly"); - CompileOptions.Il2CppOptimizeSize = this.getDataCheckbox("il2CppOptimizeSize"); - CompileOptions.profilingFuncs = this.getDataCheckbox("profilingFuncs"); - CompileOptions.ProfilingMemory = this.getDataCheckbox("profilingMemory"); - CompileOptions.DeleteStreamingAssets = this.getDataCheckbox("deleteStreamingAssets"); - CompileOptions.CleanBuild = this.getDataCheckbox("cleanBuild"); - CompileOptions.CustomNodePath = this.getDataInput("customNodePath"); - CompileOptions.Webgl2 = this.getDataCheckbox("webgl2"); - CompileOptions.enableIOSPerformancePlus = this.getDataCheckbox("iOSPerformancePlus"); - CompileOptions.enableiOSMetal = this.getDataCheckbox("iOSMetal"); - CompileOptions.enableEmscriptenGLX = this.getDataCheckbox("EmscriptenGLX"); - CompileOptions.fbslim = this.getDataCheckbox("fbslim"); - - CompileOptions.autoAdaptScreen = this.getDataCheckbox("autoAdaptScreen"); - CompileOptions.showMonitorSuggestModal = this.getDataCheckbox("showMonitorSuggestModal"); - CompileOptions.enableProfileStats = this.getDataCheckbox("enableProfileStats"); - CompileOptions.enableRenderAnalysis = this.getDataCheckbox("enableRenderAnalysis"); - CompileOptions.brotliMT = this.getDataCheckbox("brotliMT"); -#if UNITY_6000_0_OR_NEWER - CompileOptions.enableWasm2023 = this.getDataCheckbox("enableWasm2023"); -#endif - CompileOptions.enablePerfAnalysis = this.getDataCheckbox("enablePerfAnalysis"); - } - - private void saveFontOptionsData(FontOptions FontOptions) - { - FontOptions.CJK_Unified_Ideographs = this.getDataCheckbox("CJK_Unified_Ideographs"); - FontOptions.C0_Controls_and_Basic_Latin = this.getDataCheckbox("C0_Controls_and_Basic_Latin"); - FontOptions.CJK_Symbols_and_Punctuation = this.getDataCheckbox("CJK_Symbols_and_Punctuation"); - FontOptions.General_Punctuation = this.getDataCheckbox("General_Punctuation"); - FontOptions.Enclosed_CJK_Letters_and_Months = this.getDataCheckbox("Enclosed_CJK_Letters_and_Months"); - FontOptions.Vertical_Forms = this.getDataCheckbox("Vertical_Forms"); - FontOptions.CJK_Compatibility_Forms = this.getDataCheckbox("CJK_Compatibility_Forms"); - FontOptions.Miscellaneous_Symbols = this.getDataCheckbox("Miscellaneous_Symbols"); - FontOptions.CJK_Compatibility = this.getDataCheckbox("CJK_Compatibility"); - FontOptions.Halfwidth_and_Fullwidth_Forms = this.getDataCheckbox("Halfwidth_and_Fullwidth_Forms"); - FontOptions.Dingbats = this.getDataCheckbox("Dingbats"); - FontOptions.Letterlike_Symbols = this.getDataCheckbox("Letterlike_Symbols"); - FontOptions.Enclosed_Alphanumerics = this.getDataCheckbox("Enclosed_Alphanumerics"); - FontOptions.Number_Forms = this.getDataCheckbox("Number_Forms"); - FontOptions.Currency_Symbols = this.getDataCheckbox("Currency_Symbols"); - FontOptions.Arrows = this.getDataCheckbox("Arrows"); - FontOptions.Geometric_Shapes = this.getDataCheckbox("Geometric_Shapes"); - FontOptions.Mathematical_Operators = this.getDataCheckbox("Mathematical_Operators"); - FontOptions.CustomUnicode = this.getDataInput("CustomUnicode"); - } - - private void deserializeProjectConf(WXProjectConf _ProjectConf, SerializedProperty ProjectConf) - { - _ProjectConf.projectName = ProjectConf.FindPropertyRelative("projectName").stringValue; - _ProjectConf.Appid = ProjectConf.FindPropertyRelative("Appid").stringValue; - _ProjectConf.CDN = ProjectConf.FindPropertyRelative("CDN").stringValue; - _ProjectConf.assetLoadType = ProjectConf.FindPropertyRelative("assetLoadType").intValue; - _ProjectConf.compressDataPackage = ProjectConf.FindPropertyRelative("compressDataPackage").boolValue; - _ProjectConf.VideoUrl = ProjectConf.FindPropertyRelative("VideoUrl").stringValue; - _ProjectConf.Orientation = (WXScreenOritation)ProjectConf.FindPropertyRelative("Orientation").enumValueIndex; - _ProjectConf.relativeDST = ProjectConf.FindPropertyRelative("relativeDST").stringValue; - _ProjectConf.DST = ProjectConf.FindPropertyRelative("DST").stringValue; - - _ProjectConf.bundleHashLength = ProjectConf.FindPropertyRelative("bundleHashLength").intValue; - _ProjectConf.bundlePathIdentifier = ProjectConf.FindPropertyRelative("bundlePathIdentifier").stringValue; - _ProjectConf.bundleExcludeExtensions = ProjectConf.FindPropertyRelative("bundleExcludeExtensions").stringValue; - _ProjectConf.preloadFiles = ProjectConf.FindPropertyRelative("preloadFiles").stringValue; - _ProjectConf.bgImageSrc = ProjectConf.FindPropertyRelative("bgImageSrc").stringValue; - _ProjectConf.MemorySize = ProjectConf.FindPropertyRelative("MemorySize").intValue; - _ProjectConf.HideAfterCallMain = ProjectConf.FindPropertyRelative("HideAfterCallMain").boolValue; - _ProjectConf.dataFileSubPrefix = ProjectConf.FindPropertyRelative("dataFileSubPrefix").stringValue; - _ProjectConf.maxStorage = ProjectConf.FindPropertyRelative("maxStorage").intValue; - _ProjectConf.defaultReleaseSize = ProjectConf.FindPropertyRelative("defaultReleaseSize").intValue; - _ProjectConf.texturesHashLength = ProjectConf.FindPropertyRelative("texturesHashLength").intValue; - _ProjectConf.texturesPath = ProjectConf.FindPropertyRelative("texturesPath").stringValue; - _ProjectConf.needCacheTextures = ProjectConf.FindPropertyRelative("needCacheTextures").boolValue; - _ProjectConf.loadingBarWidth = ProjectConf.FindPropertyRelative("loadingBarWidth").intValue; - _ProjectConf.needCheckUpdate = ProjectConf.FindPropertyRelative("needCheckUpdate").boolValue; - _ProjectConf.disableHighPerformanceFallback = ProjectConf.FindPropertyRelative("disableHighPerformanceFallback").boolValue; - } - private void serializeProjectConf(WXProjectConf _ProjectConf, SerializedProperty ProjectConf) - { - ProjectConf.FindPropertyRelative("projectName").stringValue = _ProjectConf.projectName; - ProjectConf.FindPropertyRelative("Appid").stringValue = _ProjectConf.Appid; - ProjectConf.FindPropertyRelative("CDN").stringValue = _ProjectConf.CDN; - ProjectConf.FindPropertyRelative("assetLoadType").intValue = _ProjectConf.assetLoadType; - ProjectConf.FindPropertyRelative("compressDataPackage").boolValue = _ProjectConf.compressDataPackage; - ProjectConf.FindPropertyRelative("VideoUrl").stringValue = _ProjectConf.VideoUrl; - ProjectConf.FindPropertyRelative("Orientation").enumValueIndex = (int)_ProjectConf.Orientation; - ProjectConf.FindPropertyRelative("relativeDST").stringValue = _ProjectConf.relativeDST; - ProjectConf.FindPropertyRelative("DST").stringValue = _ProjectConf.DST; - - ProjectConf.FindPropertyRelative("bundleHashLength").intValue = _ProjectConf.bundleHashLength; - ProjectConf.FindPropertyRelative("bundlePathIdentifier").stringValue = _ProjectConf.bundlePathIdentifier; - ProjectConf.FindPropertyRelative("bundleExcludeExtensions").stringValue = _ProjectConf.bundleExcludeExtensions; - ProjectConf.FindPropertyRelative("preloadFiles").stringValue = _ProjectConf.preloadFiles; - ProjectConf.FindPropertyRelative("bgImageSrc").stringValue = _ProjectConf.bgImageSrc; - ProjectConf.FindPropertyRelative("MemorySize").intValue = _ProjectConf.MemorySize; - ProjectConf.FindPropertyRelative("HideAfterCallMain").boolValue = _ProjectConf.HideAfterCallMain; - ProjectConf.FindPropertyRelative("dataFileSubPrefix").stringValue = _ProjectConf.dataFileSubPrefix; - ProjectConf.FindPropertyRelative("maxStorage").intValue = _ProjectConf.maxStorage; - ProjectConf.FindPropertyRelative("defaultReleaseSize").intValue = _ProjectConf.defaultReleaseSize; - ProjectConf.FindPropertyRelative("texturesHashLength").intValue = _ProjectConf.texturesHashLength; - ProjectConf.FindPropertyRelative("texturesPath").stringValue = _ProjectConf.texturesPath; - ProjectConf.FindPropertyRelative("needCacheTextures").boolValue = _ProjectConf.needCacheTextures; - ProjectConf.FindPropertyRelative("loadingBarWidth").intValue = _ProjectConf.loadingBarWidth; - ProjectConf.FindPropertyRelative("needCheckUpdate").boolValue = _ProjectConf.needCheckUpdate; - ProjectConf.FindPropertyRelative("disableHighPerformanceFallback").boolValue = _ProjectConf.disableHighPerformanceFallback; - - //miniGameProperty.FindPropertyRelative("m_AutomaticFillInstantGame").boolValue = getDataCheckbox("m_AutomaticFillInstantGame"); - - } - - private void deserializeSDKOptions(SDKOptions _SDKOptions, SerializedProperty SDKOptions) - { - _SDKOptions.UseFriendRelation = SDKOptions.FindPropertyRelative("UseFriendRelation").boolValue; - _SDKOptions.UseMiniGameChat = SDKOptions.FindPropertyRelative("UseMiniGameChat").boolValue; - _SDKOptions.PreloadWXFont = SDKOptions.FindPropertyRelative("PreloadWXFont").boolValue; - _SDKOptions.disableMultiTouch = SDKOptions.FindPropertyRelative("disableMultiTouch").boolValue; - } - private void serializeSDKOptions(SDKOptions _SDKOptionsf, SerializedProperty SDKOptions) - { - SDKOptions.FindPropertyRelative("UseFriendRelation").boolValue = _SDKOptionsf.UseFriendRelation; - SDKOptions.FindPropertyRelative("UseMiniGameChat").boolValue = _SDKOptionsf.UseMiniGameChat; - SDKOptions.FindPropertyRelative("PreloadWXFont").boolValue = _SDKOptionsf.PreloadWXFont; - SDKOptions.FindPropertyRelative("disableMultiTouch").boolValue = _SDKOptionsf.disableMultiTouch; - } - - private void deserializeCompileOptions(CompileOptions _CompileOptions, SerializedProperty CompileOptions) - { - //CompileOptions.FindPropertyRelative("DevelopBuild").boolValue = serializedObject.FindProperty("m_PlatformSettings").FindPropertyRelative("m_Development").boolValue; - _CompileOptions.DevelopBuild = CompileOptions.FindPropertyRelative("DevelopBuild").boolValue; - _CompileOptions.AutoProfile = CompileOptions.FindPropertyRelative("AutoProfile").boolValue; - _CompileOptions.ScriptOnly = CompileOptions.FindPropertyRelative("ScriptOnly").boolValue; - _CompileOptions.Il2CppOptimizeSize = CompileOptions.FindPropertyRelative("Il2CppOptimizeSize").boolValue; - _CompileOptions.profilingFuncs = CompileOptions.FindPropertyRelative("profilingFuncs").boolValue; - _CompileOptions.ProfilingMemory = CompileOptions.FindPropertyRelative("ProfilingMemory").boolValue; - _CompileOptions.DeleteStreamingAssets = CompileOptions.FindPropertyRelative("DeleteStreamingAssets").boolValue; - _CompileOptions.CleanBuild = CompileOptions.FindPropertyRelative("CleanBuild").boolValue; - _CompileOptions.CustomNodePath = CompileOptions.FindPropertyRelative("CustomNodePath").stringValue; - _CompileOptions.Webgl2 = CompileOptions.FindPropertyRelative("Webgl2").boolValue; - _CompileOptions.enableIOSPerformancePlus = CompileOptions.FindPropertyRelative("enableIOSPerformancePlus").boolValue; - _CompileOptions.enableiOSMetal = CompileOptions.FindPropertyRelative("enableiOSMetal").boolValue; - _CompileOptions.enableEmscriptenGLX = CompileOptions.FindPropertyRelative("enableEmscriptenGLX").boolValue; - _CompileOptions.fbslim = CompileOptions.FindPropertyRelative("fbslim").boolValue; - - _CompileOptions.autoAdaptScreen = CompileOptions.FindPropertyRelative("autoAdaptScreen").boolValue; - _CompileOptions.showMonitorSuggestModal = CompileOptions.FindPropertyRelative("showMonitorSuggestModal").boolValue; - _CompileOptions.enableProfileStats = CompileOptions.FindPropertyRelative("enableProfileStats").boolValue; - _CompileOptions.enableRenderAnalysis = CompileOptions.FindPropertyRelative("enableRenderAnalysis").boolValue; - _CompileOptions.brotliMT = CompileOptions.FindPropertyRelative("brotliMT").boolValue; -#if UNITY_6000_0_OR_NEWER - _CompileOptions.enableWasm2023 = CompileOptions.FindPropertyRelative("enableWasm2023").boolValue; -#endif - _CompileOptions.enablePerfAnalysis = CompileOptions.FindPropertyRelative("enablePerfAnalysis").boolValue; - } - private void serializeCompileOptions(CompileOptions _CompileOptions, SerializedProperty CompileOptions) - { - //CompileOptions.FindPropertyRelative("DevelopBuild").boolValue = serializedObject.FindProperty("m_PlatformSettings").FindPropertyRelative("m_Development").boolValue; - CompileOptions.FindPropertyRelative("AutoProfile").boolValue = _CompileOptions.AutoProfile; - CompileOptions.FindPropertyRelative("ScriptOnly").boolValue = _CompileOptions.ScriptOnly; - CompileOptions.FindPropertyRelative("Il2CppOptimizeSize").boolValue = _CompileOptions.Il2CppOptimizeSize; - CompileOptions.FindPropertyRelative("profilingFuncs").boolValue = _CompileOptions.profilingFuncs; - CompileOptions.FindPropertyRelative("ProfilingMemory").boolValue = _CompileOptions.ProfilingMemory; - CompileOptions.FindPropertyRelative("DeleteStreamingAssets").boolValue = _CompileOptions.DeleteStreamingAssets; - CompileOptions.FindPropertyRelative("CleanBuild").boolValue = _CompileOptions.CleanBuild; - CompileOptions.FindPropertyRelative("CustomNodePath").stringValue = _CompileOptions.CustomNodePath; - CompileOptions.FindPropertyRelative("Webgl2").boolValue = _CompileOptions.Webgl2; - CompileOptions.FindPropertyRelative("enableIOSPerformancePlus").boolValue = _CompileOptions.enableIOSPerformancePlus; - CompileOptions.FindPropertyRelative("enableiOSMetal").boolValue = _CompileOptions.enableiOSMetal; - CompileOptions.FindPropertyRelative("enableEmscriptenGLX").boolValue = _CompileOptions.enableEmscriptenGLX; - CompileOptions.FindPropertyRelative("fbslim").boolValue = _CompileOptions.fbslim; - - CompileOptions.FindPropertyRelative("autoAdaptScreen").boolValue = _CompileOptions.autoAdaptScreen; - CompileOptions.FindPropertyRelative("showMonitorSuggestModal").boolValue = _CompileOptions.showMonitorSuggestModal; - CompileOptions.FindPropertyRelative("enableProfileStats").boolValue = _CompileOptions.enableProfileStats; - CompileOptions.FindPropertyRelative("enableRenderAnalysis").boolValue = _CompileOptions.enableRenderAnalysis; - CompileOptions.FindPropertyRelative("brotliMT").boolValue = _CompileOptions.brotliMT; - - } - - private void deserializeFontOptions(FontOptions _FontOptions, SerializedProperty FontOptions) - { - _FontOptions.CJK_Unified_Ideographs = FontOptions.FindPropertyRelative("CJK_Unified_Ideographs").boolValue; - _FontOptions.C0_Controls_and_Basic_Latin = FontOptions.FindPropertyRelative("C0_Controls_and_Basic_Latin").boolValue; - _FontOptions.CJK_Symbols_and_Punctuation = FontOptions.FindPropertyRelative("CJK_Symbols_and_Punctuation").boolValue; - _FontOptions.General_Punctuation = FontOptions.FindPropertyRelative("General_Punctuation").boolValue; - _FontOptions.Enclosed_CJK_Letters_and_Months = FontOptions.FindPropertyRelative("Enclosed_CJK_Letters_and_Months").boolValue; - _FontOptions.Vertical_Forms = FontOptions.FindPropertyRelative("Vertical_Forms").boolValue; - _FontOptions.CJK_Compatibility_Forms = FontOptions.FindPropertyRelative("CJK_Compatibility_Forms").boolValue; - _FontOptions.Miscellaneous_Symbols = FontOptions.FindPropertyRelative("Miscellaneous_Symbols").boolValue; - _FontOptions.CJK_Compatibility = FontOptions.FindPropertyRelative("CJK_Compatibility").boolValue; - _FontOptions.Halfwidth_and_Fullwidth_Forms = FontOptions.FindPropertyRelative("Halfwidth_and_Fullwidth_Forms").boolValue; - _FontOptions.Dingbats = FontOptions.FindPropertyRelative("Dingbats").boolValue; - _FontOptions.Letterlike_Symbols = FontOptions.FindPropertyRelative("Letterlike_Symbols").boolValue; - _FontOptions.Enclosed_Alphanumerics = FontOptions.FindPropertyRelative("Enclosed_Alphanumerics").boolValue; - _FontOptions.Number_Forms = FontOptions.FindPropertyRelative("Number_Forms").boolValue; - _FontOptions.Currency_Symbols = FontOptions.FindPropertyRelative("Currency_Symbols").boolValue; - _FontOptions.Arrows = FontOptions.FindPropertyRelative("Arrows").boolValue; - _FontOptions.Geometric_Shapes = FontOptions.FindPropertyRelative("Geometric_Shapes").boolValue; - _FontOptions.Mathematical_Operators = FontOptions.FindPropertyRelative("Mathematical_Operators").boolValue; - _FontOptions.CustomUnicode = FontOptions.FindPropertyRelative("CustomUnicode").stringValue; - } - private void serializeFontOptions(FontOptions _FontOptions, SerializedProperty FontOptions) - { - FontOptions.FindPropertyRelative("CJK_Unified_Ideographs").boolValue = _FontOptions.CJK_Unified_Ideographs; - FontOptions.FindPropertyRelative("C0_Controls_and_Basic_Latin").boolValue = _FontOptions.C0_Controls_and_Basic_Latin; - FontOptions.FindPropertyRelative("CJK_Symbols_and_Punctuation").boolValue = _FontOptions.CJK_Symbols_and_Punctuation; - FontOptions.FindPropertyRelative("General_Punctuation").boolValue = _FontOptions.General_Punctuation; - FontOptions.FindPropertyRelative("Enclosed_CJK_Letters_and_Months").boolValue = _FontOptions.Enclosed_CJK_Letters_and_Months; - FontOptions.FindPropertyRelative("Vertical_Forms").boolValue = _FontOptions.Vertical_Forms; - FontOptions.FindPropertyRelative("CJK_Compatibility_Forms").boolValue = _FontOptions.CJK_Compatibility_Forms; - FontOptions.FindPropertyRelative("Miscellaneous_Symbols").boolValue = _FontOptions.Miscellaneous_Symbols; - FontOptions.FindPropertyRelative("CJK_Compatibility").boolValue = _FontOptions.CJK_Compatibility; - FontOptions.FindPropertyRelative("Halfwidth_and_Fullwidth_Forms").boolValue = _FontOptions.Halfwidth_and_Fullwidth_Forms; - FontOptions.FindPropertyRelative("Dingbats").boolValue = _FontOptions.Dingbats; - FontOptions.FindPropertyRelative("Letterlike_Symbols").boolValue = _FontOptions.Letterlike_Symbols; - FontOptions.FindPropertyRelative("Enclosed_Alphanumerics").boolValue = _FontOptions.Enclosed_Alphanumerics; - FontOptions.FindPropertyRelative("Number_Forms").boolValue = _FontOptions.Number_Forms; - FontOptions.FindPropertyRelative("Currency_Symbols").boolValue = _FontOptions.Currency_Symbols; - FontOptions.FindPropertyRelative("Arrows").boolValue = _FontOptions.Arrows; - FontOptions.FindPropertyRelative("Geometric_Shapes").boolValue = _FontOptions.Geometric_Shapes; - FontOptions.FindPropertyRelative("Mathematical_Operators").boolValue = _FontOptions.Mathematical_Operators; - FontOptions.FindPropertyRelative("CustomUnicode").stringValue = _FontOptions.CustomUnicode; - FontOptions.FindPropertyRelative("Arrows").boolValue = _FontOptions.Arrows; - FontOptions.FindPropertyRelative("Geometric_Shapes").boolValue = _FontOptions.Geometric_Shapes; - FontOptions.FindPropertyRelative("Mathematical_Operators").boolValue = _FontOptions.Mathematical_Operators; - FontOptions.FindPropertyRelative("CustomUnicode").stringValue = _FontOptions.CustomUnicode; - } - - private string getDataInput(string target) { if (this.formInputData.ContainsKey(target)) diff --git a/Editor/WXPluginVersion.cs b/Editor/WXPluginVersion.cs index 1daae2571..b5b33fc56 100644 --- a/Editor/WXPluginVersion.cs +++ b/Editor/WXPluginVersion.cs @@ -2,7 +2,7 @@ namespace WeChatWASM { public class WXPluginVersion { - public static string pluginVersion = "202603160259"; // 这一行不要改他,导出的时候会自动替换 + public static string pluginVersion = "202604071136"; // 这一行不要改他,导出的时候会自动替换 } public class WXPluginConf diff --git a/Editor/wx-editor.dll b/Editor/wx-editor.dll index 4443e0e0d..2696c812c 100644 Binary files a/Editor/wx-editor.dll and b/Editor/wx-editor.dll differ diff --git a/Editor/wx-editor.xml.meta b/Editor/wx-editor.xml.meta index a1b05c6cb..6d8012406 100644 --- a/Editor/wx-editor.xml.meta +++ b/Editor/wx-editor.xml.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7330c57dbe403f6a6825fe311f4436ca +guid: fa0cf28c42641e1b1908525909a5e545 DefaultImporter: externalObjects: {} userData: diff --git a/Runtime/Plugins/WXAssetBundle.jslib b/Runtime/Plugins/WXAssetBundle.jslib index 30fa916c2..08f585d21 100644 --- a/Runtime/Plugins/WXAssetBundle.jslib +++ b/Runtime/Plugins/WXAssetBundle.jslib @@ -1,7 +1,7 @@ var WXAssetBundleLibrary = { $WXFS: {}, - WXFSInit: function (ttl, capacity) { + WXFSInit: function (ttl, capacity, prefetchSize, fdCacheCount) { function _instanceof(left, right) { if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { return !!right[Symbol.hasInstance](left); } else { return left instanceof right; } } function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!_instanceof(instance, Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -104,7 +104,7 @@ var WXAssetBundleLibrary = { this.hash.set(key, temp); return temp.ab; } - return -1; + return null; } }, { key: "put", @@ -122,14 +122,12 @@ var WXAssetBundleLibrary = { this.hash.delete(key); this.hash.set(key, value); } else { - if (this.capacity !== undefined && this.size >= this.capacity) { + while (this.capacity !== undefined && this.size >= this.capacity) { var idx = this.hash.keys().next().value; - this.size -= idx.ab.byteLength; + this.size -= this.hash.get(idx).ab.byteLength; this.hash.delete(idx); - this.hash.set(key, value); - } else { - this.hash.set(key, value); } + this.hash.set(key, value); } this.size += value.ab.byteLength; this.maxSize = Math.max(this.size, this.maxSize); @@ -187,6 +185,39 @@ var WXAssetBundleLibrary = { }(); WXFS.cache = new WXFileCache(ttl, capacity); + WXFS.prefetchSize = prefetchSize || 1024; // iOS prefetch bytes, default 1024 + // Per-frame perf counters + WXFS.perfReadCount = 0; // WXFS.read call count per frame + WXFS.perfCacheMissCount = 0; // LoadPartialFromFile / LoadBundleFromFile count per frame + WXFS.perfFdCacheMissCount = 0; // fd cache miss (close old + open new) count per frame + WXFS.perfOpenSyncCount = 0; // fs.openSync call count per frame + WXFS.perfStatSyncCount = 0; // fs.statSync call count per frame + WXFS.perfReadSyncCount = 0; // fs.readSync call count per frame + // LRU cache for wx file descriptors, max 10, default 1 + WXFS.fdCacheCount = Math.min(fdCacheCount || 1, 10); + WXFS.wxFdCache = new Map(); // path -> wxFd + WXFS.getWxFd = function(path) { + var wxFd = WXFS.wxFdCache.get(path); + if (wxFd !== undefined) { + // Move to end (most recently used) + WXFS.wxFdCache.delete(path); + WXFS.wxFdCache.set(path, wxFd); + return wxFd; + } + // Evict oldest if at capacity + if (WXFS.wxFdCache.size >= WXFS.fdCacheCount) { + var oldestPath = WXFS.wxFdCache.keys().next().value; + var oldestFd = WXFS.wxFdCache.get(oldestPath); + WXFS.fs.closeSync({ fd: oldestFd }); + WXFS.wxFdCache.delete(oldestPath); + WXFS.perfFdCacheMissCount++; + } + // Open new fd and cache + wxFd = WXFS.fs.openSync({ filePath: path, flag: 'r' }); + WXFS.perfOpenSyncCount++; + WXFS.wxFdCache.set(path, wxFd); + return wxFd; + }; if(unityNamespace.isIOS && unityNamespace.isH5Renderer) { WXFS.cache.RegularCleaning(1); } @@ -195,9 +226,10 @@ var WXAssetBundleLibrary = { try { var fd = WXFS.path2fd.get(path) if (fd !== undefined){ + var wxStream = WXFS.fd2wxStream.get(fd); var stat = { mode: 33206, - size: WXFS.cache.get(fd).byteLength, + size: wxStream.node.usedBytes, dev: 1, ino: 1, nlink: 1, @@ -213,7 +245,7 @@ var WXAssetBundleLibrary = { return stat; } var stat = WXFS.fs.statSync(path); - // something not in wx.FileSystemManager, just fill in 0/1 + WXFS.perfStatSyncCount++; stat.dev = 1; stat.ino = 1; stat.nlink = 1; @@ -278,17 +310,75 @@ var WXAssetBundleLibrary = { } return res; }; - WXFS.read = function(stream, buffer, offset, length, position){ - var contents = WXFS.cache.get(stream.fd); - if (contents === -1) { - var res = WXFS.LoadBundleFromFile(stream.path); - WXFS.cache.put(stream.fd, res); - contents = res; + // iOS: read partial file content on demand + WXFS.LoadPartialFromFile = function(path, position, length) { + var wxFd = WXFS.getWxFd(path); + var ab = new ArrayBuffer(length); + var res = WXFS.fs.readSync({ fd: wxFd, arrayBuffer: ab, offset: 0, length: length, position: position }); + WXFS.perfReadSyncCount++; + return { ab: ab, bytesRead: res.bytesRead }; + }; + // Open file, construct wxStream and store in related maps + WXFS.open = function(pathname) { + var numberfd = WXFS.path2fd.get(pathname); + if (numberfd !== undefined) { + return numberfd; } + numberfd = WXFS.newfd(); + var fileSize; + if (unityNamespace.isIOS && WXFS.prefetchSize > 0) { + // iOS: only get file size via statSync, do not read file content + fileSize = WXFS.fs.statSync(pathname).size; + WXFS.perfStatSyncCount++; + } else { + // Non-iOS: read file and cache + var res = WXFS.LoadBundleFromFile(pathname); + fileSize = new Uint8Array(res).length; + WXFS.cache.put(numberfd, res); + } + var wxStream = { + fd: numberfd, + path: pathname, + seekable: true, + position: 0, + stream_ops: MEMFS.stream_ops, + ungotten: [], + node: { mode: 32768, usedBytes: fileSize }, + error: false + }; + wxStream.stream_ops.read = WXFS.read; + WXFS.path2fd.set(pathname, numberfd); + WXFS.fd2wxStream.set(numberfd, wxStream); + return numberfd; + }; + WXFS.read = function(stream, buffer, offset, length, position){ if (position >= stream.node.usedBytes) return 0; var size = Math.min(stream.node.usedBytes - position, length); assert(size >= 0); - buffer.set(new Uint8Array(contents.slice(position, position + size)), offset); + WXFS.perfReadCount++; + // Check cache first + var contents = WXFS.cache.get(stream.fd); + if (contents && position + size <= contents.byteLength) { + buffer.set(new Uint8Array(contents, position, size), offset); + return size; + } + WXFS.perfCacheMissCount++; + // iOS: read on demand + if (unityNamespace.isIOS && WXFS.prefetchSize > 0) { + var readLen = position === 0 ? Math.max(size, Math.min(WXFS.prefetchSize, stream.node.usedBytes)) : size; + var res = WXFS.LoadPartialFromFile(stream.path, position, readLen); + if (position === 0) { + WXFS.cache.put(stream.fd, res.ab, true); + } + buffer.set(new Uint8Array(res.ab, 0, size), offset); + return size; + } + // Non-iOS: load full file + if (!contents) { + contents = WXFS.LoadBundleFromFile(stream.path); + WXFS.cache.put(stream.fd, contents); + } + buffer.set(new Uint8Array(contents, position, size), offset); return size; }; }, @@ -439,6 +529,34 @@ var WXAssetBundleLibrary = { }, WXGetBundleSizeOnDisk: function () { return WXFS&&WXFS.disk&&WXFS.disk.size; + }, + WXGetReadCount: function () { + return WXFS ? WXFS.perfReadCount : 0; + }, + WXGetCacheMissCount: function () { + return WXFS ? WXFS.perfCacheMissCount : 0; + }, + WXGetFdCacheMissCount: function () { + return WXFS ? WXFS.perfFdCacheMissCount : 0; + }, + WXGetOpenSyncCount: function () { + return WXFS ? WXFS.perfOpenSyncCount : 0; + }, + WXGetStatSyncCount: function () { + return WXFS ? WXFS.perfStatSyncCount : 0; + }, + WXGetReadSyncCount: function () { + return WXFS ? WXFS.perfReadSyncCount : 0; + }, + WXResetPerfCounters: function () { + if (WXFS) { + WXFS.perfReadCount = 0; + WXFS.perfCacheMissCount = 0; + WXFS.perfFdCacheMissCount = 0; + WXFS.perfOpenSyncCount = 0; + WXFS.perfStatSyncCount = 0; + WXFS.perfReadSyncCount = 0; + } } }; diff --git a/Runtime/Plugins/WxGameDataMonitor.jslib b/Runtime/Plugins/WxGameDataMonitor.jslib index 909f639f2..44690e9fe 100644 --- a/Runtime/Plugins/WxGameDataMonitor.jslib +++ b/Runtime/Plugins/WxGameDataMonitor.jslib @@ -48,6 +48,12 @@ mergeInto(LibraryManager.library, { numberOnDisk: _WXGetBundleNumberOnDisk(), sizeInMemory: _WXGetBundleSizeInMemory(), sizeOnDisk: _WXGetBundleSizeOnDisk(), + readCount: _WXGetReadCount(), + cacheMissCount: _WXGetCacheMissCount(), + fdCacheMissCount: _WXGetFdCacheMissCount(), + openSyncCount: _WXGetOpenSyncCount(), + statSyncCount: _WXGetStatSyncCount(), + readSyncCount: _WXGetReadSyncCount(), } } diff --git a/Runtime/Plugins/wx-perf.dll b/Runtime/Plugins/wx-perf.dll index 5320d0af3..86a80c7bb 100644 Binary files a/Runtime/Plugins/wx-perf.dll and b/Runtime/Plugins/wx-perf.dll differ diff --git a/Runtime/Plugins/wx-runtime-editor.dll b/Runtime/Plugins/wx-runtime-editor.dll index 2c9f8ea64..faf80a894 100644 Binary files a/Runtime/Plugins/wx-runtime-editor.dll and b/Runtime/Plugins/wx-runtime-editor.dll differ diff --git a/Runtime/Plugins/wx-runtime-editor.xml b/Runtime/Plugins/wx-runtime-editor.xml index 49960d977..bfe27b6ee 100644 --- a/Runtime/Plugins/wx-runtime-editor.xml +++ b/Runtime/Plugins/wx-runtime-editor.xml @@ -3486,11 +3486,6 @@ 允许微信读写日历的开关 - - - PC 内核版本号,仅在 PC 端存在该值 - - 客户端基础库版本 @@ -3754,86 +3749,11 @@ 宽度,单位:px - - - 擂台赛组件领奖信息 - - 通知组件信息 - - - 福利组件信息 - - - - - 组件的名称 - - - - - 领取事件详情(只在onOfficialComponentsInfoChange回调中返回) - - - - - 奖励领取结果:1-全部成功, 2-部分成功(礼物达到领取上限), 3-领奖失败 - - - - - 是否收到了稀有奖励 - - - - - 用户领取的奖励列表 - - - - - 奖励类型:0-道具礼包, 1-微信蓝包, 2-h5商家券, 3-现金红包, 4-小程序券, 5-盲盒 - - - - - 奖励来源信息 - - - - - 获取的奖励数量 - - - - - 道具列表 - - - - - 奖励类型:1-普通奖励, 2-稀有奖励 - - - - - 礼包名称 - - - - - 道具名称 - - - - - 道具数量 - - 组件的布局位置信息 @@ -3849,46 +3769,6 @@ 组件的名称 - - - 可领取的好友礼包数量 - - - - - 可领取的礼包数量 - - - - - 组件的名称 - - - - - 领取事件详情(只在onOfficialComponentsInfoChange回调中返回) - - - - - 礼包描述,只有 gift 类型才有 - - - - - 礼包图标,只有 gift 类型才有 - - - - - 礼包名称,只有 gift 类型才有 - - - - - gift: 礼包, friendGift: 好友礼包 - - 当前占用的空间大小, 单位 KB @@ -4691,36 +4571,6 @@ 是否被添加至 「我的小程序」 - - - 错误信息 - - - - - 支付支持信息对象 - - - - - 调用结果信息,格式为 "checkIsSupportMidasPayment:ok" - - - - - 是否支持支付,true 表示支持,false 表示不支持 - - - - - 错误码,0 表示成功 - - - - - 错误信息,"success" 表示成功 - - 最多可以选择的图片张数 @@ -6868,11 +6718,6 @@ 用短链打开小程序时当前页面携带的查询字符串。小程序中使用时,应在进入页面时调用 `wx.onCopyUrl` 自定义 `query`,退出页面时调用 `wx.offCopyUrl`,防止影响其它页面。 - - - 短链中的自定义标题,显示在小程序名称之后,可以不填 - - 当 手机坐标 X/Y 和 地球 X/Y 重合时,绕着 Z 轴转动的夹角为 alpha,范围值为 [0, 2*PI)。逆时针转动为正。 @@ -7635,7 +7480,7 @@ | 2002004 | 人脸识别失败 | | | 2002006 | 用户取消/超时/不同意,导致未完成人脸识别 | | | 2002007 | 本用户7天内人脸识别已通过,通过日期为XX | | - | 2002008 | 本日已调起过人脸识别或者本月调用次数已达上限 | | + | 2002008 | 本日已调起过人脸识别 | or本月调用次数已达上限 | | 2002009 | 无权限发起人脸识别 | | @@ -7648,31 +7493,10 @@ | 2002004 | 人脸识别失败 | | | 2002006 | 用户取消/超时/不同意,导致未完成人脸识别 | | | 2002007 | 本用户7天内人脸识别已通过,通过日期为XX | | - | 2002008 | 本日已调起过人脸识别或者本月调用次数已达上限 | | + | 2002008 | 本日已调起过人脸识别 | or本月调用次数已达上限 | | 2002009 | 无权限发起人脸识别 | | - - - 人脸核身会话唯一标识(小程序后台根据「用户实名信息(姓名+身份证)」调用微信后台[getVerifyId](https://developers.weixin.qq.com/miniprogram/dev/server/API/face/api_getverifyid.html)接口获取) - - - - - 错误信息 - | 错误码 | 错误信息 | 说明 | - | - | - | - | - | 0 | 人脸识别完成(需要通过[queryVerifyInfo](https://developers.weixin.qq.com/miniprogram/dev/server/API/face/api_queryverifyinfo.html)接口查询人脸核身真实验证结果) | | - - - - - 错误码 - | 错误码 | 错误信息 | 说明 | - | - | - | - | - | 0 | 人脸识别完成(需要通过[queryVerifyInfo](https://developers.weixin.qq.com/miniprogram/dev/server/API/face/api_queryverifyinfo.html)接口查询人脸核身真实验证结果) | | - - 购买数量。mode=game 时必填。购买数量。详见 [buyQuantity 限制说明](#buyQuantity限制说明)。 diff --git a/Runtime/Plugins/wx-runtime-editor.xml.meta b/Runtime/Plugins/wx-runtime-editor.xml.meta index 4006ea299..f9c25b658 100644 --- a/Runtime/Plugins/wx-runtime-editor.xml.meta +++ b/Runtime/Plugins/wx-runtime-editor.xml.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 59f30477a8bb77aeb6d56b69f0799388 +guid: 278cbcb16b55256aead61177fefb8b90 DefaultImporter: externalObjects: {} userData: diff --git a/Runtime/Plugins/wx-runtime.dll b/Runtime/Plugins/wx-runtime.dll index b5bebdce2..ef013e83f 100644 Binary files a/Runtime/Plugins/wx-runtime.dll and b/Runtime/Plugins/wx-runtime.dll differ diff --git a/Runtime/Plugins/wx-runtime.xml b/Runtime/Plugins/wx-runtime.xml index 65fae8683..d377ce4ce 100644 --- a/Runtime/Plugins/wx-runtime.xml +++ b/Runtime/Plugins/wx-runtime.xml @@ -3486,11 +3486,6 @@ 允许微信读写日历的开关 - - - PC 内核版本号,仅在 PC 端存在该值 - - 客户端基础库版本 @@ -3754,86 +3749,11 @@ 宽度,单位:px - - - 擂台赛组件领奖信息 - - 通知组件信息 - - - 福利组件信息 - - - - - 组件的名称 - - - - - 领取事件详情(只在onOfficialComponentsInfoChange回调中返回) - - - - - 奖励领取结果:1-全部成功, 2-部分成功(礼物达到领取上限), 3-领奖失败 - - - - - 是否收到了稀有奖励 - - - - - 用户领取的奖励列表 - - - - - 奖励类型:0-道具礼包, 1-微信蓝包, 2-h5商家券, 3-现金红包, 4-小程序券, 5-盲盒 - - - - - 奖励来源信息 - - - - - 获取的奖励数量 - - - - - 道具列表 - - - - - 奖励类型:1-普通奖励, 2-稀有奖励 - - - - - 礼包名称 - - - - - 道具名称 - - - - - 道具数量 - - 组件的布局位置信息 @@ -3849,46 +3769,6 @@ 组件的名称 - - - 可领取的好友礼包数量 - - - - - 可领取的礼包数量 - - - - - 组件的名称 - - - - - 领取事件详情(只在onOfficialComponentsInfoChange回调中返回) - - - - - 礼包描述,只有 gift 类型才有 - - - - - 礼包图标,只有 gift 类型才有 - - - - - 礼包名称,只有 gift 类型才有 - - - - - gift: 礼包, friendGift: 好友礼包 - - 当前占用的空间大小, 单位 KB @@ -4691,36 +4571,6 @@ 是否被添加至 「我的小程序」 - - - 错误信息 - - - - - 支付支持信息对象 - - - - - 调用结果信息,格式为 "checkIsSupportMidasPayment:ok" - - - - - 是否支持支付,true 表示支持,false 表示不支持 - - - - - 错误码,0 表示成功 - - - - - 错误信息,"success" 表示成功 - - 最多可以选择的图片张数 @@ -6868,11 +6718,6 @@ 用短链打开小程序时当前页面携带的查询字符串。小程序中使用时,应在进入页面时调用 `wx.onCopyUrl` 自定义 `query`,退出页面时调用 `wx.offCopyUrl`,防止影响其它页面。 - - - 短链中的自定义标题,显示在小程序名称之后,可以不填 - - 当 手机坐标 X/Y 和 地球 X/Y 重合时,绕着 Z 轴转动的夹角为 alpha,范围值为 [0, 2*PI)。逆时针转动为正。 @@ -7635,7 +7480,7 @@ | 2002004 | 人脸识别失败 | | | 2002006 | 用户取消/超时/不同意,导致未完成人脸识别 | | | 2002007 | 本用户7天内人脸识别已通过,通过日期为XX | | - | 2002008 | 本日已调起过人脸识别或者本月调用次数已达上限 | | + | 2002008 | 本日已调起过人脸识别 | or本月调用次数已达上限 | | 2002009 | 无权限发起人脸识别 | | @@ -7648,31 +7493,10 @@ | 2002004 | 人脸识别失败 | | | 2002006 | 用户取消/超时/不同意,导致未完成人脸识别 | | | 2002007 | 本用户7天内人脸识别已通过,通过日期为XX | | - | 2002008 | 本日已调起过人脸识别或者本月调用次数已达上限 | | + | 2002008 | 本日已调起过人脸识别 | or本月调用次数已达上限 | | 2002009 | 无权限发起人脸识别 | | - - - 人脸核身会话唯一标识(小程序后台根据「用户实名信息(姓名+身份证)」调用微信后台[getVerifyId](https://developers.weixin.qq.com/miniprogram/dev/server/API/face/api_getverifyid.html)接口获取) - - - - - 错误信息 - | 错误码 | 错误信息 | 说明 | - | - | - | - | - | 0 | 人脸识别完成(需要通过[queryVerifyInfo](https://developers.weixin.qq.com/miniprogram/dev/server/API/face/api_queryverifyinfo.html)接口查询人脸核身真实验证结果) | | - - - - - 错误码 - | 错误码 | 错误信息 | 说明 | - | - | - | - | - | 0 | 人脸识别完成(需要通过[queryVerifyInfo](https://developers.weixin.qq.com/miniprogram/dev/server/API/face/api_queryverifyinfo.html)接口查询人脸核身真实验证结果) | | - - 购买数量。mode=game 时必填。购买数量。详见 [buyQuantity 限制说明](#buyQuantity限制说明)。 diff --git a/Runtime/Plugins/wx-runtime.xml.meta b/Runtime/Plugins/wx-runtime.xml.meta index 47bcc2740..4148d8292 100644 --- a/Runtime/Plugins/wx-runtime.xml.meta +++ b/Runtime/Plugins/wx-runtime.xml.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 33778f932d74b9c0309d7573c86c9e5b +guid: 03b7951cb7213f781bd9a1a9f9574629 DefaultImporter: externalObjects: {} userData: diff --git a/Runtime/WX.cs b/Runtime/WX.cs index 6f6c03762..50a3b46a1 100644 --- a/Runtime/WX.cs +++ b/Runtime/WX.cs @@ -107,69 +107,6 @@ namespace WeChatWASM WXSDKManagerHandler.Instance.CheckIsAddedToMyMiniProgram(callback); } - /// - /// [wx.checkIsSupportFacialRecognition(Object object)](https://developers.weixin.qq.com/minigame/dev/api/open-api/face/wx.checkIsSupportFacialRecognition.html) - /// 需要基础库: `3.8.12` - /// 检查当前设备是否支持人脸识别能力 - /// **示例代码** - /// ```js - /// wx.checkIsSupportFacialRecognition({ - /// success() { - /// // 支持人脸识别 - /// }, - /// fail() { - /// // 不支持人脸识别 - /// }, - /// }) - /// ``` - /// - public static void CheckIsSupportFacialRecognition(CheckIsSupportFacialRecognitionOption callback) - { - WXSDKManagerHandler.Instance.CheckIsSupportFacialRecognition(callback); - } - - /// - /// [wx.checkIsSupportMidasPayment(Object object)](https://developers.weixin.qq.com/minigame/dev/api/midas-payment/wx.checkIsSupportMidasPayment.html) - /// 需要基础库: `3.10.3` - /// 检查当前环境是否支持虚拟支付。使用前请注意阅读[相关说明](https://developers.weixin.qq.com/minigame/dev/guide/open-ability/virtual-payment/virtual-payment2.html)。 - /// **平台支持说明** - /// - Android、Windows、OHOS 平台:默认支持虚拟支付,接口直接返回支持 - /// - iOS 平台:需满足以下环境要求才可能支持虚拟支付 - /// - 操作系统要求:使用 iPhone 或者 iPad,iOS 15 及以上版本 - /// - 基础库版本要求:3.10.3 及以上 - /// - 客户端版本要求:8.0.68 及以上 - /// - 苹果支付不支持使用沙箱环境,仅支持使用现网环境 - /// **注意事项** - /// 若该 API 都不存在,则 iOS 一定不支持虚拟支付,请保持旧版本逻辑。 - /// **示例代码** - /// ```js - /// if (wx.checkIsSupportMidasPayment) { - /// wx.checkIsSupportMidasPayment({ - /// success(res) { - /// console.log('支持检查结果:', res) - /// if (res.data.allow_pay) { - /// console.log('当前环境支持支付') - /// // 可以继续调用支付相关接口 - /// } else { - /// console.log('当前环境不支持支付') - /// // 请自行适配用户提示文案 - /// } - /// }, - /// fail(err) { - /// console.error('检查支持情况失败:', err) - /// }, - /// complete() { - /// console.log('检查完成') - /// } - /// }) - /// } - /// ``` - /// - public static void CheckIsSupportMidasPayment(CheckIsSupportMidasPaymentOption callback) - { - WXSDKManagerHandler.Instance.CheckIsSupportMidasPayment(callback); - } - /// /// [wx.checkSession(Object object)](https://developers.weixin.qq.com/minigame/dev/api/open-api/login/wx.checkSession.html) /// 检查登录态 session_key 是否过期。 @@ -1794,92 +1731,35 @@ namespace WeChatWASM /// /// [wx.requestFacialRecognition(Object object)](https://developers.weixin.qq.com/minigame/dev/api/open-api/account-info/wx.requestFacialRecognition.html) /// 需要基础库: `3.11.2` - /// 腾讯游戏人脸识别验证功能是基于健康系统防沉迷体系,用于识别疑似未成年人冒用成年人账号游玩游戏的行为,是防止未成年人沉迷网络游戏的一项重要措施。本接口是为开通虚拟支付功能的小游戏开发者提供的,此接口是基于人脸识别的未成年人身份核验接口。本次识别是根据用户在腾讯健康系统中留存的实名信息进行验证,结果将直接返回至开发者。 - /// **接口限额** - /// - 超出限额后将返回错误码 2002008(频率控制) - /// - 1天内全部游戏对一个用户只能调起1次人脸识别 - /// - 若用户人脸识别通过:7天内不能再被弹出人脸识别 - /// - 根据小游戏评级每个月限制使用次数,一旦发现恶意滥用接口,会取消使用资格。具体使用次数如下: - /// - S级:300次/月 - /// - A级:100次/月 - /// - B级:30次/月 + /// 发起人脸识别验证,用于对可疑用户进行身份验证和防沉迷检查。该接口会调起微信的人脸识别系统,验证用户身份以确保游戏安全和合规性。 /// **处理流程** - /// 人脸识别流程图 + /// 1. 开发者调用 `wx.requestFacialRecognition` 发起人脸识别。 + /// 2. 系统根据策略判定是否需要展示授权弹窗。 + /// - 若判定为"不展示弹窗":立即回调结果,示例:`{ errCode: 0, errMsg: '本用户7天内人脸识别已通过' }` + /// - 若判定为"需展示弹窗":进入步骤 3。 + /// 3. 系统展示授权弹窗。 + /// - 玩家拒绝:立即回调 `fail`,`errCode = 2002006` + /// - 玩家同意:进入步骤 4。 + /// 4. 系统开始进行人脸识别验证 + /// - 玩家在跳转页面中完成活体/人脸识别;关闭页面返回游戏。 + /// 5. 系统回调最终识别结果返回 /// **示例代码** /// ```js - /// // 实际业务场景:防沉迷身份验证 - /// function checkUserIdentity() { /// wx.requestFacialRecognition({ /// success(res) { - /// // 场景 1:本次人脸识别通过 - /// // res = { errCode: 0, errMsg: 'ok' } - /// console.log('人脸识别成功:', res) - /// // 允许继续游戏 - /// startGame() + /// // 人脸识别通过或 7 天内已通过 + /// // 形如:{ errCode: 0, errMsg: 'ok' } + /// console.log('requestFacialRecognition success:', res) /// }, /// fail(err) { - /// console.error('人脸识别失败:', err) - /// let tipMessage = '' - /// let shouldBlock = false // 是否需要阻断游戏 - /// // 根据错误码进行不同处理 - /// switch (err.errCode) { - /// case 2002004: - /// // 人脸识别失败(需要阻断) - /// // err = { errCode: 2002004, errMsg: '人脸识别失败' } - /// tipMessage = '识别失败,请稍后重试' - /// shouldBlock = true - /// break - /// case 2002006: - /// // 用户取消/超时/不同意,导致未完成人脸识别(需要阻断) - /// // err = { errCode: 2002006, errMsg: '用户取消' } - /// tipMessage = '您已取消验证,无法继续游戏' - /// shouldBlock = true - /// break - /// case 2002007: - /// // 本用户7天内人脸识别已通过(可以继续游戏) - /// // err = { errCode: 2002007, errMsg: '本用户7天内人脸识别已通过,通过日期为2024-01-15' } - /// tipMessage = '您已完成验证' - /// shouldBlock = false - /// break - /// case 2002008: - /// // 频率控制:本日已调起过人脸识别 or 本月调用次数已达上限(可以继续游戏) - /// // err = { errCode: 2002008, errMsg: '本日已调起过人脸识别' } - /// // 或 err = { errCode: 2002008, errMsg: '本月调用次数已达上限' } - /// tipMessage = '今日验证次数已达上限' - /// shouldBlock = false - /// break - /// case 2002009: - /// // 无权限发起人脸识别(可以继续游戏) - /// // err = { errCode: 2002009, errMsg: '无权限发起人脸识别' } - /// tipMessage = '暂无权限使用此功能' - /// shouldBlock = false - /// break - /// default: - /// // 系统异常等其他错误(可以继续游戏,避免影响正常用户) - /// tipMessage = '系统异常,请稍后重试' - /// shouldBlock = false - /// } - /// if (tipMessage) { - /// wx.showModal({ - /// title: '提示', - /// content: tipMessage, - /// showCancel: false - /// }) - /// } - /// if (shouldBlock) { - /// // 仅对识别失败(2002004)和用户取消(2002006)阻断游戏 - /// restrictGameFeatures() - /// } else { - /// // 其他情况允许继续游戏 - /// startGame() - /// } + /// // 失败或受限等场景 + /// console.log('requestFacialRecognition fail:', err) /// }, /// complete(res) { /// // 无论成功失败均会触发 - /// console.log('人脸识别流程结束:', res) + /// console.log('requestFacialRecognition complete:', res) /// } /// }) - /// } /// ``` /// public static void RequestFacialRecognition(RequestFacialRecognitionOption callback) @@ -1887,29 +1767,6 @@ namespace WeChatWASM WXSDKManagerHandler.Instance.RequestFacialRecognition(callback); } - /// - /// [wx.requestFacialVerify(Object object)](https://developers.weixin.qq.com/minigame/dev/api/open-api/face/wx.requestFacialVerify.html) - /// 需要基础库: `3.8.12` - /// 对用户实名信息进行基于生物识别的人脸核身验证 - /// **示例代码** - /// ```js - /// wx.requestFacialVerify({ - /// // 人脸核身会话唯一标识 - /// verifyId: 'xxx', - /// success() { - /// // 人脸核身验证成功,需要通知小程序后台根据本次人脸核身会话唯一标识 verifyId 字段调用微信后台 queryVerifyInfo 接口查询人脸核身真实验证结果。 - /// }, - /// fail() { - /// // 人脸核身验证失败 - /// }, - /// }) - /// ``` - /// - public static void RequestFacialVerify(RequestFacialVerifyOption callback) - { - WXSDKManagerHandler.Instance.RequestFacialVerify(callback); - } - /// /// [wx.requestMidasFriendPayment(Object object)](https://developers.weixin.qq.com/minigame/dev/api/midas-payment/wx.requestMidasFriendPayment.html) /// 需要基础库: `2.11.0` @@ -3248,7 +3105,6 @@ namespace WeChatWASM /// 监听搜索到新设备的事件 /// **注意** /// - 若在 [wx.onBluetoothDeviceFound](https://developers.weixin.qq.com/minigame/dev/api/device/bluetooth/wx.onBluetoothDeviceFound.html) 回调了某个设备,则此设备会添加到 [wx.getBluetoothDevices](https://developers.weixin.qq.com/minigame/dev/api/device/bluetooth/wx.getBluetoothDevices.html) 接口获取到的数组中。 - /// - 地址变化这个是鸿蒙系统特性,小程序可以不缓存地址,重新搜索连接。 /// **示例代码** /// [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) /// ```js diff --git a/Runtime/WXBase.cs b/Runtime/WXBase.cs index 7f7718edd..cce97020b 100644 --- a/Runtime/WXBase.cs +++ b/Runtime/WXBase.cs @@ -643,6 +643,62 @@ namespace WeChatWASM { return WXSDKManagerHandler.Instance.GetBundleSizeOnDisk(); } + + /// + /// 获取当前帧WXFS.read的执行次数 + /// + public static uint GetReadCount() + { + return WXSDKManagerHandler.Instance.GetReadCount(); + } + + /// + /// 获取当前帧WXFS.read的Cache Miss次数 + /// + public static uint GetCacheMissCount() + { + return WXSDKManagerHandler.Instance.GetCacheMissCount(); + } + + /// + /// 获取当前帧fd缓存的Cache Miss次数 + /// + public static uint GetFdCacheMissCount() + { + return WXSDKManagerHandler.Instance.GetFdCacheMissCount(); + } + + /// + /// 获取当前帧openSync的调用次数 + /// + public static uint GetOpenSyncCount() + { + return WXSDKManagerHandler.Instance.GetOpenSyncCount(); + } + + /// + /// 获取当前帧statSync的调用次数 + /// + public static uint GetStatSyncCount() + { + return WXSDKManagerHandler.Instance.GetStatSyncCount(); + } + + /// + /// 获取当前帧readSync的调用次数 + /// + public static uint GetReadSyncCount() + { + return WXSDKManagerHandler.Instance.GetReadSyncCount(); + } + + /// + /// 重置WXFS性能计数器 + /// + public static void ResetPerfCounters() + { + WXSDKManagerHandler.Instance.ResetPerfCounters(); + } #endregion /// diff --git a/Runtime/WXProfileStatsScript.cs b/Runtime/WXProfileStatsScript.cs index a2fda5f22..134275d1b 100644 --- a/Runtime/WXProfileStatsScript.cs +++ b/Runtime/WXProfileStatsScript.cs @@ -231,6 +231,13 @@ public class WXProfileStatsScript : MonoBehaviour, WeChatWASM.WXSDKManagerHandle UpdateValue("NumberOnDisk", WeChatWASM.WXSDKManagerHandler.Instance.GetBundleNumberOnDisk(), sb); UpdateValue("SizeInMemory", WeChatWASM.WXSDKManagerHandler.Instance.GetBundleSizeInMemory() / toMB, sb); UpdateValue("SizeOnDisk", WeChatWASM.WXSDKManagerHandler.Instance.GetBundleSizeOnDisk() / toMB, sb); + UpdateValue("ReadCount", WeChatWASM.WXSDKManagerHandler.Instance.GetReadCount(), sb); + UpdateValue("CacheMissCount", WeChatWASM.WXSDKManagerHandler.Instance.GetCacheMissCount(), sb); + UpdateValue("FdCacheMissCount", WeChatWASM.WXSDKManagerHandler.Instance.GetFdCacheMissCount(), sb); + UpdateValue("OpenSyncCount", WeChatWASM.WXSDKManagerHandler.Instance.GetOpenSyncCount(), sb); + UpdateValue("StatSyncCount", WeChatWASM.WXSDKManagerHandler.Instance.GetStatSyncCount(), sb); + UpdateValue("ReadSyncCount", WeChatWASM.WXSDKManagerHandler.Instance.GetReadSyncCount(), sb); + WeChatWASM.WXSDKManagerHandler.Instance.ResetPerfCounters(); #if UNITY_2021_2_OR_NEWER // sb.AppendLine("-------------MemoryRecorder-----"); @@ -278,29 +285,37 @@ public class WXProfileStatsScript : MonoBehaviour, WeChatWASM.WXSDKManagerHandle if(!WeChatWASM.WXSDKManagerHandler.Instance.IsCloudTest()) { GUI.backgroundColor = new Color(0, 0, 0, 0.5f); #if UNITY_EDITOR - GUI.skin.button.fontSize = 10; - GUI.skin.label.fontSize = 10; + int fontSize = 10; + int btnWidth = 150; + int btnHeight = 20; + int padding = 5; #else - GUI.skin.button.fontSize = 30; - GUI.skin.label.fontSize = 30; + int fontSize = 30; + int btnWidth = 400; + int btnHeight = 50; + int padding = 10; #endif - if (GUILayout.Button("Performance Stats", GUILayout.ExpandWidth(false))) + GUI.skin.button.fontSize = fontSize; + GUI.skin.label.fontSize = fontSize; + + float curY = padding; + if (GUI.Button(new Rect(padding, curY, btnWidth, btnHeight), "Performance Stats")) { m_isShow = !m_isShow; } + curY += btnHeight + padding; - if (GUILayout.Button("ProfilingMemory Dump", GUILayout.ExpandWidth(false))) + if (GUI.Button(new Rect(padding, curY, btnWidth, btnHeight), "ProfilingMemory Dump")) { WeChatWASM.WXSDKManagerHandler.Instance.ProfilingMemoryDump(); } + curY += btnHeight + padding; - GUILayout.BeginVertical(m_bgStyle); if (m_isShow) { - GUILayout.Label(statsText); + GUI.Box(new Rect(padding, curY, Screen.width - padding * 2, Screen.height - curY - padding), "", m_bgStyle); + GUI.Label(new Rect(padding * 2, curY + padding, Screen.width - padding * 4, Screen.height - curY - padding * 2), statsText); } - - GUILayout.EndVertical(); } } diff --git a/Runtime/WXTouchInputModule.cs b/Runtime/WXTouchInputModule.cs new file mode 100644 index 000000000..a685c29bc --- /dev/null +++ b/Runtime/WXTouchInputModule.cs @@ -0,0 +1,186 @@ +#if UNITY_WEBGL || WEIXINMINIGAME || UNITY_EDITOR +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +/** + * WxTouch输入模块,结合 WXTouchInputOverride 使用 + * 用于拦截所有Button事件调用,确保事件只被触发一次,避免重复触发问题 + * 除会拦截带 Button 组件的 ExecuteEvents.pointerClickHandler 事件外,逻辑与 StandaloneInputModule 均一致 + * 需要在场景中添加 WXTouchInputOverride 组件使用,且保证不要有其他的 StandaloneInputModule + */ +public class WXTouchInputModule : StandaloneInputModule +{ + private const float doubleClickTime = 0.3f; + + public override void Process() + { + if (!eventSystem.isFocused && ShouldIgnoreEventsOnNoFocus()) + return; + bool usedEvent = SendUpdateEventToSelectedObject(); + if (!ProcessTouchEvents() && input.mousePresent) + ProcessMouseEvent(); + if (eventSystem.sendNavigationEvents) + { + if (!usedEvent) + usedEvent |= SendMoveEventToSelectedObject(); + + if (!usedEvent) + SendSubmitEventToSelectedObject(); + } + } + + private bool ShouldIgnoreEventsOnNoFocus() + { +#if UNITY_EDITOR + return !UnityEditor.EditorApplication.isRemoteConnected; +#else + return true; +#endif + } + + private bool ProcessTouchEvents() + { + for (int i = 0; i < input.touchCount; ++i) + { + Touch touch = input.GetTouch(i); + if (touch.type == TouchType.Indirect) + continue; + + bool released; + bool pressed; + var pointer = GetTouchPointerEventData(touch, out pressed, out released); + + ProcessTouchPress(pointer, pressed, released); + + if (!released) + { + ProcessMove(pointer); + ProcessDrag(pointer); + } + else + RemovePointerData(pointer); + } + return input.touchCount > 0; + } + + // released 后会拦截 Button 的 ExecuteEvents.pointerClickHandler ,其余逻辑与 StandaloneInputModule 保持一致 + protected new void ProcessTouchPress(PointerEventData pointerEvent, bool pressed, bool released) + { + var currentOverGo = pointerEvent.pointerCurrentRaycast.gameObject; + + // PointerDown notification + if (pressed) + { + pointerEvent.eligibleForClick = true; + pointerEvent.delta = Vector2.zero; + pointerEvent.dragging = false; + pointerEvent.useDragThreshold = true; + pointerEvent.pressPosition = pointerEvent.position; + pointerEvent.pointerPressRaycast = pointerEvent.pointerCurrentRaycast; + + DeselectIfSelectionChanged(currentOverGo, pointerEvent); + + if (pointerEvent.pointerEnter != currentOverGo) + { + // send a pointer enter to the touched element if it isn't the one to select... + HandlePointerExitAndEnter(pointerEvent, currentOverGo); + pointerEvent.pointerEnter = currentOverGo; + } + + var resetDiffTime = Time.unscaledTime - pointerEvent.clickTime; + if (resetDiffTime >= doubleClickTime) + { + pointerEvent.clickCount = 0; + } + + // search for the control that will receive the press + // if we can't find a press handler set the press + // handler to be what would receive a click. + var newPressed = ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.pointerDownHandler); + + var newClick = ExecuteEvents.GetEventHandler(currentOverGo); + + // didnt find a press handler... search for a click handler + if (newPressed == null) + newPressed = newClick; + + // Debug.Log("Pressed: " + newPressed); + + float time = Time.unscaledTime; + + if (newPressed == pointerEvent.lastPress) + { + var diffTime = time - pointerEvent.clickTime; + if (diffTime < doubleClickTime) + ++pointerEvent.clickCount; + else + pointerEvent.clickCount = 1; + + pointerEvent.clickTime = time; + } + else + { + pointerEvent.clickCount = 1; + } + + pointerEvent.pointerPress = newPressed; + pointerEvent.rawPointerPress = currentOverGo; + pointerEvent.pointerClick = newClick; + + pointerEvent.clickTime = time; + + // Save the drag handler as well + pointerEvent.pointerDrag = ExecuteEvents.GetEventHandler(currentOverGo); + + if (pointerEvent.pointerDrag != null) + ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.initializePotentialDrag); + } + + // PointerUp notification + if (released) + { + // Debug.Log("Executing pressup on: " + pointer.pointerPress); + ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerUpHandler); + // Debug.Log("KeyCode: " + pointer.eventData.keyCode); + + // see if we mouse up on the same element that we clicked on... + var pointerClickHandler = ExecuteEvents.GetEventHandler(currentOverGo); + + // PointerClick and Drop events + if (pointerEvent.pointerClick == pointerClickHandler && pointerEvent.eligibleForClick) + { + bool shouldHandleInWx = currentOverGo != null && currentOverGo.GetComponentInParent() != null; + if (!shouldHandleInWx) + { + ExecuteEvents.Execute(pointerEvent.pointerClick, pointerEvent, ExecuteEvents.pointerClickHandler); + } + } + + if (pointerEvent.pointerDrag != null && pointerEvent.dragging) + { + ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.dropHandler); + } + + pointerEvent.eligibleForClick = false; + pointerEvent.pointerPress = null; + pointerEvent.rawPointerPress = null; + pointerEvent.pointerClick = null; + + if (pointerEvent.pointerDrag != null && pointerEvent.dragging) + ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.endDragHandler); + + pointerEvent.dragging = false; + pointerEvent.pointerDrag = null; + + // send exit events as we need to simulate this on touch up on touch device + ExecuteEvents.ExecuteHierarchy(pointerEvent.pointerEnter, pointerEvent, ExecuteEvents.pointerExitHandler); + pointerEvent.pointerEnter = null; + } + + //m_InputPointerEvent = pointerEvent; + } +} +#endif \ No newline at end of file diff --git a/Runtime/WXTouchInputModule.cs.meta b/Runtime/WXTouchInputModule.cs.meta new file mode 100644 index 000000000..ffc1c36c7 --- /dev/null +++ b/Runtime/WXTouchInputModule.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6226ce8c6cf3dd24d95cfa430c9755d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/WXTouchInputOverride.cs b/Runtime/WXTouchInputOverride.cs index 82a963b51..831f7a540 100644 --- a/Runtime/WXTouchInputOverride.cs +++ b/Runtime/WXTouchInputOverride.cs @@ -21,17 +21,17 @@ internal class TouchData * 所以需要使用WX的触控接口重新覆盖Unity的BaseInput关于触控方面的接口 * 通过设置StandaloneInputModule.inputOverride的方式来实现 */ -[RequireComponent(typeof(StandaloneInputModule))] +[RequireComponent(typeof(WXTouchInputModule))] public class WXTouchInputOverride : BaseInput { private bool _isInitWechatSDK; private readonly List _touches = new List(); - private StandaloneInputModule _standaloneInputModule = null; + private WXTouchInputModule _standaloneInputModule = null; protected override void Awake() { base.Awake(); - _standaloneInputModule = GetComponent(); + _standaloneInputModule = GetComponent(); } protected override void OnEnable() @@ -138,11 +138,16 @@ public class WXTouchInputOverride : BaseInput Button button = selectedObject.GetComponent