這個是我第一篇關於u3d(unity3d)的學習心得,由於我發現最近開始老忘記事,估計是老了吧,因此仍是好記憶不如爛筆頭。做爲一個酷畢的瑪儂,也就只能這樣了。編程
本文不是從起步寫起的,之後有空的話,可能會寫點以前基礎學習心得,今天是心血來潮,那就只能從今天的事提及吧。
windows
不少時候,咱們的程序都須要一些靈活性(領導們的最愛),爲此咱們必須曝露一些變量到外部來給使用者來進行修改或者說是控制,隨便吧,反正就是那個意思。喔,首先說明一下,我是在windows下編程的,因此說的都是針對windows的,其餘平臺的朋友也不要噴我,由於我還沒習慣或者說深刻了解其餘的平臺下的編程。言歸正傳,咱們都知道在windows下有一種配置文件,格式是ini,這是一種易讀的文件,因此咱們就用他來保存咱們的變量吧。固然你也可使用xml,可是對我來講太複雜,由於我打開它來看,眼花繚亂。好的,ini文件,windows系統自己也是使用這種文件來配置某些東西,而且在windowsAPI中微軟也爲咱們提供了操做他的函數,也就是GetPrivateProfileXXX之類的函數,他們被封裝在kernel32.dll中,這個dll是個核心的dll,因此windows系統都有他的身影。好了,既然,什麼都有了,那就讓咱們開始咱們的編程之旅吧。ide
欲練神功,必先自宮。先建一個文件"TestIni.cs"而後把下面的代碼直接拷貝到該文件內,保存。函數
using UnityEngine; //系統自動生成學習
using System.Collections; //系統自動生成測試
//首先爲了導入dll,咱們須要在文件的開始添加下面一行代碼this
using System.Runtime.InteropServices;spa
//爲了使用ASCIIEncoding而添加下面一行代碼3d
using System.Text;xml
public class TestIni : MonoBehaviour
{
#region 下面開始導入咱們需的函數--該段直到#endregion
[DllImport("kernel32.dll")]
public extern static int GetPrivateProfileString (string segName, string keyName, string sDefault, byte[] buffer, int nSize, string fileName);
[DllImport("kernel32.dll")]
public extern static int GetPrivateProfileSection (string segName, byte[] buffer, int nSize, string fileName);
[DllImport("kernel32.dll")]
public extern static int WritePrivateProfileSection (string segName, string sValue, string fileName);
[DllImport("kernel32.dll")]
public extern static int WritePrivateProfileString (string segName, string keyName, string sValue, string fileName);
[DllImport("kernel32.dll")]
public extern static int GetPrivateProfileSectionNames(byte[] buffer, int iLen, string fileName);
#endregion
//爲了保存文件全路徑添加一個變量,其實不該該起這個名字的,這個是歷史遺留問題,由於這個文件我改了好屢次了,可是變量名一直沒變
string sPath;
//爲了能遍歷完全部的鍵我引用了網上的代碼,也就是下面的兩個函數
/// 返回該配置文件中全部Section名稱的集合
public ArrayList ReadSections ()
{
byte[] buffer = new byte[65535];
int rel = GetPrivateProfileSectionNames (buffer, buffer.GetUpperBound (0), sPath);
int iCnt, iPos;
ArrayList arrayList = new ArrayList ();
string tmp;
if (rel > 0)
{
iCnt = 0;
iPos = 0;
for (iCnt = 0; iCnt < rel; iCnt++)
{
if (buffer [iCnt] == 0x00)
{
tmp = ASCIIEncoding.Default.GetString (buffer, iPos, iCnt - iPos).Trim ();
iPos = iCnt + 1;
if (tmp != "")
arrayList.Add (tmp);
}
}
}
return arrayList;
}
// 獲取節點的全部KEY值
public ArrayList ReadKeys (string sectionName)
{
byte[] buffer = new byte[5120];
int rel = GetPrivateProfileString (sectionName, null, "", buffer, buffer.GetUpperBound (0), sPath);
int iCnt, iPos;
ArrayList arrayList = new ArrayList ();
string tmp;
if (rel > 0)
{
iCnt = 0;
iPos = 0;
for (iCnt = 0; iCnt < rel; iCnt++)
{
if (buffer [iCnt] == 0x00)
{
tmp = ASCIIEncoding.Default.GetString (buffer, iPos, iCnt - iPos).Trim ();
iPos = iCnt + 1;
if (tmp != "")
arrayList.Add (tmp);
}
}
}
return arrayList;
}
// Use this for initialization
void Start ()
{
//在Assets文件內先建一個"a.ini"文件,如果其餘的名字,那你就改下面的代碼好了
//上面一句是操做不是代碼的解釋,下面的代碼是保存文件的全路徑
sPath = Application.dataPath + "/a.ini";
//獲取全部的Section名稱
ArrayList al = ReadSections();
//新建一個list準備保存Key
ArrayList alKeys = new ArrayList();
//嘗試讀取含有中文的Section
ReadKeys("sd的地方");
//下面是讀取Key
for(int i=0 ; i < al.Count; i++)
{
alKeys.Add(ReadKeys(al[i] as string));
for(int r=0; r<((ArrayList)alKeys[i]).Count; r++)
Debug.Log(((ArrayList)alKeys[i])[r].ToString());
}
}
}
好了,代碼寫完了,那就測試吧。
若已自宮,未必成功!
很明顯,咱們要的效果沒有達到,竟然識別了不了中文。固然假如只是英文的話就沒問題。