From 2de54a2557c0ee58827ef2470f1c94ad535d87e2 Mon Sep 17 00:00:00 2001 From: nebulaliu Date: Fri, 26 Sep 2025 10:46:11 +0800 Subject: [PATCH] Auto-publish pre-release WXSDK. --- Editor/BuildProfile/WeixinMiniGameSettings.cs | 136 ++++ .../WeixinMiniGameSettings.cs.meta | 7 + .../WeixinMiniGameSettingsEditor.cs | 595 ++++++++++++++++++ .../WeixinMiniGameSettingsEditor.cs.meta | 7 + .../WeixinSubplatformInterface.cs | 151 +++++ .../WeixinSubplatformInterface.cs.meta | 7 + Editor/WXPluginVersion.cs | 2 +- Editor/wx-editor.dll | Bin 246272 -> 246272 bytes Editor/wx-editor.xml.meta | 2 +- Runtime/Plugins/wx-perf.dll | Bin 55808 -> 55808 bytes Runtime/Plugins/wx-runtime-editor.dll | Bin 253440 -> 253440 bytes Runtime/Plugins/wx-runtime-editor.xml.meta | 2 +- Runtime/Plugins/wx-runtime.dll | Bin 231424 -> 231424 bytes Runtime/Plugins/wx-runtime.xml.meta | 2 +- .../playable-default/check-version.js.meta | 2 +- Runtime/playable-default/data-package.meta | 2 +- .../data-package/game.js.meta | 2 +- Runtime/playable-default/events.js.meta | 2 +- Runtime/playable-default/game.js.meta | 2 +- Runtime/playable-default/game.json.meta | 2 +- Runtime/playable-default/playable-fix.js.meta | 2 +- .../playable-default/plugin-config.js.meta | 2 +- Runtime/playable-default/plugins.meta | 2 +- .../plugins/check-update.js.meta | 2 +- .../plugins/screen-adapter.js.meta | 2 +- .../playable-default/project.config.json.meta | 2 +- .../playable-default/texture-config.js.meta | 2 +- .../playable-default/unity-namespace.js.meta | 2 +- .../unity-playable-plugin.meta | 2 +- .../unity-playable-plugin/index.js.meta | 2 +- Runtime/playable-default/unity-sdk.meta | 2 +- Runtime/playable-default/unity-sdk/audio.meta | 2 +- .../unity-sdk/audio/common.js.meta | 2 +- .../unity-sdk/audio/const.js.meta | 2 +- .../unity-sdk/audio/index.js.meta | 2 +- .../unity-sdk/audio/inner-audio.js.meta | 2 +- .../unity-sdk/audio/store.js.meta | 2 +- .../unity-sdk/audio/unity-audio.js.meta | 2 +- .../unity-sdk/audio/utils.js.meta | 2 +- .../unity-sdk/canvas-context.js.meta | 2 +- .../playable-default/unity-sdk/canvas.js.meta | 2 +- .../playable-default/unity-sdk/conf.js.meta | 2 +- .../unity-sdk/file-info.js.meta | 2 +- .../playable-default/unity-sdk/fix.js.meta | 2 +- Runtime/playable-default/unity-sdk/fs.js.meta | 2 +- .../playable-default/unity-sdk/index.js.meta | 2 +- .../playable-default/unity-sdk/logger.js.meta | 2 +- .../unity-sdk/mobileKeyboard.meta | 2 +- .../unity-sdk/mobileKeyboard/index.js.meta | 2 +- .../unity-sdk/module-helper.js.meta | 2 +- .../unity-sdk/recorder.js.meta | 2 +- .../unity-sdk/resType.js.meta | 2 +- .../unity-sdk/resTypeOther.js.meta | 2 +- .../unity-sdk/response.js.meta | 2 +- .../playable-default/unity-sdk/sdk.js.meta | 2 +- .../unity-sdk/special-callbacks.js.meta | 2 +- .../unity-sdk/texture.js.meta | 2 +- Runtime/playable-default/unity-sdk/touch.meta | 2 +- .../unity-sdk/touch/index.js.meta | 2 +- .../playable-default/unity-sdk/util.js.meta | 2 +- .../playable-default/unity-sdk/utils.js.meta | 2 +- .../playable-default/unity-sdk/video.js.meta | 2 +- Runtime/playable-default/unity-sdk/video.meta | 2 +- .../unity-sdk/video/index.js.meta | 2 +- Runtime/playable-default/wasmcode.meta | 2 +- .../playable-default/wasmcode/game.js.meta | 2 +- .../playable-default/weapp-adapter.js.meta | 2 +- Runtime/wechat-default/check-version.js.meta | 2 +- Runtime/wechat-default/data-package.meta | 2 +- .../wechat-default/data-package/game.js.meta | 2 +- Runtime/wechat-default/events.js.meta | 2 +- Runtime/wechat-default/game.js.meta | 2 +- Runtime/wechat-default/game.json.meta | 2 +- Runtime/wechat-default/images.meta | 2 +- .../wechat-default/images/background.jpg.meta | 2 +- .../wechat-default/images/unity_logo.png.meta | 2 +- Runtime/wechat-default/open-data.meta | 2 +- Runtime/wechat-default/open-data/data.meta | 2 +- .../open-data/data/index.js.meta | 2 +- .../open-data/data/utils.js.meta | 2 +- .../wechat-default/open-data/index.js.meta | 2 +- .../wechat-default/open-data/loading.js.meta | 2 +- Runtime/wechat-default/open-data/render.meta | 2 +- .../open-data/render/image.meta | 2 +- .../open-data/render/image/avatar.png.meta | 2 +- .../open-data/render/image/button1.png.meta | 2 +- .../open-data/render/image/button2.png.meta | 2 +- .../open-data/render/image/button3.png.meta | 2 +- .../open-data/render/image/loading.png.meta | 2 +- .../open-data/render/image/nameBg.png.meta | 2 +- .../render/image/rankAvatar.png.meta | 2 +- .../open-data/render/image/rankBg.png.meta | 2 +- .../open-data/render/image/shareBg.png.meta | 2 +- .../open-data/render/image/shareBg2.png.meta | 2 +- .../open-data/render/styles.meta | 2 +- .../render/styles/friendRank.js.meta | 2 +- .../open-data/render/styles/tips.js.meta | 2 +- .../wechat-default/open-data/render/tpls.meta | 2 +- .../open-data/render/tpls/friendRank.js.meta | 2 +- .../open-data/render/tpls/tips.js.meta | 2 +- Runtime/wechat-default/plugin-config.js.meta | 2 +- Runtime/wechat-default/plugins.meta | 2 +- .../plugins/check-update.js.meta | 2 +- .../plugins/screen-adapter.js.meta | 2 +- .../wechat-default/project.config.json.meta | 2 +- Runtime/wechat-default/texture-config.js.meta | 2 +- .../wechat-default/unity-namespace.js.meta | 2 +- Runtime/wechat-default/unity-sdk.meta | 2 +- .../wechat-default/unity-sdk/TCPSocket.meta | 2 +- .../unity-sdk/TCPSocket/index.js.meta | 2 +- .../wechat-default/unity-sdk/UDPSocket.meta | 2 +- .../unity-sdk/UDPSocket/index.js.meta | 2 +- Runtime/wechat-default/unity-sdk/ad.js.meta | 2 +- Runtime/wechat-default/unity-sdk/audio.meta | 2 +- .../unity-sdk/audio/common.js.meta | 2 +- .../unity-sdk/audio/const.js.meta | 2 +- .../unity-sdk/audio/index.js.meta | 2 +- .../unity-sdk/audio/inner-audio.js.meta | 2 +- .../unity-sdk/audio/store.js.meta | 2 +- .../unity-sdk/audio/unity-audio.js.meta | 2 +- .../unity-sdk/audio/utils.js.meta | 2 +- .../unity-sdk/authorize.js.meta | 2 +- .../wechat-default/unity-sdk/bluetooth.meta | 2 +- .../unity-sdk/bluetooth/index.js.meta | 2 +- .../wechat-default/unity-sdk/camera.js.meta | 2 +- .../unity-sdk/canvas-context.js.meta | 2 +- .../wechat-default/unity-sdk/canvas.js.meta | 2 +- Runtime/wechat-default/unity-sdk/chat.js.meta | 2 +- .../wechat-default/unity-sdk/cloud.js.meta | 2 +- Runtime/wechat-default/unity-sdk/conf.js.meta | 2 +- .../unity-sdk/file-info.js.meta | 2 +- Runtime/wechat-default/unity-sdk/fix.js.meta | 2 +- Runtime/wechat-default/unity-sdk/font.meta | 2 +- .../unity-sdk/font/fix-cmap.js.meta | 2 +- .../unity-sdk/font/index.js.meta | 2 +- .../unity-sdk/font/read-metrics.js.meta | 2 +- .../unity-sdk/font/split-sc.js.meta | 2 +- .../unity-sdk/font/util.js.meta | 2 +- Runtime/wechat-default/unity-sdk/fs.js.meta | 2 +- .../unity-sdk/game-club.js.meta | 2 +- .../unity-sdk/game-recorder.js.meta | 2 +- .../wechat-default/unity-sdk/gyroscope.meta | 2 +- .../unity-sdk/gyroscope/index.js.meta | 2 +- .../wechat-default/unity-sdk/index.js.meta | 2 +- .../wechat-default/unity-sdk/logger.js.meta | 2 +- .../unity-sdk/mobileKeyboard.meta | 2 +- .../unity-sdk/mobileKeyboard/index.js.meta | 2 +- .../unity-sdk/module-helper.js.meta | 2 +- .../unity-sdk/open-data.js.meta | 2 +- .../wechat-default/unity-sdk/recorder.js.meta | 2 +- .../wechat-default/unity-sdk/resType.js.meta | 2 +- .../unity-sdk/resTypeOther.js.meta | 2 +- .../wechat-default/unity-sdk/response.js.meta | 2 +- Runtime/wechat-default/unity-sdk/sdk.js.meta | 2 +- .../wechat-default/unity-sdk/share.js.meta | 2 +- .../wechat-default/unity-sdk/storage.js.meta | 2 +- .../wechat-default/unity-sdk/texture.js.meta | 2 +- Runtime/wechat-default/unity-sdk/touch.meta | 2 +- .../unity-sdk/touch/index.js.meta | 2 +- .../unity-sdk/upload-file.js.meta | 2 +- .../wechat-default/unity-sdk/userinfo.js.meta | 2 +- Runtime/wechat-default/unity-sdk/util.js.meta | 2 +- .../wechat-default/unity-sdk/utils.js.meta | 2 +- .../wechat-default/unity-sdk/video.js.meta | 2 +- Runtime/wechat-default/unity-sdk/video.meta | 2 +- .../unity-sdk/video/index.js.meta | 2 +- Runtime/wechat-default/wasmcode.meta | 2 +- Runtime/wechat-default/wasmcode/game.js.meta | 2 +- Runtime/wechat-default/weapp-adapter.js.meta | 2 +- Runtime/wechat-default/workers.meta | 2 +- Runtime/wechat-default/workers/response.meta | 2 +- .../workers/response/index.js.meta | 2 +- 172 files changed, 1065 insertions(+), 162 deletions(-) create mode 100644 Editor/BuildProfile/WeixinMiniGameSettings.cs create mode 100644 Editor/BuildProfile/WeixinMiniGameSettings.cs.meta create mode 100644 Editor/BuildProfile/WeixinMiniGameSettingsEditor.cs create mode 100644 Editor/BuildProfile/WeixinMiniGameSettingsEditor.cs.meta create mode 100644 Editor/BuildProfile/WeixinSubplatformInterface.cs create mode 100644 Editor/BuildProfile/WeixinSubplatformInterface.cs.meta diff --git a/Editor/BuildProfile/WeixinMiniGameSettings.cs b/Editor/BuildProfile/WeixinMiniGameSettings.cs new file mode 100644 index 000000000..2974ceb34 --- /dev/null +++ b/Editor/BuildProfile/WeixinMiniGameSettings.cs @@ -0,0 +1,136 @@ +#if TUANJIE_1_4_OR_NEWER +using System; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using UnityEditor; +using UnityEngine; +using UnityEditor.Build.Profile; + +namespace WeChatWASM +{ + public class WeixinMiniGameSettings : MiniGameSettings + { + public WXProjectConf ProjectConf; + public SDKOptions SDKOptions; + public CompileOptions CompileOptions; + public CompressTexture CompressTexture; + public List PlayerPrefsKeys = new List(); + public FontOptions FontOptions; + + [SerializeField] public bool m_AutomaticFillInstantGame = true; + + public WeixinMiniGameSettings(MiniGameSettingsEditor editor) : base(editor) + { + } + + public bool PreprocessBuild(BuildProfile buildProfile, BuildOptions options) + { + bool result = true; + if (!string.IsNullOrEmpty(buildProfile.buildPath)) + { + this.ProjectConf.DST = buildProfile.buildPath; + } + else + { + Debug.LogError("Build Path is empty!"); + result = false; + } + this.CompileOptions.DevelopBuild = buildProfile.platformSettings.development; + this.CompileOptions.AutoProfile = buildProfile.platformSettings.connectProfiler; + + this.CompileOptions.CleanBuild = ((int)options & (int)BuildOptions.CleanBuildCache) != 0; + this.CompileOptions.ScriptOnly = ((int)options & (int)BuildOptions.BuildScriptsOnly) != 0; + + return result; + } + + internal void FillAutoStreamingAutomatically() + { + // Instant Game + if (WXConvertCore.IsInstantGameAutoStreaming()) + { + if (m_AutomaticFillInstantGame) + { + ProjectConf.CDN = WXConvertCore.GetInstantGameAutoStreamingCDN(); + if (!ProjectConf.bundlePathIdentifier.Contains("CUS/CustomAB;")) + { + ProjectConf.bundlePathIdentifier = "CUS/CustomAB;" + ProjectConf.bundlePathIdentifier; + } + if (!ProjectConf.bundlePathIdentifier.Contains("AS;")) + { + ProjectConf.bundlePathIdentifier = "AS;" + ProjectConf.bundlePathIdentifier; + } + ProjectConf.dataFileSubPrefix = "CUS"; + } + } + } + + public static void AutoStreamingLoad() + { + if (!WXConvertCore.IsInstantGameAutoStreaming()) + { + return; + } + + // Generate + Type asTextureUIType = Type.GetType("Unity.AutoStreaming.ASTextureUI,Unity.InstantGame.Editor"); + if (asTextureUIType == null) + { + Debug.LogError("Type 'Unity.AutoStreaming.ASTextureUI' not found. "); + return; + } + MethodInfo generateTextureAssetBundlesMethod = asTextureUIType.GetMethod("GenerateTextureAssetBundles", BindingFlags.NonPublic | BindingFlags.Static); + generateTextureAssetBundlesMethod?.Invoke(null, new object[] { false }); + + // reflection to get WXConvertCore.FirstBundlePath + String FirstBundlePath = ""; + var type = Type.GetType("WeChatWASM.WXConvertCore,WxEditor"); + if (type == null) + { + Debug.LogError("Type 'WeChatWASM.WXConvertCore,WxEditor' not found. "); + return; + } + FieldInfo fieldInfo = type.GetField("FirstBundlePath", BindingFlags.Public | BindingFlags.Static); + if (fieldInfo != null) + { + FirstBundlePath = fieldInfo.GetValue(null) as String; + } + + if (!string.IsNullOrEmpty(FirstBundlePath) && File.Exists(FirstBundlePath)) + { + Type igBuildPipelineType = Type.GetType("Unity.InstantGame.IGBuildPipeline,Unity.InstantGame.Editor"); + if (igBuildPipelineType == null) + { + Debug.LogError("Type 'Unity.InstantGame.IGBuildPipeline' not found. "); + return; + } + MethodInfo uploadMethod = igBuildPipelineType.GetMethod("UploadWeChatDataFile", BindingFlags.Public | BindingFlags.Static); + + bool returnValue = false; + if (uploadMethod != null) + { + object[] parameters = new object[] { FirstBundlePath }; + object result = uploadMethod.Invoke(null, parameters); + returnValue = Convert.ToBoolean(result); + } + + if (returnValue) + { + Debug.Log("转换完成并成功上传首包资源"); + } + else + { + Debug.LogError("首包资源上传失败,请检查网络以及Auto Streaming配置是否正确。"); + } + } + else + { + Debug.LogError("转换失败"); + } + } + + } +} +#endif diff --git a/Editor/BuildProfile/WeixinMiniGameSettings.cs.meta b/Editor/BuildProfile/WeixinMiniGameSettings.cs.meta new file mode 100644 index 000000000..67b3b8be2 --- /dev/null +++ b/Editor/BuildProfile/WeixinMiniGameSettings.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 59bd84d896d465c534a7667c78da00c9 +DefaultImporter: +externalObjects: {} +userData: +assetBundleName: +assetBundleVariant: \ No newline at end of file diff --git a/Editor/BuildProfile/WeixinMiniGameSettingsEditor.cs b/Editor/BuildProfile/WeixinMiniGameSettingsEditor.cs new file mode 100644 index 000000000..4ec215ba7 --- /dev/null +++ b/Editor/BuildProfile/WeixinMiniGameSettingsEditor.cs @@ -0,0 +1,595 @@ +#if TUANJIE_1_4_OR_NEWER +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using UnityEditor; +using UnityEditor.Build.Profile; +using UnityEngine; +using static WeChatWASM.WXConvertCore; + +namespace WeChatWASM +{ + public class WeixinMiniGameSettingsEditor : MiniGameSettingsEditor + { + private Vector2 scrollRoot; + private bool foldBaseInfo = true; + private bool foldLoadingConfig = true; + private bool foldSDKOptions = true; + private bool foldDebugOptions = true; + + private bool foldInstantGame = false; + + private bool foldFontOptions = false; + private Dictionary formInputData = new Dictionary(); + private Dictionary formIntPopupData = new Dictionary(); + private Dictionary formCheckboxData = new Dictionary(); + public Texture tex; + + public override void OnMiniGameSettingsIMGUI(SerializedObject serializedObject, SerializedProperty miniGameProperty) + { + OnSettingsGUI(serializedObject, miniGameProperty); + } + + public void OnSettingsGUI(SerializedObject serializedObject, SerializedProperty miniGameProperty) + { + loadData(serializedObject, miniGameProperty); + + scrollRoot = EditorGUILayout.BeginScrollView(scrollRoot); + + 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)); + + formInput("appid", "娓告垙AppID"); + formInput("cdn", "娓告垙璧勬簮CDN"); + formInput("projectName", "灏忔父鎴忛」鐩悕"); + formIntPopup("orientation", "娓告垙鏂瑰悜", new[] { "Portrait", "Landscape", "LandscapeLeft", "LandscapeRight" }, new[] { 0, 1, 2, 3 }); + formInput("memorySize", "UnityHeap棰勭暀鍐呭瓨(?)", "鍗曚綅MB锛岄鍒嗛厤鍐呭瓨鍊硷紝瓒呬紤闂叉父鎴256/涓交搴496/閲嶅害娓告垙768锛岄渶棰勪及娓告垙鏈澶nityHeap鍊间互闃叉鍐呭瓨鑷姩鎵╁甯︽潵鐨勫嘲鍊煎皷鍒恒傞浼版柟娉曡鏌ョ湅GIT鏂囨。銆婁紭鍖朥nity WebGL鐨勫唴瀛樸"); + + EditorGUILayout.EndVertical(); + } + + foldLoadingConfig = EditorGUILayout.Foldout(foldLoadingConfig, "鍚姩Loading閰嶇疆"); + if (foldLoadingConfig) + { + EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); + + 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(); + + formInput("videoUrl", "鍔犺浇闃舵瑙嗛URL"); + formIntPopup("assetLoadType", "棣栧寘璧勬簮鍔犺浇鏂瑰紡", new[] { "CDN", "灏忔父鎴忓寘鍐" }, new[] { 0, 1 }); + formCheckbox("compressDataPackage", "鍘嬬缉棣栧寘璧勬簮(?)", "灏嗛鍖呰祫婧怋rotli鍘嬬缉, 闄嶄綆璧勬簮澶у皬. 娉ㄦ剰: 棣栨鍚姩鑰楁椂鍙兘浼氬鍔200ms, 浠呮帹鑽愪娇鐢ㄥ皬娓告垙鍒嗗寘鍔犺浇鏃惰妭鐪佸寘浣撳ぇ灏忎娇鐢"); + formInput("bundleExcludeExtensions", "涓嶈嚜鍔ㄧ紦瀛樻枃浠剁被鍨(?)", "(浣跨敤;鍒嗗壊)褰撹姹倁rl鍖呭惈璧勬簮'cdn+StreamingAssets'鏃朵細鑷姩缂撳瓨锛屼絾StreamingAssets鐩綍涓嬩笉鏄墍鏈夋枃浠堕兘闇缂撳瓨锛屾閫夐」閰嶇疆涓嶉渶瑕佽嚜鍔ㄧ紦瀛樼殑鏂囦欢鎷撳睍鍚嶃傞粯璁ゅ糺son"); + formInput("bundleHashLength", "Bundle鍚嶇ОHash闀垮害(?)", "鑷畾涔塀undle鏂囦欢鍚嶄腑hash閮ㄥ垎闀垮害锛岄粯璁ゅ32锛岀敤浜庣紦瀛樻帶鍒躲"); + formInput("preloadFiles", "棰勪笅杞芥枃浠跺垪琛(?)", "浣跨敤;闂撮殧锛屾敮鎸佹ā绯婂尮閰"); + + EditorGUILayout.EndVertical(); + } + + foldSDKOptions = EditorGUILayout.Foldout(foldSDKOptions, "SDK鍔熻兘閫夐」"); + if (foldSDKOptions) + { + EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); + + formCheckbox("useFriendRelation", "浣跨敤濂藉弸鍏崇郴閾"); + formCheckbox("useMiniGameChat", "浣跨敤绀句氦缁勪欢"); + formCheckbox("preloadWXFont", "棰勫姞杞藉井淇″瓧浣(?)", "鍦╣ame.js鎵ц寮濮嬫椂棰勮浇寰俊绯荤粺瀛椾綋锛岃繍琛屾湡闂村彲浣跨敤WX.GetWXFont鑾峰彇寰俊瀛椾綋"); + formCheckbox("disableMultiTouch", "绂佹澶氱偣瑙︽帶"); + + EditorGUILayout.EndVertical(); + } + + foldDebugOptions = EditorGUILayout.Foldout(foldDebugOptions, "璋冭瘯缂栬瘧閫夐」"); + if (foldDebugOptions) + { + EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); + // formCheckbox("developBuild", "Development Build"); + formCheckbox("autoProfile", "Auto connect Profiler"); + formCheckbox("scriptOnly", "Scripts Only Build"); +#if TUANJIE_2022_3_OR_NEWER + // TODO: if overwrite by OverwritePlayerSettings + bool UseIL2CPP = PlayerSettings.GetScriptingBackend(BuildTargetGroup.WeixinMiniGame) == ScriptingImplementation.IL2CPP; +#else + bool UseIL2CPP = true; +#endif + formCheckbox("il2CppOptimizeSize", "Il2Cpp Optimize Size(?)", "瀵瑰簲浜嶪l2CppCodeGeneration閫夐」锛屽嬀閫夋椂浣跨敤OptimizeSize(榛樿鎺ㄨ崘)锛岀敓鎴愪唬鐮佸皬15%宸﹀彸锛屽彇娑堝嬀閫夊垯浣跨敤OptimizeSpeed銆傛父鎴忎腑澶ч噺娉涘瀷闆嗗悎鐨勯珮棰戣闂缓璁甇ptimizeSpeed锛屽湪浣跨敤HybridCLR绛夌涓夋柟缁勪欢鏃跺彧鑳界敤OptimizeSpeed銆(Dotnet Runtime妯″紡涓嬭閫夐」鏃犳晥)", !UseIL2CPP); + formCheckbox("profilingFuncs", "Profiling Funcs"); + formCheckbox("profilingMemory", "Profiling Memory"); + + GUI.enabled = false; + // WebGL2.0 + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); + GUILayout.Label("WebGL2.0(beta)", GUILayout.Width(140)); + EditorGUILayout.Toggle(false, GUILayout.Width(20)); + GUILayout.Label("Set in PlayerSettings Override!", GUILayout.Width(200)); + GUILayout.EndHorizontal(); + GUI.enabled = true; + + formCheckbox("iOSPerformancePlus", "iOSPerformancePlus(?)", "鏄惁浣跨敤iOS楂樻ц兘+娓叉煋鏂规锛屾湁鍔╀簬鎻愬崌娓叉煋鍏煎鎬с侀檷浣嶹ebContent杩涚▼鍐呭瓨"); + formCheckbox("EmscriptenGLX", "EmscriptenGLX(?)", "鏄惁浣跨敤EmscriptenGLX娓叉煋鏂规"); + formCheckbox("iOSMetal", "iOSMetal(?)", "鏄惁浣跨敤iOSMetal娓叉煋鏂规锛岄渶瑕佸紑鍚痠OS楂樻ц兘+妯″紡锛屾湁鍔╀簬鎻愬崌杩愯鎬ц兘锛岄檷浣巌OS鍔熻"); + formCheckbox("deleteStreamingAssets", "Clear Streaming Assets"); + formCheckbox("cleanBuild", "Clean WebGL Build"); + // formCheckbox("cleanCloudDev", "Clean Cloud Dev"); + formCheckbox("fbslim", "棣栧寘璧勬簮浼樺寲(?)", "瀵煎嚭鏃惰嚜鍔ㄦ竻鐞哢nityEditor榛樿鎵撳寘浣嗘父鎴忛」鐩粠鏈娇鐢ㄧ殑璧勬簮锛岀槮韬鍖呰祫婧愪綋绉傦紙鍥㈢粨寮曟搸宸叉棤闇寮鍚鑳藉姏锛", UnityUtil.GetEngineVersion() > 0, (res) => + { + var fbWin = EditorWindow.GetWindow(typeof(WXFbSettingWindow), false, "棣栧寘璧勬簮浼樺寲閰嶇疆闈㈡澘", true); + fbWin.minSize = new Vector2(680, 350); + fbWin.Show(); + }); + formCheckbox("autoAdaptScreen", "鑷傚簲灞忓箷灏哄(?)", "绉诲姩绔棆杞睆骞曞拰PC绔媺浼哥獥鍙f椂锛岃嚜鍔ㄨ皟鏁寸敾甯冨昂瀵"); + formCheckbox("showMonitorSuggestModal", "鏄剧ず浼樺寲寤鸿寮圭獥"); + formCheckbox("enableProfileStats", "鏄剧ず鎬ц兘闈㈡澘"); + formCheckbox("enableRenderAnalysis", "鏄剧ず娓叉煋鏃ュ織(dev only)"); + + { + formCheckbox("brotliMT", "brotli澶氱嚎绋嬪帇缂(?)", "寮鍚绾跨▼鍘嬬缉鍙互鎻愰珮鍑哄寘閫熷害锛屼絾浼氶檷浣庡帇缂╃巼銆傚鑻ヤ笉浣跨敤wasm浠g爜鍒嗗寘璇峰嬁鐢ㄥ绾跨▼鍑哄寘涓婄嚎"); + } + EditorGUILayout.EndVertical(); + } + + if (WXConvertCore.IsInstantGameAutoStreaming()) + { + foldInstantGame = EditorGUILayout.Foldout(foldInstantGame, "Instant Game - AutoStreaming"); + if (foldInstantGame) + { + var automaticfillinstantgame = miniGameProperty.FindPropertyRelative("m_AutomaticFillInstantGame"); + EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); + formCheckbox("m_AutomaticFillInstantGame", "鑷姩濉啓AutoStreaming", "浠呭湪寮鍚疉utoStreaming鐢熸晥"); + GUILayout.EndHorizontal(); + formInput("bundlePathIdentifier", "Bundle Path Identifier"); + formInput("dataFileSubPrefix", "Data File Sub Prefix"); + + EditorGUI.BeginDisabledGroup(true); + formCheckbox("autoUploadFirstBundle", "鏋勫缓鍚庤嚜鍔ㄤ笂浼犻鍖(?)", "浠呭湪寮鍚疉utoStreaming鐢熸晥", true); + EditorGUI.EndDisabledGroup(); + + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); + GUILayout.Label(new GUIContent("娓呯悊AS閰嶇疆(?)", "濡傞渶鍏抽棴AutoStreaming閫夌敤榛樿鍙戝竷鏂规鍒欓渶瑕佹竻鐞咥S閰嶇疆椤圭洰銆"), GUILayout.Width(140)); + EditorGUI.BeginDisabledGroup(WXConvertCore.IsInstantGameAutoStreaming()); + 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)); + 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", "鑷畾涔塙nicode(?)", "灏嗗~鍏ョ殑鎵鏈夊瓧绗﹀己鍒跺姞鍏ュ瓧浣撻鍔犺浇鍒楄〃"); + EditorGUILayout.EndVertical(); + } + } + + EditorGUILayout.EndScrollView(); + saveData(serializedObject, miniGameProperty); + } + + 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"; + } + } + + setData("projectName", ProjectConf.FindPropertyRelative("projectName").stringValue); + setData("appid", ProjectConf.FindPropertyRelative("Appid").stringValue); + setData("cdn", ProjectConf.FindPropertyRelative("CDN").stringValue); + setData("assetLoadType", ProjectConf.FindPropertyRelative("assetLoadType").intValue); + setData("compressDataPackage", ProjectConf.FindPropertyRelative("compressDataPackage").boolValue); + setData("videoUrl", ProjectConf.FindPropertyRelative("VideoUrl").stringValue); + setData("orientation", (int)ProjectConf.FindPropertyRelative("Orientation").enumValueIndex); + //setData("dst", ProjectConf.FindPropertyRelative("relativeDST").stringValue); + setData("bundleHashLength", ProjectConf.FindPropertyRelative("bundleHashLength").intValue.ToString()); + setData("bundlePathIdentifier", ProjectConf.FindPropertyRelative("bundlePathIdentifier").stringValue); + setData("bundleExcludeExtensions", ProjectConf.FindPropertyRelative("bundleExcludeExtensions").stringValue); + setData("preloadFiles", ProjectConf.FindPropertyRelative("preloadFiles").stringValue); + + var CompileOptions = miniGameProperty.FindPropertyRelative("CompileOptions"); + // setData("developBuild", CompileOptions.FindPropertyRelative("DevelopBuild").boolValue); + setData("autoProfile", CompileOptions.FindPropertyRelative("AutoProfile").boolValue); + setData("scriptOnly", CompileOptions.FindPropertyRelative("ScriptOnly").boolValue); + setData("il2CppOptimizeSize", CompileOptions.FindPropertyRelative("Il2CppOptimizeSize").boolValue); + setData("profilingFuncs", CompileOptions.FindPropertyRelative("profilingFuncs").boolValue); + setData("profilingMemory", CompileOptions.FindPropertyRelative("ProfilingMemory").boolValue); + setData("deleteStreamingAssets", CompileOptions.FindPropertyRelative("DeleteStreamingAssets").boolValue); + setData("cleanBuild", CompileOptions.FindPropertyRelative("CleanBuild").boolValue); + setData("customNodePath", CompileOptions.FindPropertyRelative("CustomNodePath").stringValue); + setData("webgl2", CompileOptions.FindPropertyRelative("Webgl2").boolValue); + setData("iOSPerformancePlus", CompileOptions.FindPropertyRelative("enableIOSPerformancePlus").boolValue); + setData("iOSMetal", CompileOptions.FindPropertyRelative("enableiOSMetal").boolValue); + setData("EmscriptenGLX", CompileOptions.FindPropertyRelative("enableEmscriptenGLX").boolValue); + setData("fbslim", CompileOptions.FindPropertyRelative("fbslim").boolValue); + + var SDKOptions = miniGameProperty.FindPropertyRelative("SDKOptions"); + setData("useFriendRelation", SDKOptions.FindPropertyRelative("UseFriendRelation").boolValue); + setData("useMiniGameChat", SDKOptions.FindPropertyRelative("UseMiniGameChat").boolValue); + setData("preloadWXFont", SDKOptions.FindPropertyRelative("PreloadWXFont").boolValue); + setData("disableMultiTouch", SDKOptions.FindPropertyRelative("disableMultiTouch").boolValue); + setData("bgImageSrc", ProjectConf.FindPropertyRelative("bgImageSrc").stringValue); + tex = AssetDatabase.LoadAssetAtPath(ProjectConf.FindPropertyRelative("bgImageSrc").stringValue); + setData("memorySize", ProjectConf.FindPropertyRelative("MemorySize").intValue.ToString()); + setData("hideAfterCallMain", ProjectConf.FindPropertyRelative("HideAfterCallMain").boolValue); + + setData("dataFileSubPrefix", ProjectConf.FindPropertyRelative("dataFileSubPrefix").stringValue); + setData("maxStorage", ProjectConf.FindPropertyRelative("maxStorage").intValue.ToString()); + setData("defaultReleaseSize", ProjectConf.FindPropertyRelative("defaultReleaseSize").intValue.ToString()); + setData("texturesHashLength", ProjectConf.FindPropertyRelative("texturesHashLength").intValue.ToString()); + setData("texturesPath", ProjectConf.FindPropertyRelative("texturesPath").stringValue); + setData("needCacheTextures", ProjectConf.FindPropertyRelative("needCacheTextures").boolValue); + setData("loadingBarWidth", ProjectConf.FindPropertyRelative("loadingBarWidth").intValue.ToString()); + setData("needCheckUpdate", ProjectConf.FindPropertyRelative("needCheckUpdate").boolValue); + setData("disableHighPerformanceFallback", ProjectConf.FindPropertyRelative("disableHighPerformanceFallback").boolValue); + setData("autoAdaptScreen", CompileOptions.FindPropertyRelative("autoAdaptScreen").boolValue); + setData("showMonitorSuggestModal", CompileOptions.FindPropertyRelative("showMonitorSuggestModal").boolValue); + setData("enableProfileStats", CompileOptions.FindPropertyRelative("enableProfileStats").boolValue); + setData("enableRenderAnalysis", CompileOptions.FindPropertyRelative("enableRenderAnalysis").boolValue); + setData("brotliMT", CompileOptions.FindPropertyRelative("brotliMT").boolValue); + setData("autoUploadFirstBundle", true); + setData("m_AutomaticFillInstantGame", miniGameProperty.FindPropertyRelative("m_AutomaticFillInstantGame").boolValue); + + // font options + var FontOptions = miniGameProperty.FindPropertyRelative("FontOptions"); + setData("CJK_Unified_Ideographs", FontOptions.FindPropertyRelative("CJK_Unified_Ideographs").boolValue); + setData("C0_Controls_and_Basic_Latin", FontOptions.FindPropertyRelative("C0_Controls_and_Basic_Latin").boolValue); + setData("CJK_Symbols_and_Punctuation", FontOptions.FindPropertyRelative("CJK_Symbols_and_Punctuation").boolValue); + setData("General_Punctuation", FontOptions.FindPropertyRelative("General_Punctuation").boolValue); + setData("Enclosed_CJK_Letters_and_Months", FontOptions.FindPropertyRelative("Enclosed_CJK_Letters_and_Months").boolValue); + setData("Vertical_Forms", FontOptions.FindPropertyRelative("Vertical_Forms").boolValue); + setData("CJK_Compatibility_Forms", FontOptions.FindPropertyRelative("CJK_Compatibility_Forms").boolValue); + setData("Miscellaneous_Symbols", FontOptions.FindPropertyRelative("Miscellaneous_Symbols").boolValue); + setData("CJK_Compatibility", FontOptions.FindPropertyRelative("CJK_Compatibility").boolValue); + setData("Halfwidth_and_Fullwidth_Forms", FontOptions.FindPropertyRelative("Halfwidth_and_Fullwidth_Forms").boolValue); + setData("Dingbats", FontOptions.FindPropertyRelative("Dingbats").boolValue); + setData("Letterlike_Symbols", FontOptions.FindPropertyRelative("Letterlike_Symbols").boolValue); + setData("Enclosed_Alphanumerics", FontOptions.FindPropertyRelative("Enclosed_Alphanumerics").boolValue); + setData("Number_Forms", FontOptions.FindPropertyRelative("Number_Forms").boolValue); + setData("Currency_Symbols", FontOptions.FindPropertyRelative("Currency_Symbols").boolValue); + setData("Arrows", FontOptions.FindPropertyRelative("Arrows").boolValue); + setData("Geometric_Shapes", FontOptions.FindPropertyRelative("Geometric_Shapes").boolValue); + setData("Mathematical_Operators", FontOptions.FindPropertyRelative("Mathematical_Operators").boolValue); + setData("CustomUnicode", FontOptions.FindPropertyRelative("CustomUnicode").stringValue); + } + + private void saveData(SerializedObject serializedObject, SerializedProperty miniGameProperty) + { + serializedObject.UpdateIfRequiredOrScript(); + + var ProjectConf = miniGameProperty.FindPropertyRelative("ProjectConf"); + ProjectConf.FindPropertyRelative("projectName").stringValue = getDataInput("projectName"); + ProjectConf.FindPropertyRelative("Appid").stringValue = getDataInput("appid"); + ProjectConf.FindPropertyRelative("CDN").stringValue = getDataInput("cdn"); + ProjectConf.FindPropertyRelative("assetLoadType").intValue = getDataPop("assetLoadType"); + ProjectConf.FindPropertyRelative("compressDataPackage").boolValue = getDataCheckbox("compressDataPackage"); + ProjectConf.FindPropertyRelative("VideoUrl").stringValue = getDataInput("videoUrl"); + ProjectConf.FindPropertyRelative("Orientation").enumValueIndex = getDataPop("orientation"); + ProjectConf.FindPropertyRelative("relativeDST").stringValue = serializedObject.FindProperty("m_BuildPath").stringValue; + ProjectConf.FindPropertyRelative("DST").stringValue = GetAbsolutePath(config.ProjectConf.relativeDST); + + ProjectConf.FindPropertyRelative("bundleHashLength").intValue = int.Parse(getDataInput("bundleHashLength")); + ProjectConf.FindPropertyRelative("bundlePathIdentifier").stringValue = getDataInput("bundlePathIdentifier"); + ProjectConf.FindPropertyRelative("bundleExcludeExtensions").stringValue = getDataInput("bundleExcludeExtensions"); + ProjectConf.FindPropertyRelative("preloadFiles").stringValue = getDataInput("preloadFiles"); + + var CompileOptions = miniGameProperty.FindPropertyRelative("CompileOptions"); + + CompileOptions.FindPropertyRelative("DevelopBuild").boolValue = serializedObject.FindProperty("m_PlatformSettings").FindPropertyRelative("m_Development").boolValue; + CompileOptions.FindPropertyRelative("AutoProfile").boolValue = getDataCheckbox("autoProfile"); + CompileOptions.FindPropertyRelative("ScriptOnly").boolValue = getDataCheckbox("scriptOnly"); + CompileOptions.FindPropertyRelative("Il2CppOptimizeSize").boolValue = getDataCheckbox("il2CppOptimizeSize"); + CompileOptions.FindPropertyRelative("profilingFuncs").boolValue = getDataCheckbox("profilingFuncs"); + CompileOptions.FindPropertyRelative("ProfilingMemory").boolValue = getDataCheckbox("profilingMemory"); + CompileOptions.FindPropertyRelative("DeleteStreamingAssets").boolValue = getDataCheckbox("deleteStreamingAssets"); + CompileOptions.FindPropertyRelative("CleanBuild").boolValue = getDataCheckbox("cleanBuild"); + CompileOptions.FindPropertyRelative("CustomNodePath").stringValue = getDataInput("customNodePath"); + CompileOptions.FindPropertyRelative("Webgl2").boolValue = getDataCheckbox("webgl2"); + CompileOptions.FindPropertyRelative("enableIOSPerformancePlus").boolValue = getDataCheckbox("iOSPerformancePlus"); + CompileOptions.FindPropertyRelative("enableiOSMetal").boolValue = getDataCheckbox("iOSMetal"); + CompileOptions.FindPropertyRelative("enableEmscriptenGLX").boolValue = getDataCheckbox("EmscriptenGLX"); + CompileOptions.FindPropertyRelative("fbslim").boolValue = getDataCheckbox("fbslim"); + + var SDKOptions = miniGameProperty.FindPropertyRelative("SDKOptions"); + SDKOptions.FindPropertyRelative("UseFriendRelation").boolValue = getDataCheckbox("useFriendRelation"); + SDKOptions.FindPropertyRelative("UseMiniGameChat").boolValue = getDataCheckbox("useMiniGameChat"); + SDKOptions.FindPropertyRelative("PreloadWXFont").boolValue = getDataCheckbox("preloadWXFont"); + SDKOptions.FindPropertyRelative("disableMultiTouch").boolValue = getDataCheckbox("disableMultiTouch"); + ProjectConf.FindPropertyRelative("bgImageSrc").stringValue = getDataInput("bgImageSrc"); + ProjectConf.FindPropertyRelative("MemorySize").intValue = int.Parse(getDataInput("memorySize")); + ProjectConf.FindPropertyRelative("HideAfterCallMain").boolValue = getDataCheckbox("hideAfterCallMain"); + ProjectConf.FindPropertyRelative("dataFileSubPrefix").stringValue = getDataInput("dataFileSubPrefix"); + ProjectConf.FindPropertyRelative("maxStorage").intValue = int.Parse(getDataInput("maxStorage")); + ProjectConf.FindPropertyRelative("defaultReleaseSize").intValue = int.Parse(getDataInput("defaultReleaseSize")); + ProjectConf.FindPropertyRelative("texturesHashLength").intValue = int.Parse(getDataInput("texturesHashLength")); + ProjectConf.FindPropertyRelative("texturesPath").stringValue = getDataInput("texturesPath"); + ProjectConf.FindPropertyRelative("needCacheTextures").boolValue = getDataCheckbox("needCacheTextures"); + ProjectConf.FindPropertyRelative("loadingBarWidth").intValue = int.Parse(getDataInput("loadingBarWidth")); + ProjectConf.FindPropertyRelative("needCheckUpdate").boolValue = getDataCheckbox("needCheckUpdate"); + ProjectConf.FindPropertyRelative("disableHighPerformanceFallback").boolValue = getDataCheckbox("disableHighPerformanceFallback"); + CompileOptions.FindPropertyRelative("autoAdaptScreen").boolValue = getDataCheckbox("autoAdaptScreen"); + CompileOptions.FindPropertyRelative("showMonitorSuggestModal").boolValue = getDataCheckbox("showMonitorSuggestModal"); + CompileOptions.FindPropertyRelative("enableProfileStats").boolValue = getDataCheckbox("enableProfileStats"); + CompileOptions.FindPropertyRelative("enableRenderAnalysis").boolValue = getDataCheckbox("enableRenderAnalysis"); + CompileOptions.FindPropertyRelative("brotliMT").boolValue = getDataCheckbox("brotliMT"); + + // font options + var FontOptions = miniGameProperty.FindPropertyRelative("FontOptions"); + FontOptions.FindPropertyRelative("CJK_Unified_Ideographs").boolValue = getDataCheckbox("CJK_Unified_Ideographs"); + FontOptions.FindPropertyRelative("C0_Controls_and_Basic_Latin").boolValue = getDataCheckbox("C0_Controls_and_Basic_Latin"); + FontOptions.FindPropertyRelative("CJK_Symbols_and_Punctuation").boolValue = getDataCheckbox("CJK_Symbols_and_Punctuation"); + FontOptions.FindPropertyRelative("General_Punctuation").boolValue = getDataCheckbox("General_Punctuation"); + FontOptions.FindPropertyRelative("Enclosed_CJK_Letters_and_Months").boolValue = getDataCheckbox("Enclosed_CJK_Letters_and_Months"); + FontOptions.FindPropertyRelative("Vertical_Forms").boolValue = getDataCheckbox("Vertical_Forms"); + FontOptions.FindPropertyRelative("CJK_Compatibility_Forms").boolValue = getDataCheckbox("CJK_Compatibility_Forms"); + FontOptions.FindPropertyRelative("Miscellaneous_Symbols").boolValue = getDataCheckbox("Miscellaneous_Symbols"); + FontOptions.FindPropertyRelative("CJK_Compatibility").boolValue = getDataCheckbox("CJK_Compatibility"); + FontOptions.FindPropertyRelative("Halfwidth_and_Fullwidth_Forms").boolValue = getDataCheckbox("Halfwidth_and_Fullwidth_Forms"); + FontOptions.FindPropertyRelative("Dingbats").boolValue = getDataCheckbox("Dingbats"); + FontOptions.FindPropertyRelative("Letterlike_Symbols").boolValue = getDataCheckbox("Letterlike_Symbols"); + FontOptions.FindPropertyRelative("Enclosed_Alphanumerics").boolValue = getDataCheckbox("Enclosed_Alphanumerics"); + FontOptions.FindPropertyRelative("Number_Forms").boolValue = getDataCheckbox("Number_Forms"); + FontOptions.FindPropertyRelative("Currency_Symbols").boolValue = getDataCheckbox("Currency_Symbols"); + FontOptions.FindPropertyRelative("Arrows").boolValue = getDataCheckbox("Arrows"); + FontOptions.FindPropertyRelative("Geometric_Shapes").boolValue = getDataCheckbox("Geometric_Shapes"); + FontOptions.FindPropertyRelative("Mathematical_Operators").boolValue = getDataCheckbox("Mathematical_Operators"); + FontOptions.FindPropertyRelative("CustomUnicode").stringValue = getDataInput("CustomUnicode"); + FontOptions.FindPropertyRelative("Arrows").boolValue = getDataCheckbox("Arrows"); + FontOptions.FindPropertyRelative("Geometric_Shapes").boolValue = getDataCheckbox("Geometric_Shapes"); + FontOptions.FindPropertyRelative("Mathematical_Operators").boolValue = getDataCheckbox("Mathematical_Operators"); + FontOptions.FindPropertyRelative("CustomUnicode").stringValue = getDataInput("CustomUnicode"); + + miniGameProperty.FindPropertyRelative("m_AutomaticFillInstantGame").boolValue = getDataCheckbox("m_AutomaticFillInstantGame"); + + serializedObject.ApplyModifiedProperties(); + } + + private bool getDataCheckbox(string target) + { + if (formCheckboxData.ContainsKey(target)) + return formCheckboxData[target]; + return false; + } + + private string getDataInput(string target) + { + if (formInputData.ContainsKey(target)) + return formInputData[target]; + return ""; + } + + private int getDataPop(string target) + { + if (formIntPopupData.ContainsKey(target)) + return formIntPopupData[target]; + return 0; + } + + private void setData(string target, string value) + { + if (formInputData.ContainsKey(target)) + { + formInputData[target] = value; + } + else + { + formInputData.Add(target, value); + } + } + + private void setData(string target, bool value) + { + if (formCheckboxData.ContainsKey(target)) + { + formCheckboxData[target] = value; + } + else + { + formCheckboxData.Add(target, value); + } + } + + private void setData(string target, int value) + { + if (formIntPopupData.ContainsKey(target)) + { + formIntPopupData[target] = value; + } + else + { + formIntPopupData.Add(target, value); + } + } + + private void formInput(string target, string label, string help = null) + { + if (!formInputData.ContainsKey(target)) + { + formInputData[target] = ""; + } + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); + if (help == null) + { + GUILayout.Label(label, GUILayout.Width(140)); + } + else + { + GUILayout.Label(new GUIContent(label, help), GUILayout.Width(140)); + } + formInputData[target] = GUILayout.TextField(formInputData[target], GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 195)); + GUILayout.EndHorizontal(); + } + + private void formCheckbox(string target, string label, string help = null, bool disable = false, Action setting = null) + { + if (!formCheckboxData.ContainsKey(target)) + { + formCheckboxData[target] = false; + } + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); + if (help == null) + { + GUILayout.Label(label, GUILayout.Width(140)); + } + else + { + GUILayout.Label(new GUIContent(label, help), GUILayout.Width(140)); + } + EditorGUI.BeginDisabledGroup(disable); + formCheckboxData[target] = EditorGUILayout.Toggle(disable ? false : formCheckboxData[target]); + + if (setting != null) + { + EditorGUILayout.LabelField("", GUILayout.Width(10)); + // 锟斤拷锟矫帮拷钮 + if (GUILayout.Button(new GUIContent("锟斤拷锟斤拷"), GUILayout.Width(40), GUILayout.Height(18))) + { + setting?.Invoke(true); + } + EditorGUILayout.LabelField("", GUILayout.MinWidth(10)); + } + + EditorGUI.EndDisabledGroup(); + + if (setting == null) + EditorGUILayout.LabelField(string.Empty); + GUILayout.EndHorizontal(); + } + + private void formIntPopup(string target, string label, string[] options, int[] values) + { + if (!formIntPopupData.ContainsKey(target)) + { + formIntPopupData[target] = 0; + } + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); + GUILayout.Label(label, GUILayout.Width(140)); + formIntPopupData[target] = EditorGUILayout.IntPopup(formIntPopupData[target], options, values, GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 195)); + GUILayout.EndHorizontal(); + } + + public static bool IsAbsolutePath(string path) + { + // 妫鏌ユ槸鍚︿负绌烘垨绌虹櫧 + if (string.IsNullOrWhiteSpace(path)) + { + return false; + } + + // 鍦 Windows 涓婏紝妫鏌ラ┍鍔ㄥ櫒瀛楁瘝鎴栫綉缁滆矾寰 + if (Application.platform == RuntimePlatform.WindowsEditor && Path.IsPathRooted(path)) + { + return true; + } + + // 鍦 Unix/Linux 鍜 macOS 涓婏紝妫鏌ユ槸鍚︿互 '/' 寮澶 + if (Application.platform == RuntimePlatform.OSXEditor && path.StartsWith("/")) + { + return true; + } + + return false; // 鍚﹀垯涓虹浉瀵硅矾寰 + } + + public static string GetAbsolutePath(string path) + { + if (IsAbsolutePath(path)) + { + return path; + } + string projectRootPath = System.IO.Path.GetFullPath(Application.dataPath + "/../"); + return Path.Combine(projectRootPath, path); + } + } +} +#endif diff --git a/Editor/BuildProfile/WeixinMiniGameSettingsEditor.cs.meta b/Editor/BuildProfile/WeixinMiniGameSettingsEditor.cs.meta new file mode 100644 index 000000000..e2d43458c --- /dev/null +++ b/Editor/BuildProfile/WeixinMiniGameSettingsEditor.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ea26445e6c408f886f84ccd30a12aaa8 +DefaultImporter: +externalObjects: {} +userData: +assetBundleName: +assetBundleVariant: \ No newline at end of file diff --git a/Editor/BuildProfile/WeixinSubplatformInterface.cs b/Editor/BuildProfile/WeixinSubplatformInterface.cs new file mode 100644 index 000000000..5ab0560aa --- /dev/null +++ b/Editor/BuildProfile/WeixinSubplatformInterface.cs @@ -0,0 +1,151 @@ +#if TUANJIE_1_4_OR_NEWER +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEditor.Build.Profile; +using UnityEngine; +using UnityEngine.Rendering; + + +namespace WeChatWASM +{ + [InitializeOnLoad] + public static class WeixinSubTargetManager + { + static WeixinSubTargetManager() + { + MiniGameSubplatformManager.RegisterSubplatform(new WeixinSubplatformInterface()); + } + } + + public class WeixinSubplatformInterface : MiniGameSubplatformInterface + { + + public override string GetSubplatformName() + { + return "WeChat:微信小游戏"; + } + + public override MiniGameSettings GetSubplatformSettings() + { + return new WeixinMiniGameSettings(new WeixinMiniGameSettingsEditor()); + } + + public override BuildMiniGameError Build(BuildProfile buildProfile) + { + // Useless + return BuildMiniGameError.InvalidInput; + } + + public override BuildMiniGameError Build(BuildProfile buildProfile, BuildOptions options) + { + + var bcLibPath = Path.GetFullPath(Path.Combine("Packages", "com.qq.weixin.minigame", "Editor", "BuildProfile", "lib", "libwx-metal-cpp.bc")); + var jsLibPath = Path.GetFullPath(Path.Combine("Packages", "com.qq.weixin.minigame", "Editor", "BuildProfile", "lib", "mtl_library.jslib")); + string libPath = bcLibPath + ';' + jsLibPath; + EditorUtility.SetMiniGameGfxLibraryPath(libPath); + + WeixinMiniGameSettings settings = buildProfile.miniGameSettings as WeixinMiniGameSettings; + + BuildMiniGameError buildMiniGameError = BuildMiniGameError.Unknown; + bool preprocessSuccess = WechatBuildPreprocess(buildProfile); + if (!preprocessSuccess) + { + return BuildMiniGameError.InvalidInput; + } + + if (settings is not null) + { + settings.FillAutoStreamingAutomatically(); + if (settings.PreprocessBuild(buildProfile, options)) + { + + var error = CallDoExport(buildProfile); + int enumIntValue = Convert.ToInt32(error); + switch (enumIntValue) + { + case 0: // SUCCEED + { + WeixinMiniGameSettings.AutoStreamingLoad(); + buildMiniGameError = BuildMiniGameError.Succeeded; + break; + } + case 2: // BUILD_WEBGL_FAILED + { + buildMiniGameError = BuildMiniGameError.PlayerBuildFailed; + break; + } + case 1: // NODE_NOT_FOUND + default: + { + buildMiniGameError = BuildMiniGameError.Unknown; + break; + } + } + } + } + + return buildMiniGameError; + } + + private WXConvertCore.WXExportError CallDoExport(BuildProfile buildProfile) + { + WXEditorScriptObject config = UnityUtil.GetEditorConf(); + WeixinMiniGameSettings weixinSettings = buildProfile.miniGameSettings as WeixinMiniGameSettings; + config.ProjectConf = weixinSettings.ProjectConf; + config.SDKOptions = weixinSettings.SDKOptions; + config.CompileOptions = weixinSettings.CompileOptions; + config.CompressTexture = weixinSettings.CompressTexture; + config.PlayerPrefsKeys = weixinSettings.PlayerPrefsKeys; + config.FontOptions = weixinSettings.FontOptions; + EditorUtility.SetDirty(config); + AssetDatabase.SaveAssets(); + return WXConvertCore.DoExport(); + } + + private static bool WechatBuildPreprocess(BuildProfile buildProfile) + { + // Check GFX API and Color Space + if (buildProfile != null) + { + PlayerSettings playerSettings = buildProfile.playerSettings; + // Global PlayerSettings + ColorSpace colorSpace = PlayerSettings.colorSpace; + GraphicsDeviceType[] apis = PlayerSettings.GetGraphicsAPIs(buildProfile.buildTarget); + bool isAutomatic = PlayerSettings.GetUseDefaultGraphicsAPIs(buildProfile.buildTarget); + + if (playerSettings != null) + { + // BuildProfile PlayerSettings Override + colorSpace = PlayerSettings.GetColorSpace_Internal(playerSettings); + apis = PlayerSettings.GetGraphicsAPIs_Internal(playerSettings, buildProfile.buildTarget); + isAutomatic = PlayerSettings.GetUseDefaultGraphicsAPIs_Internal(playerSettings, buildProfile.buildTarget); + + // set override templatePath + var absolutePath = Path.GetFullPath(Path.Combine("Packages", "com.qq.weixin.minigame", "WebGLTemplates/WXTemplate2022TJ")); + if (!Directory.Exists(absolutePath)) + absolutePath = Path.GetFullPath(Path.Combine(Application.dataPath, "WebGLTemplates/WXTemplate2022TJ")); + + if (Directory.Exists(absolutePath)) + PlayerSettings.MiniGame.SetTemplatePath_Internal(playerSettings, $"PATH:{absolutePath}"); + + PlayerSettings.MiniGame.SetThreadsSupport_Internal(playerSettings, false); + PlayerSettings.MiniGame.SetCompressionFormat_Internal(playerSettings, MiniGameCompressionFormat.Disabled); + PlayerSettings.MiniGame.SetLinkerTarget_Internal(playerSettings, MiniGameLinkerTarget.Wasm); + PlayerSettings.MiniGame.SetDataCaching_Internal(playerSettings, false); + PlayerSettings.MiniGame.SetDebugSymbolMode_Internal(playerSettings, MiniGameDebugSymbolMode.External); + PlayerSettings.SetRunInBackground_Internal(playerSettings, false); + } + return true; + } + else + { + throw new InvalidOperationException("Build profile has not been initialized."); + } + } + + } +} +#endif diff --git a/Editor/BuildProfile/WeixinSubplatformInterface.cs.meta b/Editor/BuildProfile/WeixinSubplatformInterface.cs.meta new file mode 100644 index 000000000..753c5bcd6 --- /dev/null +++ b/Editor/BuildProfile/WeixinSubplatformInterface.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3a204405694d8a3e06157560a643f9f2 +DefaultImporter: +externalObjects: {} +userData: +assetBundleName: +assetBundleVariant: \ No newline at end of file diff --git a/Editor/WXPluginVersion.cs b/Editor/WXPluginVersion.cs index f626b0473..d57ed08dd 100644 --- a/Editor/WXPluginVersion.cs +++ b/Editor/WXPluginVersion.cs @@ -2,7 +2,7 @@ namespace WeChatWASM { public class WXPluginVersion { - public static string pluginVersion = "202509190342"; // 杩欎竴琛屼笉瑕佹敼浠栵紝瀵煎嚭鐨勬椂鍊欎細鑷姩鏇挎崲 + public static string pluginVersion = "202509260245"; // 杩欎竴琛屼笉瑕佹敼浠栵紝瀵煎嚭鐨勬椂鍊欎細鑷姩鏇挎崲 } public class WXPluginConf diff --git a/Editor/wx-editor.dll b/Editor/wx-editor.dll index 131f23a3aeeb1a06383ce1964c2918b033e743a8..6e8d94fd2622a23e83e7d28835ee6e56841c62b8 100644 GIT binary patch delta 294 zcmZo@;csZ+pU}Z<`0r|CcWXD})@~-o1B}kodk-)*Gipy4Jjk?MGM4c>KN~|dUy7a( zLoU;I{(OcY4F(1_29xO*4>Db3QeoV_#@l3Hy!i)?I$=e&xF#Tj@ z44Ynki7B2jb^Gm0Ozez|VcQ>HW{QvF4FD=(WO%{Az`(>1u-)H?xkgdh(b&w~!ob;F z*V4(Db3`p>X^$swk5oc#WbCAO>#@l3Hy!i)?IcH0}zF#Tj@ zG@M?2i7B4ZVf*b%Ozez|hT9)sW{QvF)dnhIWO%{Az`(?yz1`o4xkhpNhhXLaWmi)( zQ)2^5H(gUl6GL4SXGcR_OBWL}T{A}`S5p^Db3-G??RFu|cdS)hP2AjETwG0bO)OoU zbWJRb&2^nDOpSC+&0Q=F94#!2T#byT+f86rv?NAlEzl_p2bcJIw*T~Un_H6|cw^_| MJ=zW@LL diff --git a/Editor/wx-editor.xml.meta b/Editor/wx-editor.xml.meta index 08fb6c979..e6dbbc4c1 100644 --- a/Editor/wx-editor.xml.meta +++ b/Editor/wx-editor.xml.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e912072963154e902b7be4fe8159aa52 +guid: e27522a75bef6fea5382902543fcf350 DefaultImporter: externalObjects: {} userData: diff --git a/Runtime/Plugins/wx-perf.dll b/Runtime/Plugins/wx-perf.dll index 5f94d9444c8884e5b1b878f2e081712c22e46bc2..5083b56a2c41e7643bd46f527dea0c32a834e09f 100644 GIT binary patch delta 38 wcmV+>0NMY5v;%;&1CWRVJ^t0Pi=o62R!=$aO4+|gxoX*iO45AZvpmJb6mPc^!2kdN delta 38 wcmV+>0NMY5v;%;&1CWRVG11Jii=o62--vyQtU-f7qUvM@SgPwRvpmJb6lgvY!2kdN diff --git a/Runtime/Plugins/wx-runtime-editor.dll b/Runtime/Plugins/wx-runtime-editor.dll index 71548f7857876cd0001fab7af2949e6cd3b3c5c6..56af55246fed7fd2f2f9b7c1b8cd75374063fd4c 100644 GIT binary patch delta 75916 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%0AKOPGt8}KuIA~@|p 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 DMOXSq delta 75932 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 GRsSC&!Z*+W diff --git a/Runtime/Plugins/wx-runtime-editor.xml.meta b/Runtime/Plugins/wx-runtime-editor.xml.meta index 7e3ed82ae..876307c96 100644 --- a/Runtime/Plugins/wx-runtime-editor.xml.meta +++ b/Runtime/Plugins/wx-runtime-editor.xml.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2ceb14b8f4cecafb3aa8d22479fcb871 +guid: e40e1a0720c120f99ed6bfdd00594292 DefaultImporter: externalObjects: {} userData: diff --git a/Runtime/Plugins/wx-runtime.dll b/Runtime/Plugins/wx-runtime.dll index 7aa5d695bff1c2f71e9b47b8699c3cb8f95cb6d8..39ecf12ea3c494d481e23e3f4974b85062dac39c 100644 GIT binary patch delta 48 zcmZpez}GN=Z$byN*}toe-L2h>t=&vpyO~){1RiTV5HZfQb=a9x_~*55*puxGOqdgb E0qqeKSpWb4 delta 48 zcmV-00MGw`kPd*54v>fgDbdV