DCS/ruiyiweiUX/Assets/Scripts/Components/AndroidConfigHelper.cs

335 lines
13 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
namespace GeneralTools
{
/// <summary>
/// 安卓平台兼容的配置助手
/// 支持打包后动态调整配置
/// </summary>
public class AndroidConfigHelper
{
private static string configFileName = "config.ini";
private static string persistentConfigPath;
private static string streamingConfigPath;
private static Dictionary<string, Dictionary<string, object>> 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
/// <summary>
/// 初始化配置系统(安卓兼容版本)
/// </summary>
public static void Init()
{
// 安卓平台路径设置
streamingConfigPath = Path.Combine(Application.streamingAssetsPath, configFileName);
persistentConfigPath = Path.Combine(Application.persistentDataPath, configFileName);
Debug.Log($"StreamingAssets配置路径: {streamingConfigPath}");
Debug.Log($"可写配置路径: {persistentConfigPath}");
LoadConfiguration();
}
/// <summary>
/// 加载配置(优先从可写目录加载)
/// </summary>
private static void LoadConfiguration()
{
configDict = new Dictionary<string, Dictionary<string, object>>();
string configToLoad = persistentConfigPath;
// 如果可写目录没有配置文件从StreamingAssets复制默认配置
if (!File.Exists(persistentConfigPath))
{
CopyDefaultConfigToPersistent();
}
if (File.Exists(configToLoad))
{
LoadFromIniFile(configToLoad);
ApplyConfigurationToProperties();
}
else
{
Debug.LogWarning("配置文件不存在,使用默认值");
SaveConfiguration(); // 创建默认配置文件
}
}
/// <summary>
/// 从StreamingAssets复制默认配置到可写目录
/// </summary>
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}");
}
}
/// <summary>
/// 从INI文件加载配置
/// </summary>
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<string, object>();
}
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<string, object>();
}
configDict[currentSection][key] = value;
}
}
Debug.Log($"配置加载完成,共{configDict.Count}个节");
}
catch (Exception e)
{
Debug.LogError($"加载配置文件失败: {e.Message}");
}
}
/// <summary>
/// 将配置字典应用到属性
/// </summary>
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);
}
/// <summary>
/// 获取配置值
/// </summary>
public static T GetConfig<T>(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;
}
/// <summary>
/// 设置配置值并保存(支持运行时修改)
/// </summary>
public static void SetConfig<T>(string configName, T value, string section = "config") where T : IComparable
{
if (configDict == null)
{
configDict = new Dictionary<string, Dictionary<string, object>>();
}
if (!configDict.ContainsKey(section))
{
configDict[section] = new Dictionary<string, object>();
}
configDict[section][configName] = value;
// 立即保存到文件
SaveConfiguration();
Debug.Log($"配置已更新: {section}.{configName} = {value}");
}
/// <summary>
/// 保存配置到可写目录
/// </summary>
public static void SaveConfiguration()
{
try
{
List<string> lines = new List<string>();
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}");
}
}
/// <summary>
/// 重新加载配置
/// </summary>
public static void ReloadConfiguration()
{
LoadConfiguration();
Debug.Log("配置已重新加载");
}
/// <summary>
/// 获取配置文件路径(用于外部编辑)
/// </summary>
public static string GetConfigFilePath()
{
return persistentConfigPath;
}
/// <summary>
/// 重置为默认配置
/// </summary>
public static void ResetToDefault()
{
if (File.Exists(persistentConfigPath))
{
File.Delete(persistentConfigPath);
}
CopyDefaultConfigToPersistent();
LoadConfiguration();
Debug.Log("配置已重置为默认值");
}
}
}