其實只是簡單的文件檔案讀寫......

 

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)

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Yang 的頭像
    Yang

    Yang的部落格(轉貼文章請註記來源)

    Yang 發表在 痞客邦 留言(0) 人氣()