程序没有任何配置文件,那么它对外是全封闭的,一旦程序需要修改一些参数必须要修改程序代码本身并重新编译,为了让程序出厂后还能根据需要进行必要的配置,所以要用配置文件;配置文件有很多种,如INI配置文件,XML配置文件,cfg配置文件,还有就是可以使用系统注册表等。作为一个新手,刚刚接触到配置文件ini,今天就把感悟记载下来。
本博要完成的任务很简单,就是写一个配置文件xxx.ini,然后我可以在Unity中读取到这个ini文件中的信息,也可以通过程序改动ini文件中的信息。
创建配置文件
首先来创建一个txt文件,更名后缀为ini,我们象征性的在里面填点数据意思意思。比如我创建了info.ini,在里面填写的:
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按钮,结果显示:
此时再打开info.ini,会发现:
知识点拓展:
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文件的格式也出现了很多变种;
是不是没看懂??没关系来个例子你就知道了:
DllImport("kernel32")是什么意思?
这句话的意思就是:引入kernel32.dll这个动态连接库。
这个动态连接库里面包含了很多WindowsAPI函数,如果你想使用这面的函数,就需要这么引入。
[DllImport("kernel32.dll")]
private static extern void 函数名(参数,[参数]);
函数名就是一个属于kernel32.dll里的一个函数。