在Unity中,有很多種讀取及儲存的方式,在此我會稍微介紹我有碰過的方法,如果有方法我沒介紹到,基本上就是我沒碰過的沒甚麼好意外哈哈!
『 Editor only,只能使用在編輯器的 』
【Prefab & Unity.Object】
儲存預製物(Prefab):
PrefabUtility.CreatePrefab("Assets/prefab/" + prefabName + ".prefab", MyPrefab); //儲存預置物到外部
儲存Unity.Object,Sprite,Material,自定義的Asset:
AssetDatabase.CreateAsset(MyAsset, string.Format("Assets/{0}.asset", MyAssetName));
不論prefab還是Asset都可以使用此讀取:
(GameObject)AssetDatabase.LoadAssetAtPath(string.Format("Assets/{0}.prefab", MyPrefab), typeof(GameObject));
GameObject換成要讀取的東西,例Texture2D、TextAsset等。
『 一般狀況皆可使用 』
【PlayerPrefs】
儲存一般資料,利用Unity本身提供的儲存方式PlayerPrefs:
macOS是儲存在 ~/Library/Preferences資料夾中,名為unity.[company name].[product name].plist的檔案。
Windows是儲存在Regedit裡的HKCU\Software\[company name]\[product name]裡面的Key&Value。
在Editor上跑的話,有可能會儲存在HKCU\Software\Unity\UnityEditor\DefaultCompany\[product name]裡面
使用方式非常簡單:
PlayerPrefs.SetFloat("key",Value); //Value 為 Float
PlayerPrefs.SetInt("Key",Value); //Value 為 Int
PlayerPrefs.SetString("Key",Value); //Value 為 String
讀取方式也非常簡單:
variable = PlayerPrefs.GetFloat("key",Default); //variable 為 Float
variable = PlayerPrefs.GetInt("Key",Default); //variable 為 Int
variable = PlayerPrefs.GetString("Key",Default); //variable 為 String
可設定如果沒取到東西時的預設值Default。
【JsonFile】
儲存myclass內物件:
MyClass myclass = new MyClass();
myclass.A = 0;
myclass.B = "string";
string saveString = JsonUtility.ToJson(myclass);
StreamWriter file = new StreamWriter(path + "file.json");
file.Write(saveString);
file.Close();
宣告一個MyClass的物件,調整個裡面儲存的數值,接著使用JsonUtility的ToJson,就會簡易的轉換成字串方便儲存。
記得在需要儲存的Class上面指定是可以序列化的Class,[System.Serializable];
讀取myclass內物件:
StreamReader file = new StreamReader(path + "file.json");
string loadJson = file.ReadToEnd();
file.Close();
MyClass myclass = JsonUtility.FromJson<MyClass>(loadJson);
讀取檔案後,將原字串轉換回Json檔,接著再用MyClass去接受這個檔案即可。
【Prefab & Unity.Object】
儲存Unity.Object,以Texture2D為範例:
using (FileStream fs = File.Open(savePath, FileMode.Create)) //寫出檔案
{
byte[] b = Texture2D.bytes;
fs.Write(b, 0, b.Length);
}
基本上遊戲運行時是不太能夠儲存Unity.Object的,目前用的辦法比較偷吃步,大概就是把檔案轉成bytes然後輸出到外部。
目前我的認知是,在遊戲運行中,無法儲存/覆蓋Unity.Object,只能頂多用以上方法把檔案作為bytes處理。
讀取Unity.Object:
(GameObject)Resources.Load("MyGameObject");
或寫成:
Resources.Load<GameObject>("MyGameObject");
或:
(GameObject)Resources.Load("MyGameObject",typeof(GameObject));
請注意,以上是沒有附檔名的,在Resources裡面會直接導向到專案內的Assets底下的Resources資料夾,也就是:
"UnityProject/Assets/Resources/",而檔案名稱也不用輸入副檔名,附檔名會依照所指定的類型(在此指GameObject)去尋找檔案(附檔名)
遊戲物件(預製物),GameObject,.prefab
圖片,Texture2D,.psd.jpg.png.gif.bmp.tga.tiff.iff.pict.dds
文字檔,TextAsset,.txt.htm.html.xml.bytes
音效,AudioClip,.mp3.ogg.aiff.wav.mod.it.sm3
材質球,Material,.mat
影片片段,MovieTexture,.mov.avi.asf.mpg.mpeg.mp4
P.S.Shader的話無法使用Resources.Load,請改用Shader.Find("MyShader");
備註:
有時候我會需要寫出Debug.Log的訊息,這時候就會用:
using (StreamWriter sw = new StreamWriter(Application.persistentDataPath + "/testResult.txt")) //寫出檔案
{
sw.WriteLine("寫出訊息");
}
之類的,其目標地點則為"C:\Users\使用者名稱\AppData\LocalLow\公司名稱\遊戲名稱" 內。
以上為本篇筆記的全部內容,如果有任何一段對你有幫助,那就太好了!
留言
張貼留言