其實只是簡單的文件檔案讀寫......
1.若是希望有些設定值被改變後,下次重新開啟時可以繼續這些設定值。
2.這些設定值又不需要保密(例如:音量、角色操控的按鍵)。
3.覺得使用資料庫會大材小用。
若是滿足以上三點,則可以使用檔案讀寫的方式創建文件檔(txt或ini都可以,甚至任意副檔名皆可)來儲存這些設定。
在這個簡易範例中我以可移動的GUI.Window的做測試,使用者將GUI.Window移動到隨意的地方後,關閉程式再重新開啟,會發現GUI.Window的位置和關閉程式前的位置一樣。
新增一個C# script且命名為saveSetting後...
開始編寫程式碼:
using System;
using System.IO;
using System.Text;
using UnityEngine;
public class saveSetting : MonoBehaviour
{
private float left;//window和螢幕左邊的距離
private float top;//window和螢幕上面的距離
private string path = @"C:\Users\Lin\Desktop\position.ini";//設定檔的路徑,我儲存在自己的桌面
private Rect windowPosition;//儲存GUI.Window的位置
void Start ()
{
if (File.Exists(path) == false)//若設定檔不存在,則呼叫initialize()進行新增和寫入初始的資料
{
initialize();
}
else//否則讀取設定檔內的資料
{
readINI();
}
setWindowPosition();//設定GUI.Window的初始位置
}
private void initialize()
{
left = 0;//初始化位置
top = 0;//初始化位置
writeINI(left, top);
}
private void writeINI(float left, float top)//寫入INI檔
{
using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))//第一個參數為檔案位置,若該位置無檔案則自動創建;第二個參數為true代表將資料寫在原先資料的後面,為false則將原先資料全部清除後再重新寫入新的內容,預設為false;第三個參數則為文件的編碼方式
{
writer.WriteLine("LEFT=" + left);//寫入left的資料
writer.WriteLine("TOP=" + top);//寫入top的資料
}
}
private void readINI()
{
string[] temp = new string[2];//儲存讀取到的資料,因為只有兩個資料(left、top),所以使用範圍0~1的一維陣列
int number = 0;//儲存讀取了幾行
using (StreamReader reader = new StreamReader(path))
{
while(reader.EndOfStream == false)//若是檔案還沒讀取完,則繼續讀取
{
temp[number] = reader.ReadLine();//一次讀取一行
number++;
}
}
left = getNumber(temp[0]);//取得數值
top = getNumber(temp[1]);//取得數值
}
private float getNumber(string str)
{
char[] data = str.ToCharArray();//將字串轉為字元陣列,以搜尋指定的資料
int index = Array.IndexOf(data, '=');//在字元裡搜尋'=',並傳回其在陣列的位置
StringBuilder number = new StringBuilder();
for (int i=index+1; i<data.Length; i++)
{
//從等號的下一個字元開始加入number內
//假設傳入的str為LEFT=100,則會將100加入number內
number.Append(data[i]);
}
return float.Parse(number.ToString());//將number轉為float並回傳
}
private void setWindowPosition()
{
windowPosition = new Rect(left, top, 100, 100);
}
void OnGUI()
{
windowPosition = GUI.Window(0, windowPosition, windowEvent, "可拖曳測試");
}
private void windowEvent(int id)
{
GUI.DragWindow();
}
private void OnApplicationQuit()
{
//當程式關閉時Unity會自動呼叫此方法
writeINI(windowPosition.xMin, windowPosition.yMin);//傳入windowPosition的left和top參數
}
}
再來將此腳本拖曳到任何元件上(我將其拖入了Main Camera)
留言列表