Assets/Editor/Backups.meta | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Assets/Editor/ConfigGen/ConfigClassGenerate.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Assets/Editor/ConfigGen/ConfigDataTemplate.txt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Assets/Editor/ConfigGen/ConfigGenerater.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Assets/Editor/UI/UIUtility.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Assets/Launch/Common/LogicEngine.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Assets/Launch/Common/LogicEngine.cs.meta | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Assets/Launch/Common/LogicUpdate.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Assets/Launch/Common/LogicUpdate.cs.meta | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Assets/Launch/Launch.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Assets/Launch/Utility/StringUtility.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Assets/Launch/Utility/StringUtility.cs.meta | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Assets/Resources/Scenes/Launch.unity | ●●●●● 补丁 | 查看 | 原始文档 | 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