三国卡牌客户端基础资源仓库
yyl
2025-05-13 e30e257ab8fcec3161337db973d0d1e6f2ce702e
update
1个文件已删除
6个文件已修改
6个文件已添加
27318 ■■■■■ 已修改文件
Assets/Editor/Backups.meta 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/ConfigGen/ConfigClassGenerate.cs 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/ConfigGen/ConfigDataTemplate.txt 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/ConfigGen/ConfigGenerater.cs 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/UI/UIUtility.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Common/LogicEngine.cs 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Common/LogicEngine.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Common/LogicUpdate.cs 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Common/LogicUpdate.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Launch.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Utility/StringUtility.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Utility/StringUtility.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Resources/Scenes/Launch.unity 26818 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Backups.meta
File was deleted
Assets/Editor/ConfigGen/ConfigClassGenerate.cs
@@ -95,75 +95,75 @@
        field = field.Replace(" ", "");
        if (type.Contains("int[][]"))
        {
            return StringUtility.Contact("public readonly int[][] ", field.Trim(), ";");
            return StringUtility.Contact("public int[][] ", field.Trim(), ";");
        }
        else if (type.Contains("Dictionary<int, int>"))
        {
            return StringUtility.Contact("public readonly Dictionary<int, int> ", field.Trim(), ";");
            return StringUtility.Contact("public Dictionary<int, int> ", field.Trim(), ";");
        }
        else if (type.Contains("Dictionary<int, int[]>"))
        {
            return StringUtility.Contact("public readonly Dictionary<int, int[]> ", field.Trim(), ";");
            return StringUtility.Contact("public Dictionary<int, int[]> ", field.Trim(), ";");
        }
        else if (type.Contains("float[][]"))
        {
            return StringUtility.Contact("public readonly float[][] ", field.Trim(), ";");
            return StringUtility.Contact("public float[][] ", field.Trim(), ";");
        }
        else if (type.Contains("int[]"))
        {
            return StringUtility.Contact("public readonly int[] ", field.Trim(), ";");
            return StringUtility.Contact("public int[] ", field.Trim(), ";");
        }
        else if (type.Contains("Int2[]"))
        {
            return StringUtility.Contact("public readonly Int2[] ", field.Trim(), ";");
            return StringUtility.Contact("public Int2[] ", field.Trim(), ";");
        }
        else if (type.Contains("Int3[]"))
        {
            return StringUtility.Contact("public readonly Int3[] ", field.Trim(), ";");
            return StringUtility.Contact("public Int3[] ", field.Trim(), ";");
        }
        else if (type.Contains("float[]"))
        {
            return StringUtility.Contact("public readonly float[] ", field.Trim(), ";");
            return StringUtility.Contact("public float[] ", field.Trim(), ";");
        }
        else if (type.Contains("string[]"))
        {
            return StringUtility.Contact("public readonly string[] ", field.Trim(), ";");
            return StringUtility.Contact("public string[] ", field.Trim(), ";");
        }
        else if (type.Contains("Vector3[]"))
        {
            return StringUtility.Contact("public readonly Vector3[] ", field.Trim(), ";");
            return StringUtility.Contact("public Vector3[] ", field.Trim(), ";");
        }
        else if (type.Contains("int"))
        {
            return StringUtility.Contact("public readonly int ", field.Trim(), ";");
            return StringUtility.Contact("public int ", field.Trim(), ";");
        }
        else if (type.Contains("long"))
        {
            return StringUtility.Contact("public readonly long ", field.Trim(), ";");
            return StringUtility.Contact("public long ", field.Trim(), ";");
        }
        else if (type.Contains("float"))
        {
            return StringUtility.Contact("public readonly float ", field.Trim(), ";");
            return StringUtility.Contact("public float ", field.Trim(), ";");
        }
        else if (type.Contains("string"))
        {
            return StringUtility.Contact("public readonly string ", field, ";");
            return StringUtility.Contact("public string ", field, ";");
        }
        else if (type.Contains("Vector3"))
        {
            return StringUtility.Contact("public readonly Vector3 ", field.Trim(), ";");
            return StringUtility.Contact("public Vector3 ", field.Trim(), ";");
        }
        else if (type.Contains("bool"))
        {
            return StringUtility.Contact("public readonly bool ", field.Trim(), ";");
            return StringUtility.Contact("public bool ", field.Trim(), ";");
        }
        else if (type.Contains("Int2"))
        {
            return StringUtility.Contact("public readonly Int2 ", field.Trim(), ";");
            return StringUtility.Contact("public Int2 ", field.Trim(), ";");
        }
        else if (type.Contains("Int3"))
        {
            return StringUtility.Contact("public readonly Int3 ", field.Trim(), ";");
            return StringUtility.Contact("public Int3 ", field.Trim(), ";");
        }
        else
        {
@@ -195,11 +195,11 @@
        }
        // else if (type.Contains("Int2[]"))
        // {
        //     return StringUtility.Contact("public readonly Int2[] ", field.Trim(), ";");
        //     return StringUtility.Contact("public Int2[] ", field.Trim(), ";");
        // }
        // else if (type.Contains("Int3[]"))
        // {
        //     return StringUtility.Contact("public readonly Int3[] ", field.Trim(), ";");
        //     return StringUtility.Contact("public Int3[] ", field.Trim(), ";");
        // }
        else if (type.Contains("float[]"))
        {
@@ -239,11 +239,11 @@
        }
        // else if (type.Contains("Int2"))
        // {
        //     return StringUtility.Contact("public readonly Int2 ", field.Trim(), ";");
        //     return StringUtility.Contact("public Int2 ", field.Trim(), ";");
        // }
        // else if (type.Contains("Int3"))
        // {
        //     return StringUtility.Contact("public readonly Int3 ", field.Trim(), ";");
        //     return StringUtility.Contact("public Int3 ", field.Trim(), ";");
        // }
        else
        {
@@ -257,75 +257,75 @@
        field = field.Replace(" ", "");
        if (type.Contains("int[][]"))
        {
            return StringUtility.Contact("public readonly int[][] ", field.Trim(), ";");
            return StringUtility.Contact("public int[][] ", field.Trim(), ";");
        }
        else if (type.Contains("Dictionary<int, int>"))
        {
            return StringUtility.Contact("public readonly Dictionary<int, int> ", field.Trim(), ";");
            return StringUtility.Contact("public Dictionary<int, int> ", field.Trim(), ";");
        }
        else if (type.Contains("Dictionary<int, int[]>"))
        {
            return StringUtility.Contact("public readonly Dictionary<int, int[]> ", field.Trim(), ";");
            return StringUtility.Contact("public Dictionary<int, int[]> ", field.Trim(), ";");
        }
        else if (type.Contains("float[][]"))
        {
            return StringUtility.Contact("public readonly float[][] ", field.Trim(), ";");
            return StringUtility.Contact("public float[][] ", field.Trim(), ";");
        }
        else if (type.Contains("int[]"))
        {
            return StringUtility.Contact("public readonly int[] ", field.Trim(), ";");
            return StringUtility.Contact("public int[] ", field.Trim(), ";");
        }
        else if (type.Contains("Int2[]"))
        {
            return StringUtility.Contact("public readonly Int2[] ", field.Trim(), ";");
            return StringUtility.Contact("public Int2[] ", field.Trim(), ";");
        }
        else if (type.Contains("Int3[]"))
        {
            return StringUtility.Contact("public readonly Int3[] ", field.Trim(), ";");
            return StringUtility.Contact("public Int3[] ", field.Trim(), ";");
        }
        else if (type.Contains("float[]"))
        {
            return StringUtility.Contact("public readonly float[] ", field.Trim(), ";");
            return StringUtility.Contact("public float[] ", field.Trim(), ";");
        }
        else if (type.Contains("string[]"))
        {
            return StringUtility.Contact("public readonly string[] ", field.Trim(), ";");
            return StringUtility.Contact("public string[] ", field.Trim(), ";");
        }
        else if (type.Contains("Vector3[]"))
        {
            return StringUtility.Contact("public readonly Vector3[] ", field.Trim(), ";");
            return StringUtility.Contact("public Vector3[] ", field.Trim(), ";");
        }
        else if (type.Contains("int"))
        {
            return StringUtility.Contact("public readonly int ", field.Trim(), ";");
            return StringUtility.Contact("public int ", field.Trim(), ";");
        }
        else if (type.Contains("long"))
        {
            return StringUtility.Contact("public readonly long ", field.Trim(), ";");
            return StringUtility.Contact("public long ", field.Trim(), ";");
        }
        else if (type.Contains("float"))
        {
            return StringUtility.Contact("public readonly float ", field.Trim(), ";");
            return StringUtility.Contact("public float ", field.Trim(), ";");
        }
        else if (type.Contains("string"))
        {
            return StringUtility.Contact("public readonly string ", field, ";");
            return StringUtility.Contact("public string ", field, ";");
        }
        else if (type.Contains("Vector3"))
        {
            return StringUtility.Contact("public readonly Vector3 ", field.Trim(), ";");
            return StringUtility.Contact("public Vector3 ", field.Trim(), ";");
        }
        else if (type.Contains("bool"))
        {
            return StringUtility.Contact("public readonly bool ", field.Trim(), ";");
            return StringUtility.Contact("public bool ", field.Trim(), ";");
        }
        else if (type.Contains("Int2"))
        {
            return StringUtility.Contact("public readonly Int2 ", field.Trim(), ";");
            return StringUtility.Contact("public Int2 ", field.Trim(), ";");
        }
        else if (type.Contains("Int3"))
        {
            return StringUtility.Contact("public readonly Int3 ", field.Trim(), ";");
            return StringUtility.Contact("public Int3 ", field.Trim(), ";");
        }
        else
        {
@@ -492,7 +492,7 @@
        text = Regex.Replace(text, "#Field#", CreateConfigClassFile.filedContent);
        text = Regex.Replace(text, "#Read#", CreateConfigClassFile.readContent);
        text = Regex.Replace(text, "#FileName#", fileNameWithoutExtension.Substring(0, fileNameWithoutExtension.Length - 6));
        text = Regex.Replace(text, "#Key#", _idType);
        text = Regex.Replace(text, "#KEY#", _idType);
        bool encoderShouldEmitUTF8Identifier = true;
        bool throwOnInvalidBytes = false;
Assets/Editor/ConfigGen/ConfigDataTemplate.txt
@@ -23,6 +23,7 @@
    public override void LoadConfig(string input)
    {
        string[] tables = input.Split('\t');
        #Read#
    }
}
Assets/Editor/ConfigGen/ConfigGenerater.cs
@@ -3,7 +3,6 @@
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEngine;
@@ -15,11 +14,6 @@
    // 常量定义
    private const string ConfigsPath = "Assets/Scripts/Main/Config/Configs";
    private const string ConfigManagerPath = "Assets/Scripts/Main/Manager/ConfigManager.cs";
    private const string ConfigBasePattern = @"public\s+class\s+(\w+)\s*:\s*ConfigBase\s*<";
    // 正则表达式模式 - 更新以匹配新的ConfigManager结构
    private static readonly Regex LoadConfigsRegex = new Regex(@"protected\s+async\s+UniTask\s+LoadConfigs\(\)\s*\{[^\}]*\}", RegexOptions.Compiled | RegexOptions.Singleline);
    private static readonly Regex ReleaseRegex = new Regex(@"public\s+override\s+void\s+Release\(\)\s*\{[^\}]*\}", RegexOptions.Compiled | RegexOptions.Singleline);
    
    /// <summary>
    /// 生成配置管理器菜单项
@@ -31,12 +25,6 @@
        {
            // 获取所有配置类
            List<string> configClasses = GetAllConfigClasses();
            // if (configClasses.Count == 0)
            // {
            //     Debug.LogWarning("未找到任何配置类!请确保配置类继承自ConfigBase<T>并位于正确的目录中。");
            //     return;
            // }
            
            // 生成配置管理器代码
            GenerateConfigManager(configClasses);
@@ -70,18 +58,18 @@
        
        try
        {
            // 获取所有C#文件并解析配置类
            return Directory.GetFiles(fullConfigsPath, "*.cs", SearchOption.TopDirectoryOnly)
                .Select(file => new {
                    Path = file,
                    Content = File.ReadAllText(file)
                })
                .Select(file => {
                    Match match = Regex.Match(file.Content, ConfigBasePattern);
                    return match.Success ? match.Groups[1].Value : null;
                })
                .Where(className => !string.IsNullOrEmpty(className))
                .ToList();
            List<string> configClasses = new List<string>();
            // 获取所有C#文件
            string[] files = Directory.GetFiles(fullConfigsPath, "*.cs", SearchOption.TopDirectoryOnly);
            for (int i = 0; i < files.Length; i++)
            {
                string file = files[i];
                configClasses.Add(Path.GetFileNameWithoutExtension(file));
            }
            return configClasses;
        }
        catch (Exception ex)
        {
@@ -99,47 +87,70 @@
        // 获取配置管理器的完整路径
        string fullConfigManagerPath = Path.Combine(Application.dataPath, ConfigManagerPath.Replace("Assets/", ""));
        
        // 检查文件是否存在
        if (!File.Exists(fullConfigManagerPath))
        {
            Debug.LogError($"配置管理器文件不存在: {fullConfigManagerPath}");
            return;
        }
        try
        {
            // 读取原始文件内容
            string originalContent = File.ReadAllText(fullConfigManagerPath);
            // 生成新方法内容
            string loadConfigsMethod = GenerateLoadConfigsMethod(configClasses);
            string releaseMethod = GenerateReleaseMethod(configClasses);
            // 替换方法
            string newContent = LoadConfigsRegex.Replace(originalContent, loadConfigsMethod);
            newContent = ReleaseRegex.Replace(newContent, releaseMethod);
            // 生成完整的配置管理器代码
            string configManagerCode = GenerateFullConfigManagerCode(configClasses);
            
            // 写入文件
            File.WriteAllText(fullConfigManagerPath, newContent);
            File.WriteAllText(fullConfigManagerPath, configManagerCode);
            
            Debug.Log($"成功更新配置管理器: {fullConfigManagerPath}");
            Debug.Log($"成功生成配置管理器: {fullConfigManagerPath}");
        }
        catch (Exception ex)
        {
            Debug.LogError($"更新配置管理器文件时发生错误: {ex.Message}");
            Debug.LogError($"生成配置管理器文件时发生错误: {ex.Message}");
        }
    }
    
    /// <summary>
    /// 生成LoadConfigs方法
    /// 生成完整的配置管理器代码
    /// </summary>
    /// <param name="configClasses">配置类列表</param>
    /// <returns>生成的方法代码</returns>
    private static string GenerateLoadConfigsMethod(List<string> configClasses)
    /// <returns>完整的配置管理器代码</returns>
    private static string GenerateFullConfigManagerCode(List<string> configClasses)
    {
        StringBuilder sb = new StringBuilder();
        
        sb.AppendLine("protected async UniTask LoadConfigs()");
        // 添加命名空间引用
        sb.AppendLine("using System;");
        sb.AppendLine("using System.Collections.Generic;");
        sb.AppendLine("using UnityEngine;");
        sb.AppendLine("using Cysharp.Threading.Tasks;");
        sb.AppendLine("using System.Reflection;");
        sb.AppendLine();
        sb.AppendLine();
        sb.AppendLine("public class ConfigManager : ManagerBase<ConfigManager>");
        sb.AppendLine("{");
        // 添加属性和字段
        sb.AppendLine("    public bool isLoadFinished");
        sb.AppendLine("    {");
        sb.AppendLine("        get;");
        sb.AppendLine("        private set;");
        sb.AppendLine("    }");
        sb.AppendLine();
        sb.AppendLine("    private float loadingProgress = 0f;");
        sb.AppendLine();
        // 添加初始化方法
        sb.AppendLine("    public override void Init()");
        sb.AppendLine("    {");
        sb.AppendLine("        base.Init();");
        sb.AppendLine("        InitConfigs();");
        sb.AppendLine("    }");
        sb.AppendLine();
        // 添加配置初始化方法
        sb.AppendLine("    public virtual async UniTask InitConfigs()");
        sb.AppendLine("    {");
        sb.AppendLine("        // 加载配置文件");
        sb.AppendLine("        await LoadConfigs();");
        sb.AppendLine("    }");
        sb.AppendLine();
        // 添加LoadConfigs方法
        sb.AppendLine("    protected async UniTask LoadConfigs()");
        sb.AppendLine("    {");
        sb.AppendLine("        loadingProgress = 0f;");
        sb.AppendLine("        isLoadFinished = false;");
@@ -151,7 +162,7 @@
        {
            sb.AppendLine($"        int totalConfigs = {configClasses.Count};");
            
            // 方法1:使用数组和循环加载配置
            // 使用数组和循环加载配置
            sb.AppendLine("        Type[] configTypes = new Type[] {");
            for (int i = 0; i < configClasses.Count; i++)
            {
@@ -167,15 +178,19 @@
            sb.AppendLine("            loadingProgress = (float)(i + 1) / totalConfigs;");
            sb.AppendLine("        }");
        }
        else
        {
            Debug.LogError("没有找到配置类 : " + configClasses.Count);
        }
        
        sb.AppendLine();
        sb.AppendLine("        // 加载完成后设置isLoadFinished为true");
        sb.AppendLine("        loadingProgress = 1f;");
        sb.AppendLine("        isLoadFinished = true;");
        sb.AppendLine("    }");
        sb.AppendLine();
        
        // 添加LoadConfigByType方法
        sb.AppendLine();
        sb.AppendLine("    private async UniTask LoadConfigByType(Type configType)");
        sb.AppendLine("    {");
        sb.AppendLine("        string configName = configType.Name;");
@@ -205,20 +220,62 @@
        sb.AppendLine("            Debug.LogError($\"找不到配置文件: {configName}\");");
        sb.AppendLine("        }");
        sb.AppendLine("    }");
        sb.AppendLine();
        
        return sb.ToString();
    }
    /// <summary>
    /// 生成Release方法
    /// </summary>
    /// <param name="configClasses">配置类列表</param>
    /// <returns>生成的方法代码</returns>
    private static string GenerateReleaseMethod(List<string> configClasses)
    {
        StringBuilder sb = new StringBuilder();
        // 添加泛型LoadConfig方法
        sb.AppendLine("    private async UniTask LoadConfig<T>() where T : class");
        sb.AppendLine("    {");
        sb.AppendLine("        string configName = typeof(T).Name;");
        sb.AppendLine();
        sb.AppendLine("        TextAsset textAsset = await ResManager.Instance.LoadAsset<TextAsset>(\"Config\", configName);");
        sb.AppendLine("        if (textAsset != null)");
        sb.AppendLine("        {");
        sb.AppendLine("            string[] lines = textAsset.text.Split('\\n');");
        sb.AppendLine("            var methodInfo = typeof(T).GetMethod(\"Init\", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);");
        sb.AppendLine("            if (methodInfo != null)");
        sb.AppendLine("            {");
        sb.AppendLine("                methodInfo.Invoke(null, new object[] { lines });");
        sb.AppendLine("                // 设置初始化标志");
        sb.AppendLine("                var isInitField = typeof(T).GetField(\"isInit\", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);");
        sb.AppendLine("                if (isInitField != null)");
        sb.AppendLine("                {");
        sb.AppendLine("                    isInitField.SetValue(null, true);");
        sb.AppendLine("                }");
        sb.AppendLine("                Debug.Log($\"加载配置: {typeof(T).Name} 成功\");");
        sb.AppendLine("            }");
        sb.AppendLine("            else");
        sb.AppendLine("            {");
        sb.AppendLine("                Debug.LogError($\"配置类 {typeof(T).Name} 没有静态Init方法\");");
        sb.AppendLine("            }");
        sb.AppendLine("        }");
        sb.AppendLine("        else");
        sb.AppendLine("        {");
        sb.AppendLine("            Debug.LogError($\"找不到配置文件: {configName}\");");
        sb.AppendLine("        }");
        sb.AppendLine("    }");
        sb.AppendLine();
        
        sb.AppendLine("public override void Release()");
        // 添加GetLoadingProgress方法
        sb.AppendLine("    public float GetLoadingProgress()");
        sb.AppendLine("    {");
        sb.AppendLine("        return loadingProgress;");
        sb.AppendLine("    }");
        sb.AppendLine();
        // 添加ClearConfigDictionary方法
        sb.AppendLine("    private void ClearConfigDictionary<T>() where T : class");
        sb.AppendLine("    {");
        sb.AppendLine("        // 重置 T 初始化状态");
        sb.AppendLine("        var isInitField = typeof(T).GetField(\"isInit\", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);");
        sb.AppendLine("        if (isInitField != null)");
        sb.AppendLine("        {");
        sb.AppendLine("            isInitField.SetValue(null, false);");
        sb.AppendLine("        }");
        sb.AppendLine("    }");
        sb.AppendLine();
        // 添加Release方法
        sb.AppendLine("    public override void Release()");
        sb.AppendLine("    {");
        
        if (configClasses.Count > 0)
@@ -237,6 +294,9 @@
        
        sb.AppendLine("    }");
        
        // 结束类定义
        sb.AppendLine("}");
        return sb.ToString();
    }
}
Assets/Editor/UI/UIUtility.cs
@@ -20,4 +20,31 @@
        // go.AddMissingComponent<Canvas>();
        // go.AddMissingComponent<Canvas>();
    }
    [UnityEditor.MenuItem("Assets/新UI处理")]
    public static void NewUIHandle()
    {
        GameObject go = Selection.activeGameObject;
        if (go == null)
        {
            return;
        }
        if (!go.name.EndsWith("Win"))
        {
            Debug.LogError("请选择正确的UI UI应该以Win结尾");
            return;
        }
        go.AddMissingComponent<Canvas>();
        go.AddMissingComponent<CanvasGroup>();
        go.AddMissingComponent<CanvasScaler>();
        var graphics = go.GetComponentsInChildren<Graphic>(true);
        foreach (Graphic g in graphics)
        {
            g.raycastTarget = false;
        }
    }
}
Assets/Launch/Common/LogicEngine.cs
New file
@@ -0,0 +1,53 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace StartAot
{
    public class LogicEngine : SingletonMonobehaviour<LogicEngine>
    {
        List<LogicUpdate> logicUpdates = new List<LogicUpdate>();
        public void Register(LogicUpdate logicUpdate)
        {
            if (!logicUpdates.Contains(logicUpdate))
            {
                logicUpdates.Add(logicUpdate);
            }
        }
        public void UnRegister(LogicUpdate logicUpdate)
        {
            if (logicUpdates.Contains(logicUpdate))
            {
                logicUpdates.Remove(logicUpdate);
            }
        }
        void Update()
        {
            for (var i = logicUpdates.Count - 1; i >= 0; i--)
            {
                var item = logicUpdates[i];
                if (item.destroyDirty)
                {
                    logicUpdates.RemoveAt(i);
                }
                else
                {
                    try
                    {
                        item.Update();
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogError(ex);
                    }
                }
            }
        }
    }
}
Assets/Launch/Common/LogicEngine.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 86e2366d8d1858d43859f16e5cc963ca
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Launch/Common/LogicUpdate.cs
New file
@@ -0,0 +1,60 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading;
using System;
namespace StartAot
{
    public class LogicUpdate
    {
        public readonly float stepInterval = 0.033333f;
        public bool destroyDirty { get; private set; }
        float nextUpdateTime = 0f;
        Action update;
        public LogicUpdate(float stepInterval = 0.033333f)
        {
            this.stepInterval = Mathf.Clamp(stepInterval, 0.033333f, float.MaxValue);
        }
        public void Start(Action updateCallBack)
        {
            this.destroyDirty = false;
            this.update = updateCallBack;
            LogicEngine.Instance.Register(this);
        }
        public void Destroy()
        {
            this.update = null;
            if (!this.destroyDirty)
            {
                this.destroyDirty = true;
                OnDestroy();
            }
        }
        public virtual void OnDestroy()
        {
        }
        public void Update()
        {
            if (Time.time >= nextUpdateTime)
            {
                nextUpdateTime = Time.time + stepInterval;
                if (update != null)
                {
                    this.update();
                }
            }
        }
    }
}
Assets/Launch/Common/LogicUpdate.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e04deb398d00fca448e0e95b1f2624c2
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Launch/Launch.cs
@@ -19,6 +19,11 @@
    public bool IsUseAssetBundle = false;
#if UNITY_EDITOR
    public bool EnableNetLog = true;
#else
    public bool EnableNetLog = false;
#endif
    // 状态机
    private LaunchStateMachine stateMachine;
Assets/Launch/Utility/StringUtility.cs
New file
@@ -0,0 +1,46 @@
using UnityEngine;
using System.Collections;
using System.Text;
public class StringUtility
{
    public static string[] splitSeparator = new string[] { "|" };
    private static StringBuilder s_CacheStringBuilder = new StringBuilder();
    static object lockObject = new object();
    public static string Contact(params object[] _objects)
    {
        lock (lockObject)
        {
            s_CacheStringBuilder.Remove(0, s_CacheStringBuilder.Length);
            for (int i = 0; i < _objects.Length; ++i)
            {
                if (_objects[i] != null)
                {
                    s_CacheStringBuilder.Append(_objects[i]);
                }
            }
            return s_CacheStringBuilder.ToString();
        }
    }
    public static string FormatSpeed(float speed)
    {
        if (speed > 1048576f)
        {
            return StringUtility.Contact((speed / 1048576f).ToString("f1"), " M/S");
        }
        else if (speed > 1024f)
        {
            return StringUtility.Contact((speed / 1024f).ToString("f1"), " KB/S");
        }
        else
        {
            return StringUtility.Contact(speed.ToString("f1"), " B/S");
        };
    }
}
Assets/Launch/Utility/StringUtility.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: c0960ed66238bdd49b70860dfee23488
timeCreated: 1475005527
licenseType: Free
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Resources/Scenes/Launch.unity
Diff too large