Unity 使用INI文件存储数据或配置参数预设

法1:调用外部C++api库

具体使用:

复制代码
public class Ini{

    //读取INI文件需要调用C++的APP
    
    [System.Runtime.InteropServices.DllImport("kernel32")]
    private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
    [System.Runtime.InteropServices.DllImport("kernel32")]
    private static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath);
        
    private string iPath = null;
    public Ini(string path)
    {
        this.iPath = path;
    }

    /// <summary>
    /// 写数据
    /// </summary>
    /// <param name="section">配置节</param>
    /// <param name="key">键名</param>
    /// <param name="value">键值</param>
    public void WriteValue(string section, string key, string value)
    {  

        WritePrivateProfileString(section, key, value, iPath);

    }

    /// <summary>
    /// 读数据
    /// </summary>
    /// <param name="section">配置节</param>
    /// <param name="key">键名</param>
    /// <returns></returns>
    public string ReadValue(string section, string key)
    {
        // 每次从ini中读取多少字节 
        System.Text.StringBuilder temp = new System.Text.StringBuilder(255);        

        GetPrivateProfileString(section, key, "", temp, 255, iPath);

        return temp.ToString();

    }
}

public class Program
{
    public static void Main()
    {
        string filePath = Application.streamingAssetsPath + "/file.ini";
        string section = "SectionName";
        string key = "KeyName";

        // 读取 INI 文件
        string value = Ini.ReadValue(section, key, "", filePath);
        Console.WriteLine("Value: " + value);

        // 写入 INI 文件
        Ini.WriteValue(section, key, "NewValue", filePath);
        Console.WriteLine("Value written.");

        // 重新读取 INI 文件
        value = Ini.ReadValue(section, key, "", filePath);
        Console.WriteLine("Value: " + value);
    }
}

ini文本参考:

法2:使用System.IO命名空间的类:

具体使用:

复制代码
using System;
using System.Collections.Generic;
using System.IO;

class IniFile
{
    private readonly string filePath;
    private readonly Dictionary<string, Dictionary<string, string>> sections;

    public IniFile(string filePath)
    {
        this.filePath = filePath;
        this.sections = new Dictionary<string, Dictionary<string, string>>();
        Load();
    }

    public string GetValue(string section, string key)
    {
        if (sections.ContainsKey(section) && sections[section].ContainsKey(key))
        {
            return sections[section][key];
        }
        return null;
    }

    public void SetValue(string section, string key, string value)
    {
        if (!sections.ContainsKey(section))
        {
            sections[section] = new Dictionary<string, string>();
        }
        sections[section][key] = value;
        Save();
    }

    private void Load()
    {
        string currentSection = null;

        foreach (string line in File.ReadLines(filePath))
        {
            string trimmedLine = line.Trim();

            if (trimmedLine.StartsWith("[") && trimmedLine.EndsWith("]"))
            {
                currentSection = trimmedLine.Substring(1, trimmedLine.Length - 2);
                continue;
            }

            int equalsIndex = trimmedLine.IndexOf('=');
            if (equalsIndex > 0)
            {
                string key = trimmedLine.Substring(0, equalsIndex).Trim();
                string value = trimmedLine.Substring(equalsIndex + 1).Trim();

                if (!string.IsNullOrEmpty(currentSection) && !string.IsNullOrEmpty(key))
                {
                    if (!sections.ContainsKey(currentSection))
                    {
                        sections[currentSection] = new Dictionary<string, string>();
                    }
                    sections[currentSection][key] = value;
                }
            }
        }
    }

    private void Save()
    {
        using (StreamWriter writer = new StreamWriter(filePath))
        {
            foreach (KeyValuePair<string, Dictionary<string, string>> section in sections)
            {
                writer.WriteLine($"[{section.Key}]");

                foreach (KeyValuePair<string, string> entry in section.Value)
                {
                    writer.WriteLine($"{entry.Key}={entry.Value}");
                }

                writer.WriteLine();
            }
        }
    }
}

public class Program
{
    public static void Main()
    {
        string filePath = Application.streamingAssetsPath + "/file.ini";
        string section = "SectionName";
        string key = "KeyName";

        IniFile iniFile = new IniFile(filePath);

        // 读取值
        string value = iniFile.GetValue("section", "key");
        Console.WriteLine(value);

        // 设置值
        iniFile.SetValue("Section2", "Key2", "Value2");       
        
    }
}
相关推荐
向上的车轮9 分钟前
语言特性适用的场景:卫星、火箭控制系统用什么开发语言?
java·开发语言·c++·c#·c·ada
Magnum Lehar10 小时前
wpf3d游戏引擎ControlTemplate.xaml.cs文件实现
游戏引擎·wpf
留待舞人归10 小时前
【Unity3D优化】优化多语言字体包大小
游戏·unity·游戏引擎·unity3d·优化
wsdchong之小马过河11 小时前
2025虚幻引擎一般用什么模型格式
游戏引擎·虚幻
董先生_ad986ad11 小时前
C# 解析 URL URI 中的参数
前端·c#
xiaowu08015 小时前
C# 中的Async 和 Await 的用法详解
java·开发语言·c#
Magnum Lehar17 小时前
wpf游戏引擎前端的Transform.cs实现
前端·游戏引擎·wpf
董先生_ad986ad18 小时前
MVVM模式中,BaseViewModel 的 IsBusy 属性的作用
c#
刚子编程20 小时前
C# WinForms 实现打印监听组件
开发语言·c#·winform·打印监听组件
Magnum Lehar21 小时前
wpf3d游戏引擎前端ControlTemplate实现
前端·游戏引擎·wpf