using System; using System.Collections.Generic; using System.IO; using UnityEngine; namespace GeneralTools { /// /// 安卓平台兼容的配置助手 /// 支持打包后动态调整配置 /// public class AndroidConfigHelper { private static string configFileName = "config.ini"; private static string persistentConfigPath; private static string streamingConfigPath; private static Dictionary> configDict; #region 串口通信配置 public static string serialPortName { get; set; } = "/dev/ttyS4"; // 安卓串口设备路径 public static int serialBaudRate { get; set; } = 115200; public static int serialDataBits { get; set; } = 8; public static int serialStopBits { get; set; } = 1; public static string serialParity { get; set; } = "None"; public static bool serialFlowControl { get; set; } = false; public static int heartbeatInterval { get; set; } = 1000; // 心跳间隔(ms) public static int communicationTimeout { get; set; } = 5000; // 通信超时(ms) public static bool autoReconnect { get; set; } = true; public static int maxReconnectAttempts { get; set; } = 5; #endregion #region 显示设置 public static int screen_width { get; set; } = 1920; public static int screen_height { get; set; } = 1080; public static bool showcursor { get; set; } = false; public static int fullscreen { get; set; } = 2; public static float brightness { get; set; } = 47.0f; #endregion #region 音频设置 public static bool isAllowPlayBGM { get; set; } = true; public static int audioShotLimit { get; set; } = 5; public static int volume { get; set; } = 26; public static int muteDurationMinutes { get; set; } = 4; #endregion #region 系统设置 public static int logType { get; set; } = 0; public static bool saveLog { get; set; } = true; public static bool broadcastDebug { get; set; } = false; public static int targetFramerate { get; set; } = 60; public static bool autoBackup { get; set; } = true; public static int dataRetentionDays { get; set; } = 30; #endregion /// /// 初始化配置系统(安卓兼容版本) /// public static void Init() { // 安卓平台路径设置 streamingConfigPath = Path.Combine(Application.streamingAssetsPath, configFileName); persistentConfigPath = Path.Combine(Application.persistentDataPath, configFileName); Debug.Log($"StreamingAssets配置路径: {streamingConfigPath}"); Debug.Log($"可写配置路径: {persistentConfigPath}"); LoadConfiguration(); } /// /// 加载配置(优先从可写目录加载) /// private static void LoadConfiguration() { configDict = new Dictionary>(); string configToLoad = persistentConfigPath; // 如果可写目录没有配置文件,从StreamingAssets复制默认配置 if (!File.Exists(persistentConfigPath)) { CopyDefaultConfigToPersistent(); } if (File.Exists(configToLoad)) { LoadFromIniFile(configToLoad); ApplyConfigurationToProperties(); } else { Debug.LogWarning("配置文件不存在,使用默认值"); SaveConfiguration(); // 创建默认配置文件 } } /// /// 从StreamingAssets复制默认配置到可写目录 /// private static void CopyDefaultConfigToPersistent() { try { #if UNITY_ANDROID && !UNITY_EDITOR // 安卓平台需要通过WWW或UnityWebRequest读取StreamingAssets var www = new WWW(streamingConfigPath); while (!www.isDone) { } if (string.IsNullOrEmpty(www.error)) { File.WriteAllText(persistentConfigPath, www.text); Debug.Log("默认配置已复制到可写目录"); } else { Debug.LogError($"复制默认配置失败: {www.error}"); } #else // 编辑器或其他平台直接复制 if (File.Exists(streamingConfigPath)) { File.Copy(streamingConfigPath, persistentConfigPath, true); Debug.Log("默认配置已复制到可写目录"); } #endif } catch (Exception e) { Debug.LogError($"复制配置文件失败: {e.Message}"); } } /// /// 从INI文件加载配置 /// private static void LoadFromIniFile(string filePath) { try { string[] lines = File.ReadAllLines(filePath); string currentSection = "config"; foreach (string line in lines) { string trimmedLine = line.Trim(); // 跳过注释和空行 if (string.IsNullOrEmpty(trimmedLine) || trimmedLine.StartsWith(";")) continue; // 处理节 if (trimmedLine.StartsWith("[") && trimmedLine.EndsWith("]")) { currentSection = trimmedLine.Substring(1, trimmedLine.Length - 2); if (!configDict.ContainsKey(currentSection)) { configDict[currentSection] = new Dictionary(); } continue; } // 处理键值对 int equalIndex = trimmedLine.IndexOf('='); if (equalIndex > 0) { string key = trimmedLine.Substring(0, equalIndex).Trim(); string value = trimmedLine.Substring(equalIndex + 1).Trim(); if (!configDict.ContainsKey(currentSection)) { configDict[currentSection] = new Dictionary(); } configDict[currentSection][key] = value; } } Debug.Log($"配置加载完成,共{configDict.Count}个节"); } catch (Exception e) { Debug.LogError($"加载配置文件失败: {e.Message}"); } } /// /// 将配置字典应用到属性 /// private static void ApplyConfigurationToProperties() { // 串口配置 serialPortName = GetConfig("serialPortName", "SerialPort", serialPortName); serialBaudRate = GetConfig("serialBaudRate", "SerialPort", serialBaudRate); serialDataBits = GetConfig("serialDataBits", "SerialPort", serialDataBits); serialStopBits = GetConfig("serialStopBits", "SerialPort", serialStopBits); serialParity = GetConfig("serialParity", "SerialPort", serialParity); serialFlowControl = GetConfig("serialFlowControl", "SerialPort", serialFlowControl); heartbeatInterval = GetConfig("heartbeatInterval", "SerialPort", heartbeatInterval); communicationTimeout = GetConfig("communicationTimeout", "SerialPort", communicationTimeout); autoReconnect = GetConfig("autoReconnect", "SerialPort", autoReconnect); maxReconnectAttempts = GetConfig("maxReconnectAttempts", "SerialPort", maxReconnectAttempts); // 显示配置 screen_width = GetConfig("screen_width", "config", screen_width); screen_height = GetConfig("screen_height", "config", screen_height); showcursor = GetConfig("showcursor", "config", showcursor); fullscreen = GetConfig("fullscreen", "config", fullscreen); brightness = GetConfig("brightness", "Display", brightness); // 音频配置 isAllowPlayBGM = GetConfig("isAllowPlayBGM", "config", isAllowPlayBGM); audioShotLimit = GetConfig("audioShotLimit", "config", audioShotLimit); volume = GetConfig("volume", "Audio", volume); muteDurationMinutes = GetConfig("muteDurationMinutes", "Audio", muteDurationMinutes); // 系统配置 logType = GetConfig("logType", "config", logType); saveLog = GetConfig("saveLog", "config", saveLog); broadcastDebug = GetConfig("broadcastDebug", "config", broadcastDebug); targetFramerate = GetConfig("targetFramerate", "config", targetFramerate); autoBackup = GetConfig("autoBackup", "System", autoBackup); dataRetentionDays = GetConfig("dataRetentionDays", "System", dataRetentionDays); } /// /// 获取配置值 /// public static T GetConfig(string configName, string section = "config", T defaultValue = default(T)) where T : IComparable { try { if (configDict != null && configDict.ContainsKey(section) && configDict[section].ContainsKey(configName)) { object value = configDict[section][configName]; return (T)Convert.ChangeType(value, typeof(T)); } } catch (Exception e) { Debug.LogWarning($"获取配置 {section}.{configName} 失败: {e.Message}"); } return defaultValue; } /// /// 设置配置值并保存(支持运行时修改) /// public static void SetConfig(string configName, T value, string section = "config") where T : IComparable { if (configDict == null) { configDict = new Dictionary>(); } if (!configDict.ContainsKey(section)) { configDict[section] = new Dictionary(); } configDict[section][configName] = value; // 立即保存到文件 SaveConfiguration(); Debug.Log($"配置已更新: {section}.{configName} = {value}"); } /// /// 保存配置到可写目录 /// public static void SaveConfiguration() { try { List lines = new List(); foreach (var section in configDict) { lines.Add($"[{section.Key}]"); lines.Add(""); foreach (var kvp in section.Value) { lines.Add($"{kvp.Key}={kvp.Value}"); } lines.Add(""); } File.WriteAllLines(persistentConfigPath, lines.ToArray()); Debug.Log($"配置已保存到: {persistentConfigPath}"); } catch (Exception e) { Debug.LogError($"保存配置失败: {e.Message}"); } } /// /// 重新加载配置 /// public static void ReloadConfiguration() { LoadConfiguration(); Debug.Log("配置已重新加载"); } /// /// 获取配置文件路径(用于外部编辑) /// public static string GetConfigFilePath() { return persistentConfigPath; } /// /// 重置为默认配置 /// public static void ResetToDefault() { if (File.Exists(persistentConfigPath)) { File.Delete(persistentConfigPath); } CopyDefaultConfigToPersistent(); LoadConfiguration(); Debug.Log("配置已重置为默认值"); } } }