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");       
        
    }
}
相关推荐
白茶等风121386 小时前
C#_封装详解
开发语言·c#
_oP_i7 小时前
Unity 3D 脚本中的常用函数
unity·游戏引擎
larito8 小时前
unity 高性能对象池解决方案
unity
周周的Unity小屋8 小时前
虚幻引擎Gameplay探索 Actor 之间的高效通信与交互技巧一
游戏引擎·虚幻·actor通信
friklogff9 小时前
【C#生态园】虚拟现实与增强现实:C#开发库全面评估
c#·ar·vr
VB.Net9 小时前
EmguCV学习笔记 VB.Net 12.1 二维码解析
opencv·计算机视觉·c#·图像·vb.net·二维码·emgucv
charon877810 小时前
Unreal Engine 5 C++: 编辑器工具编写入门(中文解释)
c++·ue5·编辑器·游戏引擎·虚幻
TO_ZRG13 小时前
使用jenkins打包unity工程
运维·unity·jenkins
虚假程序设计15 小时前
pythonnet python图像 C# .NET图像 互转
开发语言·人工智能·python·opencv·c#·.net
我是苏苏16 小时前
Web开发:ABP框架3——入门级别的接口增删改查实现原理
c#·web开发·abp