程序没有任何配置文件,那么它对外是全封闭的,一旦程序需要修改一些参数必须要修改程序代码本身并重新编译,为了让程序出厂后还能根据需要进行必要的配置,所以要用配置文件;配置文件有很多种,如INI配置文件,XML配置文件,cfg配置文件,还有就是可以使用系统注册表等。作为一个新手,刚刚接触到配置文件ini,今天就把感悟记载下来。


本博要完成的任务很简单,就是写一个配置文件xxx.ini,然后我可以在Unity中读取到这个ini文件中的信息,也可以通过程序改动ini文件中的信息。


创建配置文件

首先来创建一个txt文件,更名后缀为ini,我们象征性的在里面填点数据意思意思。比如我创建了info.ini,在里面填写的:

unity 验证文件是否损坏 .unity文件_配置文件

ok,其实这些数据的意思你一看就明白了。我也不多说了,重点需要记一下数据的格式

对配置文件进行读取、改动等操作的基类

我这里写了一个ConfigIni.cs作为操作配置文件基类,这样其他类如果想获取配置信息的话,通过该基类就可以获取。

/**
*┌──────────────────────────────────────────────────────────────┐
*│ Description:读取或者写入Ini文件的基类 ,其他类想要获取ini配置文件信息,需要该类作为中介                                                  
*│ Author:#Keneyr#                                              
*│ Version:#1.0#                                                
*│ Date:#2019.7.31#  
*│  UnityVersion: #Unity2018.3.2f#                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐                                   
*│ ClassName:#ConfigIni#                                      
*└──────────────────────────────────────────────────────────────┘
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
using System.Text;
using System.IO;

public class ConfigIni
{
    public string path; //ini文件的路径
    public ConfigIni(string path)
    {
        this.path = path;
    }
    [DllImport("kernel32")]
    public static extern long WritePrivateProfileString(string section,string key,string value,string path);
    [DllImport("kernel32")]
    public static extern int GetPrivateProfileString(string section,string key,string deval,StringBuilder stringBuilder,int size,string path);

    //写入ini文件
    public void WriteIniContent(string section,string key,string value)
    {
        WritePrivateProfileString(section,key,value,this.path);
    }
    //读取ini文件
    public string ReadIniContent(string section,string key)
    {
        StringBuilder temp = new StringBuilder(255);
        int i=GetPrivateProfileString(section,key,"",temp,255,this.path);
        return temp.ToString();
    }
    //判断路径是否正确
    public bool IsIniPath()
    {
        return File.Exists(this.path);

    }
}

获取配置信息

好了,接下来就测试一下是不是可以获取到配置文件info.ini中的信息吧,这里我写了一个类叫做ConfigTestDemo.cs,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ConfigTestDemo : MonoBehaviour
{
    ConfigIni ini;
    private string time = "";
    private string speed = "";

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    void Start()
    {
        Debug.Log("ConfigTestDemo Start");
        //获取ini文件
        ini = new ConfigIni("Assets/xxx/xxx/Config/info.ini");
        //获取Ini文件Time类型下的time对应的数值
        time = ini.ReadIniContent("Time","time");
        speed = ini.ReadIniContent("Speed","speed");
        //写入Count类型count值对应的数值(如果存在了相同的key会覆盖原来key的内容)
        ini.WriteIniContent("Count","count","5");
        

        Debug.Log(time);
        Debug.Log(speed);
        
    }

}

在Uniyt中新建一个场景,把ConfigTestDemo.cs挂载到Camera上,点击Play按钮,结果显示:

unity 验证文件是否损坏 .unity文件_unity_02

此时再打开info.ini,会发现:

unity 验证文件是否损坏 .unity文件_INI_03


知识点拓展:

ini配置文件和xml配置文件的区别(下篇博客尝试xml配置文件,这里只讲区别)

xml,对于描述复杂的数据结构非常的方便,缺点相对ini使用麻烦一点。在表达较短的配置时,没有ini简练。而且因为它有比较严格的格式审查机制,容错性也不是特别好,在手写时容易出现错误。抛开配置的功能,作为存储传输数据的手段,xml还有个缺点就是它的处理和存储的效率非常低下,解析速度慢,占用更多的存储空间。

 ini,通常用于对软件的参数进行配置和记录。优点是使用方便,嵌入程序也容易,几个接口就够了,很容易掌握。配置文件更小巧,手工配置也更容易。缺点是它的结构只有2层,对于复杂类型数据描绘就显得比较无力了。另外ini文件有64kb的大小限制。

 对于很小的简单配置来说,ini无疑是一种更简练,方便的实现方式。而xml则适合应付更复杂的需求。

ini配置文件的书写格式

INI文件的格式很简单,最基本的三个要素是:parameters,sections和comments

parameters:INI所包含的最基本的“元素”就是parameter;每一个parameter都有一个name和一个value,如下所示:

      name = value

 

sections:所有的parameters都是以sections为单位结合在一起的。所有的section名称都是独占一行,并且sections名字都被方括号包围着([ and ])。在section声明后的所有parameters都是属于该section。对于一个section没有明显的结束标志符,一个section的开始就是上一个section的结束,或者是end of the file。Sections一般情况下不能被nested,当然特殊情况下也可以实现sections的嵌套。

section如下所示:

         [section]

 

comments:在INI文件中注释语句是以分号“;”开始的。所有的所有的注释语句不管多长都是独占一行直到结束的。在分号和行结束符之间的所有内容都是被忽略的。

注释实例如下:

;comments text

当然,上面讲的都是最经典的INI文件格式,随着使用的需求INI文件的格式也出现了很多变种;

是不是没看懂??没关系来个例子你就知道了:

unity 验证文件是否损坏 .unity文件_unity 验证文件是否损坏_04

DllImport("kernel32")是什么意思?

这句话的意思就是:引入kernel32.dll这个动态连接库。 
这个动态连接库里面包含了很多WindowsAPI函数,如果你想使用这面的函数,就需要这么引入。

[DllImport("kernel32.dll")] 
private static extern void 函数名(参数,[参数]); 
函数名就是一个属于kernel32.dll里的一个函数。