三国卡牌客户端基础资源仓库
yyl
2025-05-22 e4e502816f0641ee6b76cfae38f290ba8b803af1
登录流程前的所有预备流程
9个文件已修改
2个文件已添加
455 ■■■■■ 已修改文件
Assets/Editor/ConfigGen/ConfigDataTemplate.txt 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/UI/PSDTOUGUIProcessor.cs 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Common/DownLoadAndDiscompressTask.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Common/ResourcesPath.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Config/InitialFunctionConfig.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Launch.cs 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/UI/LaunchWins/LaunchLoadingWin.cs 148 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Resources/Scenes/Launch.unity 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Resources/VersionConfig.asset 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Resources/VersionConfig.asset.meta 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Resources/VersionConfigEx.txt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/ConfigGen/ConfigDataTemplate.txt
@@ -23,7 +23,13 @@
    public override void LoadConfig(string input)
    {
        try {
        string[] tables = input.Split('\t');
        #Read#
    }
        catch (Exception exception)
        {
            Debug.LogError(exception);
        }
    }
}
Assets/Editor/UI/PSDTOUGUIProcessor.cs
@@ -4,6 +4,8 @@
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using System.IO;
using System.Text;
public class PSDTOUGUIProcessor
{
@@ -47,4 +49,93 @@
            g.raycastTarget = false;
        }
    }
    [UnityEditor.MenuItem("GameObject/生成UI脚本", false, 10)]
    public static void GenerateUIScript()
    {
        GameObject go = Selection.activeGameObject;
        if (go == null)
        {
            Debug.LogError("请先选择一个GameObject");
            return;
        }
        string className = go.name;
        string targetFolder = Path.Combine(Application.dataPath, "Scripts/Main/UI");
        // 确保目标文件夹存在
        if (!Directory.Exists(targetFolder))
        {
            Directory.CreateDirectory(targetFolder);
        }
        string filePath = Path.Combine(targetFolder, className + ".cs");
        // 检查文件是否已存在
        if (File.Exists(filePath))
        {
            if (!EditorUtility.DisplayDialog("文件已存在", $"文件 {className}.cs 已存在,是否覆盖?", "覆盖", "取消"))
            {
                return;
            }
        }
        // 生成脚本内容
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("using UnityEngine;");
        sb.AppendLine("using System.Collections;");
        sb.AppendLine("using System.Collections.Generic;");
        sb.AppendLine("using UnityEngine.UI;");
        sb.AppendLine("using DG.Tweening;");
        sb.AppendLine("using Cysharp.Threading.Tasks;");
        sb.AppendLine("");
        sb.AppendLine($"public class {className} : UIBase");
        sb.AppendLine("{");
        sb.AppendLine("    // 组件引用");
        sb.AppendLine("");
        sb.AppendLine("    // 生命周期");
        sb.AppendLine("    protected override void Awake()");
        sb.AppendLine("    {");
        sb.AppendLine("        base.Awake();");
        sb.AppendLine("        // 初始化组件引用");
        sb.AppendLine("    }");
        sb.AppendLine("");
        sb.AppendLine("    protected override void Start()");
        sb.AppendLine("    {");
        sb.AppendLine("        base.Start();");
        sb.AppendLine("        // 初始化数据");
        sb.AppendLine("    }");
        sb.AppendLine("");
        sb.AppendLine("    // UI事件");
        sb.AppendLine("    protected override void OnOpen()");
        sb.AppendLine("    {");
        sb.AppendLine("        base.OnOpen();");
        sb.AppendLine("        // 窗口打开时的逻辑");
        sb.AppendLine("    }");
        sb.AppendLine("");
        sb.AppendLine("    protected override void OnClose()");
        sb.AppendLine("    {");
        sb.AppendLine("        base.OnClose();");
        sb.AppendLine("        // 窗口关闭时的逻辑");
        sb.AppendLine("    }");
        sb.AppendLine("");
        sb.AppendLine("    public override void Refresh()");
        sb.AppendLine("    {");
        sb.AppendLine("        base.Refresh();");
        sb.AppendLine("        // 刷新UI显示");
        sb.AppendLine("    }");
        sb.AppendLine("}");
        // 写入文件
        File.WriteAllText(filePath, sb.ToString(), Encoding.UTF8);
        Debug.Log($"UI脚本已生成: {filePath}");
        // 刷新资源数据库以显示新文件
        AssetDatabase.Refresh();
        // 打开生成的脚本
        UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(filePath, 1);
    }
}
Assets/Launch/Common/DownLoadAndDiscompressTask.cs
@@ -3,10 +3,10 @@
using UnityEngine;
using System;
using LaunchCommon;
using Cysharp.Threading.Tasks;
    public class DownLoadAndDiscompressTask : Singleton<DownLoadAndDiscompressTask>
    {
        public const int BYTE_PER_KILOBYTE = 1024;
@@ -55,17 +55,15 @@
            }
            StartDownLoad();
        }
        public void StartDownLoad()
        {
            step = Step.DownLoad;
            DownloadMgr.Instance.StartCoroutine(Co_StartDownLoad());
        Co_StartDownLoad().Forget();
        }
        IEnumerator Co_StartDownLoad()
    async UniTask Co_StartDownLoad()
        {
            int downLoadTryCount = 0;
            List<bool> checkDownFile = new List<bool>();
@@ -85,7 +83,7 @@
                while (!DownloadMgr.Instance.IsFinished)
                {
                    yield return null;
                await UniTask.Yield();
                }
                checkDownFile = new List<bool>();
@@ -110,7 +108,6 @@
                        downLoadTryCount++;
                    }
                    Debug.LogErrorFormat("资源下载完后有{0}个文件无效({1}),重新开始下载", filledTasks.Count, filledTasks[0].fileName);
                }
                tasks = filledTasks;
                if (downLoadTryCount >= 1)
@@ -124,7 +121,7 @@
            {
                Debug.LogError("logic资源下载失败,警告提示,退出协程");
                LocalResManager.downLoadCount++;
                yield break;
            return;
            }
            Debug.Log("资源全部下载完成");
@@ -136,7 +133,6 @@
                downLoadOkCallBack();
                downLoadOkCallBack = null;
            }
        }
        public enum Step
@@ -146,5 +142,4 @@
            DownLoad,
            Completed,
        }
    }
Assets/Launch/Common/ResourcesPath.cs
@@ -37,7 +37,7 @@
    public static readonly string UI_FONT_SUFFIX = "UI/Font";
    public static readonly string UI_PREFAB_SUFFIX = "UI/Prefab";
    public static readonly string CONFIG_FODLER = ResourcesOutPath + "Config/Configs/";
    public static readonly string CONFIG_FODLER = ResourcesOutPath + "Config/";
    public static readonly string AUDIO_SUFFIX = "Audio/";
    public static readonly string VIDEO_SUFFIX = "Video/";
Assets/Launch/Config/InitialFunctionConfig.cs
@@ -8,6 +8,8 @@
using System;
using UnityEngine;
namespace LaunchCommon
{
    public class InitialFunctionConfig
    {
@@ -147,3 +149,4 @@
        }
    }
}
Assets/Launch/Launch.cs
@@ -10,6 +10,7 @@
using System.Reflection;
using UnityEngine.Networking;
using LaunchCommon;
using HybridCLR;
public class Launch : MonoBehaviour
{
@@ -59,12 +60,12 @@
    {
        Debug.Log("Launch Start");
        LaunchLoadingWin.OpenWindow();
        InitPlugins();
        InitSetting();
        SDKInit();
        // 1. 打开加载界面
        LaunchLoadingWin.OpenWindow();
    }
    private void InitSetting()
@@ -87,7 +88,6 @@
        LocalResManager.Instance.InitTable(() =>
        {
            LocalResManager.Instance.InitDefaultLanguage();
            LaunchLoadingWin.OpenWindow();
            // LocalResManager.Instance.OpenWindow("LaunchExWin", m_UICanvas);
#if !UNITY_EDITOR
            LocalResManager.step = LocalResManager.LoadDllStep.RequestVersion;
@@ -112,6 +112,31 @@
    private void SDKInit()
    {
    }
    /// <summary>
    /// 为aot assembly加载原始metadata, 这个代码放aot或者热更新都行。
    /// 一旦加载后,如果AOT泛型函数对应native实现不存在,则自动替换为解释模式执行
    /// </summary>
    private void LoadMetadataForAOTAssemblies()
    {
        /// 注意,补充元数据是给AOT dll补充元数据,而不是给热更新dll补充元数据。
        /// 热更新dll不缺元数据,不需要补充,如果调用LoadMetadataForAOTAssembly会返回错误
        ///
        HomologousImageMode mode = HomologousImageMode.SuperSet;
        foreach (var aotDllName in AOTMetaAssemblyFiles)
        {
            if (aotDllName == "Main.dll.bytes")
                continue;
            // 加载assembly对应的dll,会自动为它hook。一旦aot泛型函数的native函数不存在,用解释器版本代码
            LoadImageErrorCode err = RuntimeApi.LoadMetadataForAOTAssembly(ReadBytesFromStreamingAssets(aotDllName), mode);
            Debug.Log($"LoadMetadataForAOTAssembly:{aotDllName}. mode:{mode} ret:{err}");
        }
    }
    public static byte[] ReadBytesFromStreamingAssets(string dllName)
    {
        return s_assetDatas[dllName];
    }
    
    private void StartGame()
@@ -245,7 +270,7 @@
            {
                // 特殊处理
                byte[] assetData;
                if (asset == "Assembly-CSharp.dll.bytes")
                if (asset == "Main.dll.bytes")
                {
                    assetData = new byte[www.downloadHandler.data.Length - 3];
                    Array.Copy(www.downloadHandler.data, 3, assetData, 0, assetData.Length);
Assets/Launch/UI/LaunchWins/LaunchLoadingWin.cs
@@ -44,15 +44,146 @@
    private float tipChangeTimer = 0f;
    private const float TIP_CHANGE_INTERVAL = 3f; // 提示切换间隔时间
    
    // 上一次记录的加载步骤
    private int lastStep = -1;
    // 目标进度值
    private float targetProgress = 0f;
    // 当前显示的进度值
    private float currentDisplayProgress = 0f;
    // 进度平滑过渡时间
    private const float PROGRESS_SMOOTH_TIME = 0.5f;
    private void Awake()
    {
        _instance = this;
        Canvas canvas = GetComponent<Canvas>();
        canvas.sortingOrder = -32768;
        canvas.overrideSorting = false; // 不覆盖排序
        // transform.SetAsFirstSibling();
        
        // 初始化提示列表
        InitTipsList();
        
        // 初始化进度条
        SetProgress(0f);
    }
    private void Update()
    {
        // 检查加载步骤是否发生变化
        CheckLoadingStepChange();
        // 平滑更新进度条显示
        UpdateProgressDisplay();
    }
    /// <summary>
    /// 平滑更新进度条显示
    /// </summary>
    private void UpdateProgressDisplay()
    {
        // 如果当前显示进度与目标进度不同,平滑过渡
        if (Mathf.Abs(currentDisplayProgress - targetProgress) > 0.001f)
        {
            // 计算平滑过渡的新进度值
            currentDisplayProgress = Mathf.Lerp(currentDisplayProgress, targetProgress, Time.deltaTime / PROGRESS_SMOOTH_TIME);
            // 更新进度条显示
            UpdateProgressUI(currentDisplayProgress);
        }
    }
    /// <summary>
    /// 更新进度条UI显示
    /// </summary>
    /// <param name="progress">进度值(0-1)</param>
    private void UpdateProgressUI(float progress)
    {
        // 限制进度值范围
        progress = Mathf.Clamp01(progress);
        // 更新进度条
        if (progressBar != null)
        {
            progressBar.fillAmount = progress;
        }
        // 更新进度文本
        if (progressText != null)
        {
            progressText.text = $"{(int)(progress * 100)}%";
        }
    }
    /// <summary>
    /// 检查加载步骤变化并更新进度条
    /// </summary>
    private void CheckLoadingStepChange()
    {
        // 如果LocalResManager不存在,直接返回
        if (!LocalResManager.IsValid())
            return;
        // 获取当前加载步骤
        int currentStep = (int)LocalResManager.step;
        // 如果步骤没有变化且不是下载阶段,直接返回
        if (currentStep == lastStep && LocalResManager.step != LocalResManager.LoadDllStep.DownLoad)
            return;
        // 更新上一次记录的步骤
        lastStep = currentStep;
        // 根据步骤更新进度条
        UpdateProgressByStep(currentStep);
    }
    /// <summary>
    /// 根据加载步骤更新进度条
    /// </summary>
    /// <param name="step">当前加载步骤</param>
    private void UpdateProgressByStep(int step)
    {
        // 根据不同步骤设置不同的进度值
        switch ((LocalResManager.LoadDllStep)step)
        {
            case LocalResManager.LoadDllStep.None:
                targetProgress = 0.0f;
                break;
            case LocalResManager.LoadDllStep.Wait:
                targetProgress = 0.05f;
                SetCurrentState(FirstPackLang.TextIndex.InitSDK);
                break;
            case LocalResManager.LoadDllStep.RequestVersion:
                targetProgress = 0.1f;
                SetCurrentState(FirstPackLang.TextIndex.CheckVersion);
                break;
            case LocalResManager.LoadDllStep.PrepareDownLoad:
                targetProgress = 0.2f;
                SetCurrentState(FirstPackLang.TextIndex.ExtractResources);
                break;
            case LocalResManager.LoadDllStep.DownLoad:
                // 下载阶段占总进度的50%,从20%到70%
                if (DownLoadAndDiscompressTask.Instance != null)
                {
                    float downloadProgress = DownLoadAndDiscompressTask.Instance.progress;
                    targetProgress = 0.2f + downloadProgress * 0.5f;
                }
                SetCurrentState(FirstPackLang.TextIndex.HotUpdate);
                break;
            case LocalResManager.LoadDllStep.ReadBytes:
                targetProgress = 0.8f;
                SetCurrentState(FirstPackLang.TextIndex.EnterHotUpdateAssembly);
                break;
            case LocalResManager.LoadDllStep.Completed:
                targetProgress = 1.0f;
                break;
        }
    }
    
    /// <summary>
@@ -79,7 +210,6 @@
            _instance = null;
        }
        GameObject.Instantiate(LocalResManager.Instance.LoadBuiltInPrefab("LaunchLoadingWin"));
    }
    
@@ -101,20 +231,8 @@
    /// <param name="progress">进度值(0-1)</param>
    public void SetProgress(float progress)
    {
        // 限制进度值范围
        progress = Mathf.Clamp01(progress);
        // 更新进度条
        if (progressBar != null)
        {
            progressBar.fillAmount = progress;
        }
        // 更新进度文本
        if (progressText != null)
        {
            progressText.text = $"{(int)(progress * 100)}%";
        }
        // 设置目标进度值
        targetProgress = Mathf.Clamp01(progress);
    }
    
    /// <summary>
Assets/Resources/Scenes/Launch.unity
@@ -230,103 +230,6 @@
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 82528803}
  m_CullTransparentMesh: 1
--- !u!1001 &268124820
PrefabInstance:
  m_ObjectHideFlags: 0
  serializedVersion: 2
  m_Modification:
    serializedVersion: 3
    m_TransformParent: {fileID: 0}
    m_Modifications:
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_Pivot.x
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_Pivot.y
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_AnchorMax.x
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_AnchorMax.y
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_AnchorMin.x
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_AnchorMin.y
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_SizeDelta.x
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_SizeDelta.y
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_LocalPosition.x
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_LocalPosition.y
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_LocalPosition.z
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_LocalRotation.w
      value: 1
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_LocalRotation.x
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_LocalRotation.y
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_LocalRotation.z
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_AnchoredPosition.x
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_AnchoredPosition.y
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_LocalEulerAnglesHint.x
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_LocalEulerAnglesHint.y
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 1798569891721238403, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_LocalEulerAnglesHint.z
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 7323825802519045259, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
      propertyPath: m_Name
      value: LaunchLoadingWin
      objectReference: {fileID: 0}
    m_RemovedComponents: []
    m_RemovedGameObjects: []
    m_AddedGameObjects: []
    m_AddedComponents: []
  m_SourcePrefab: {fileID: 100100000, guid: c594a46018b14f54699ec0c2cc8e60c8, type: 3}
--- !u!1 &421128700
GameObject:
  m_ObjectHideFlags: 0
@@ -564,7 +467,6 @@
  m_Component:
  - component: {fileID: 519420032}
  - component: {fileID: 519420031}
  - component: {fileID: 519420029}
  - component: {fileID: 519420033}
  m_Layer: 0
  m_Name: UICamera
@@ -573,14 +475,6 @@
  m_NavMeshLayer: 0
  m_StaticEditorFlags: 0
  m_IsActive: 1
--- !u!81 &519420029
AudioListener:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 519420028}
  m_Enabled: 1
--- !u!20 &519420031
Camera:
  m_ObjectHideFlags: 0
@@ -832,8 +726,8 @@
      addedObject: {fileID: 503479953}
    m_AddedComponents: []
  m_SourcePrefab: {fileID: 100100000, guid: 861a0f8791bb1624da118c150ad63b2b, type: 3}
--- !u!4 &1580332508 stripped
Transform:
--- !u!224 &1580332508 stripped
RectTransform:
  m_CorrespondingSourceObject: {fileID: 1807634080894636761, guid: 861a0f8791bb1624da118c150ad63b2b, type: 3}
  m_PrefabInstance: {fileID: 1494541948}
  m_PrefabAsset: {fileID: 0}
@@ -880,4 +774,3 @@
  - {fileID: 519420032}
  - {fileID: 421128702}
  - {fileID: 1494541948}
  - {fileID: 268124820}
Assets/Resources/VersionConfig.asset
New file
@@ -0,0 +1,36 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 0}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: e797e662113028e4cb1c302969102134, type: 3}
  m_Name: VersionConfig
  m_EditorClassIdentifier:
  m_AppId: test
  m_SpID: test
  m_VersionAuthority: 0
  m_Version: 1.000.0
  m_ClientPackageFlag: 2025
  m_Branch: 1
  m_AssetAccess: 3
  m_PartAssetPackage: 0
  m_ProductName: testname
  m_BundleIdentifier: com.testapk.game
  m_KeystoreFileName:
  m_KeystorePassword:
  m_KeystoreAlias:
  m_KeystoreAliasPassword:
  m_AppleDeveloperTeamID:
  m_DebugVersion: 1
  m_IsBanShu: 0
  m_BuildTime: 2025/05/22--1549
  m_BuildIndex: 6
  m_LogoPosition: {x: 0, y: 0}
  m_BanHao: 1
  m_SdkFileName:
Assets/Resources/VersionConfig.asset.meta
New file
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d4f0b8e55c9261d4a878f29de216784c
NativeFormatImporter:
  externalObjects: {}
  mainObjectFileID: 0
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Resources/VersionConfigEx.txt
@@ -1 +1 @@
{"m_AppId":"test","m_SpID":"test","m_VersionAuthority":0,"m_Version":"1.105.1","m_ClientPackageFlag":"2021","m_Branch":1,"m_AssetAccess":3,"m_PartAssetPackage":false,"m_ProductName":"Tru Tiên Quyết","m_BundleIdentifier":"com.djmxyn.gp","m_KeystoreFileName":"ald_game","m_KeystorePassword":"aldgame688","m_KeystoreAlias":"ald_alias","m_KeystoreAliasPassword":"aldgame688","m_AppleDeveloperTeamID":"","m_DebugVersion":true,"m_IsBanShu":false,"m_BuildTime":"24/03/14--20:57","m_BuildIndex":6,"m_LogoPosition":{"x":0.0,"y":144.0},"m_BanHao":"1","m_SdkFileName":""}
{"m_AppId":"test","m_SpID":"test","m_VersionAuthority":0,"m_Version":"1.000.0","m_ClientPackageFlag":"2025","m_Branch":1,"m_AssetAccess":3,"m_PartAssetPackage":false,"m_ProductName":"testname","m_BundleIdentifier":"com.testapk.game","m_KeystoreFileName":"","m_KeystorePassword":"","m_KeystoreAlias":"","m_KeystoreAliasPassword":"","m_AppleDeveloperTeamID":"","m_DebugVersion":true,"m_IsBanShu":false,"m_BuildTime":"2025/05/22--1549","m_BuildIndex":6,"m_LogoPosition":{"x":0.0,"y":0.0},"m_BanHao":"1","m_SdkFileName":""}