在软件开发的过程中,我们可能会因为某些参数需要时常变化而不得不重新打包,这不仅耗时,而且增加了出错的概率。为了解决这个问题,我将参数存储在自动生成的配置文件中。这样,当参数需要变动时,我们只需在配置文件中进行修改,无需重新编译和生成软件包。
这使得我们可以更加专注于代码的编写和功能的实现,而无需频繁进行重复的编译和打包工作。总的来说,将参数存储在自动生成的配置文件中可以提高软件开发效率、可维护性和稳定性。在出包调试过程中有时可能因为某些需要频繁变化的值而导致重新出包,这种情况会极大降低我们的开发效率。
1. 文件操作和配置路径管理
· 使用 using System.IO; 命名空间来进行文件操作。
Using System.IO常用方法及作用
· 定义了静态变量 configPath 用于存储配置文件的路径。
· 在 Awake() 方法中确保流式资产文件夹存在,并生成配置文件。
· 提供了 Reset() 方法,用于在启动时检查并创建流式资产文件夹,若不存在的话。
拓展说明:文件操作是配置管理中的基础,通过使用 System.IO 命名空间,可以方便地对配置文件进行读写。在 Awake() 方法中确保流式资产文件夹的存在,可确保配置文件的正常存放。同时,通过 Reset() 方法,可以在需要时创建所需的文件夹结构。
2. 配置文件的读取和写入
· 定义了静态属性 ReadConfig 来读取配置属性,并且定义了 set 方法来设置保存的配置对象。
· 当需要读取配置属性时,会首先检查是否已经加载了 JSON 字符串,若没有则从配置文件中读取 JSON 字符串,并将其转换为配置对象。
· 在 set 方法中,会将配置对象序列化为 JSON 字符串,并将其写入配置文件。
拓展说明:通过静态属性 ReadConfig 实现了对配置文件的读取和写入操作,使得对配置的管理变得简单和直观。通过JSON字符串和配置对象的相互转换,实现了数据的持久化存储。这种方式便于扩展和维护,也方便了对配置的修改和更新。
3. 默认配置文件的生成
· 在 SpawnConfig() 方法中,通过 JsonUtility.ToJson 方法生成默认的配置参数,并将其写入配置文件。
拓展说明:生成默认配置文件是一个很好的实践,它可以确保在项目启动时,即使没有外部配置文件,系统也能够正常运行。通过生成默认配置文件,可以规避因缺少配置文件而导致的异常情况,同时也方便了后续的配置修改。
4. 创建.bat文件
· 在 CreateInkFile() 方法中,根据条件生成或更新.bat文件内容,并将其写入文件。
· 通过使用 StreamWriter 和 File.ReadAllLines 方法来进行.bat文件的创建和更新。
拓展说明:创建.bat文件是为了在特定情况下执行一系列操作,例如在启动程序前先进行一些准备工作。这种方式可以通过批处理脚本来实现,为项目的配置和部署提供了更多的灵活性。
5. 初始化配置和设置
· 在 Init() 方法中,根据配置文件中的参数设置屏幕分辨率、全屏模式和鼠标可见性。
· 通过 Screen.SetResolution 方法设置屏幕分辨率,通过 Cursor.visible 属性设置鼠标可见性。
拓展说明:初始化配置和设置是在项目启动时非常重要的一环,它可以确保项目以正确的配置参数启动,并提供良好的用户体验。通过对屏幕分辨率、全屏模式和鼠标可见性等参数的设置,可以使得项目在不同的设备上都能够有良好的显示效果和交互体验。
通过以上分析,我们可以看到这段代码实现了一个完整的配置管理系统,包括了文件操作、配置读取和写入、默认配置生成、.bat文件的创建、以及配置的初始化和设置。这种设计方式使得项目的配置管理变得简单而健壮,同时也具有较好的可扩展性和维护性。
using System.IO;
using System.Text;
using UnityEngine;
public class CreateJsonConfig : MonoBehaviour
{
private static string configPath; // 配置文件路径
private static string jsonStr; // 保存 JSON 字符串
private static Config saveConfig; // 保存的配置对象
/// <summary>
/// 读取配置属性
/// </summary>
public static Config ReadConfig
{
get
{
if (string.IsNullOrEmpty(jsonStr))
{
if (string.IsNullOrEmpty(configPath))
configPath = Application.streamingAssetsPath + "/config.json"; // 构建配置文件路径
jsonStr = File.ReadAllText(configPath); // 读取配置文件中的 JSON 字符串
}
return saveConfig ?? (saveConfig = JsonUtility.FromJson<Config>(jsonStr)); // 将 JSON 字符串转换为配置对象
}
set
{
saveConfig = value; // 设置保存的配置对象
string json = JsonUtility.ToJson(saveConfig); // 将配置对象转换为 JSON 字符串
if (!File.Exists(configPath))
File.Create(configPath); // 如果配置文件不存在,则创建
File.WriteAllText(configPath, json); // 将 JSON 字符串写入配置文件
}
}
/// <summary>
/// 在 Reset 方法中创建流式资产文件夹(如果不存在)
/// </summary>
private void Reset()
{
if (Directory.Exists(Application.streamingAssetsPath))
return;
Directory.CreateDirectory(Application.streamingAssetsPath);
}
/// <summary>
/// 在 Awake 方法中初始化,确保流式资产文件夹存在,并生成配置文件
/// </summary>
private void Awake()
{
if (!Directory.Exists(Application.streamingAssetsPath))
Directory.CreateDirectory(Application.streamingAssetsPath); // 确保流式资产文件夹存在
configPath = Application.streamingAssetsPath + "/config.json"; // 配置文件路径
SpawnConfig(); // 生成配置文件
CreateInkFile(); // 创建 .bat 文件
Init(); // 初始化配置
}
/// <summary>
/// 初始化配置
/// </summary>
private void Init()
{
Screen.SetResolution(ReadConfig.ScreenWidth, ReadConfig.ScreenHeight, ReadConfig.FullScreen); // 设置屏幕分辨率和全屏模式
Cursor.visible = ReadConfig.ShowMouse; // 设置鼠标可见性
}
/// <summary>
/// 生成默认配置文件
/// </summary>
private void SpawnConfig()
{
string json = JsonUtility.ToJson(new Config()
{
ScreenWidth = 1920,
ScreenHeight = 1080,
FullScreen = true,
ShowMouse = true,
PortNumber = "COM3",
BaudRate = 9600,
DataBits = 8,
Parity = 0,
StopBits = 0,
});
if (!File.Exists(configPath))
File.Create(configPath).Dispose(); // 如果配置文件不存在,则创建
File.WriteAllText(configPath, json); // 将默认配置写入配置文件
}
/// <summary>
/// 创建 .bat 文件
/// </summary>
private static void CreateInkFile(bool isBuild = false, string exeParentPath = null, string exeFullName = null, string exeName = null)
{
StringBuilder stringBuilder = new StringBuilder();
string path = null;
if (isBuild)
{
if (exeParentPath != null)
{
stringBuilder.Append(exeParentPath).Append("/enter_config_directory.bat");
path = stringBuilder.ToString(); // 生成 .bat 文件路径
}
}
else
{
exeParentPath = Directory.GetParent(Application.dataPath).FullName.Replace("\\", "/");
stringBuilder.Append(exeParentPath).Append("/enter_config_directory.bat");
path = stringBuilder.ToString(); // 生成 .bat 文件路径
exeName = Application.productName;
exeFullName = exeName + ".exe";
}
if (!File.Exists(path))
{
StreamWriter streamWriter = new StreamWriter(path, false, Encoding.GetEncoding("GB2312")); // 创建 .bat 文件的流写入器
streamWriter.WriteLine("@echo Open the configuration folder"); // 写入 .bat 文件内容
streamWriter.WriteLine(SpawnPathFunction(isBuild, exeParentPath, exeFullName, exeName));
streamWriter.Close();
streamWriter.Dispose();
}
else
{
if (isBuild)
return;
string[] strArray1 = File.ReadAllLines(path);
string[] strArray2 = new string[2]
{
"@echo Open the configuration folder",
SpawnPathFunction(isBuild, exeParentPath, exeFullName, exeName)
};
if (strArray1 == strArray2)
return;
StreamWriter streamWriter = new StreamWriter(path, false, Encoding.GetEncoding("GB2312")); // 创建 .bat 文件的流写入器
streamWriter.WriteLine(strArray2[0]);
streamWriter.WriteLine(strArray2[1]);
streamWriter.Close();
streamWriter.Dispose();
}
}
/// <summary>
/// 生成 .bat 文件内容
/// </summary>
private static string SpawnPathFunction(bool isBuild, string exeParentPath, string exeFullName, string exeName)
{
StringBuilder stringBuilder1 = new StringBuilder();
StringBuilder stringBuilder2 = new StringBuilder();
if (isBuild)
stringBuilder2.Append(exeParentPath).Append("/").Append(exeName).Append("_Data/StreamingAssets");
else
stringBuilder2.Append(Application.streamingAssetsPath);
stringBuilder1.Append("if exist ").Append((object)stringBuilder2).Append(" (\r\n").Append("start ").Append((object)stringBuilder2).Append("\r\n").Append(") else (\r\n").Append("start %~dp0").Append(exeFullName).Append("\r\n)");
return stringBuilder1.ToString(); // 返回 .bat 文件内容
}
/// <summary>
/// 配置类
/// </summary>
public class Config
{
public int ScreenWidth; // 屏幕宽度
public int ScreenHeight; // 屏幕高度
public bool FullScreen; // 是否全屏
public bool ShowMouse; // 是否显示鼠标
public string PortNumber; // 端口号
public int BaudRate; // 波特率
public int DataBits; // 数据位
public int Parity; // 奇偶校验
public int StopBits; // 停止位
}
}