Unity插件 Easy Save 2 (ES2) API引導(dǎo)篇

Basic Saving and Loading 基本的存儲和讀取

Saving Variables and Components 存儲變量和組件

存儲變量梯影,請使用

ES2.Save(variable,path)

第一個參數(shù)必是需要存儲的變量眨攘,這個變量必須是ES2可被支持的類型
第二個參數(shù)保存數(shù)據(jù)的存儲路徑红氯,可以是一個簡單的名稱侍郭,一個文件名莹捡,一個文件路徑等其他東西

/* Save the value 123 to a key named myInt */
ES2.Save(123,  "myInt");

/* Save this transform to a file named File.txt */
ES2.Save(this.transform,  "File.txt");
Loading Variables 加載變量

你可以使用下面這個方法來加載變量

ES2.Load<Type>(path)

'Type'是需要加載的變量的類型纲刀,你需要保證它和存儲數(shù)據(jù)的時候一致
如果你不確定要加載的數(shù)據(jù)是否存在雅潭,你可以使用下面的方法來手動檢測數(shù)據(jù)是否存在

ES2.Exists(path)

/* Check that there is data to load */
if(ES2.Exists("myInt"))

/* Load the int we saved into myInt */
myInt = ES2.Load<int>("myInt");
Loading Components 加載組件

因為Unity是以組件的方式工作的罐盔,所以我們應(yīng)該允許ES插件可以存儲和讀取我們的組件信息
我們使用這個自動分配的加載方法

ES2.Load(path,component)

/* Load the Transform we saved into the Transform of this object  */
if(ES2.Exists("myTransform"))
    ES2.Load<Transform>("myTransform",this.transform);


Paths 路徑

在ES插件中但绕,一個path路徑只想一條特定的數(shù)據(jù),舉個例子惶看,我們告訴ES一個路徑讓它通過這個路徑去存儲一些東西捏顺,或者去加載一些東西
我們可以增加一些參數(shù)在路徑的末尾1??做出一些指定設(shè)置

******key 鍵
一個key鍵標(biāo)實一條數(shù)據(jù),就像使用PlayerPrefs方式一樣

ES2.Save(data, "myKey");

******File 文件
如果你想通過指定一個文件的方式去存儲一條或者根據(jù)Tags標(biāo)簽信息來區(qū)別多條數(shù)據(jù)
如果你僅僅指定一個文件名纬黎,那么數(shù)據(jù)將會存儲在ES插件相對的默認(rèn)位置
你也可能指定一個絕對路徑幅骄,該路徑必須以驅(qū)動器盤符或者‘/’或者‘\’ 來開頭

// Relative file
ES2.Save(data, "myFile.txt");
// Absolute file
ES2.Save(data, "C:/Users/User/myFile.txt");

******Floder 文件夾
通過指定文件夾的形式來存儲數(shù)據(jù),你可以使用相對路徑或者絕對路徑的文件夾路徑本今,同樣拆座,你可以使用相對或者絕對文件路徑
一個文件夾路徑必須是以‘/’ 或者 ‘\’結(jié)尾的

// Relative folder
ES2.Exists("myFolder/anotherFolder/");
// Absolute folder
ES2.Exists("C:/Users/User/myFolder/");

******URL 網(wǎng)址
通過ES2Web來使用URL網(wǎng)址的方式存儲和加載信息
URL必須是以"http://"或者"https://"開頭的

ES2Web web = new ES2Web("http://www.site.com");


Saving and Loading from File 通過文件的方式存儲和加載

ES插件允許通過文件的方式存儲和加載數(shù)據(jù),默認(rèn)會將文件創(chuàng)建在Application.persistentDataPath路徑下冠息,因為這是確保存在的(其他路徑的讀寫關(guān)系根據(jù)平臺有差別)挪凑,無論如何,你也可以提供別的絕對路徑供ES插件去存儲和加載
不允許在Unity Web Player的環(huán)境下去使用文件存儲和加載铐达,所以岖赋,在這種情況下即使你給了文件名稱或者絕對路徑,ES插件也會自動使用PlayerPrefs去替代它

Saving and Loading from File 通過文件的方式存儲和加載

通過文件的方式瓮孙,最簡單的方式你可以提供一個文件的路徑名唐断。你也可以提供一個文件夾的方式,如果該文件夾不存在則會自動創(chuàng)建
你可以使用任何形式的后綴杭抠,只要目標(biāo)的操作系統(tǒng)允許脸甘,我們在例子中大多數(shù)使用txt后綴

/* Save the value 123 to a file named myFile.txt */
ES2.Save(123,  "myFile.txt");
 
/* Now load that int back from the file */
int myInt = ES2.Load<int>("myFile.txt");
/* Save myFile.txt inside myFolder */
ES2.Save(123,  "myFolder/myFile.txt");
 
/* And now load it back */
int myInt = ES2.Load<int>("myFolder/myFile.txt");
Using an Absolute Path 使用一個絕對路徑

絕對路徑必須以驅(qū)動器盤符或者‘/’ ‘\’開頭,使用正斜杠還/是反斜杠\取決于你的目標(biāo)操作系統(tǒng)
你必須確定你的絕對路徑的位置在運行時是存在的偏灿,而且你有寫入的權(quán)限丹诀,我們總是建議只在必要的時候采取使用絕對路徑

/* Save our int to an absolute file on Windows */
ES2.Save(123, "C:/Users/User/myFile.txt");
/* Load from an absolute file on OSX */
int myInt = ES2.Load<int>("/Users/User/myFile.txt");


Exists and Delete 存在和刪除

Exists 存在

ES2.Exists(path)

檢測數(shù)據(jù)是否存在于給定的路徑,這是一個十分有用的方法當(dāng)你不確定你的數(shù)據(jù)是否存在的時候
這個方法甚至也可以使用 文件夾 + Tags標(biāo)簽 的形式來檢測(針對于一個文件多條信息的情況)

/*If myData exists, load it*/
if(ES2.Exists("myData"))
    myInt = ES2.Load<int>("myData");
/*If myFolder exists, save to it*/
if(ES2.Exists("myFolder/"))
    ES2.Save(123, "myFolder/myFile.txt");
Delete 刪除

ES2.Delete(path)

你可以使用上面的方法來刪除一條數(shù)據(jù),包括文件铆遭,文件夾+Tags硝桩,應(yīng)當(dāng)謹(jǐn)慎使用該方法,因為它會刪除即使不是通過ES插件創(chuàng)建的文件和文件夾
提示和建議:我們在創(chuàng)建和讀取文件的以后都應(yīng)該先通過Exists校驗枚荣,確保操作的文件都是ES相關(guān)文件碗脊,避免刪除和覆蓋其他資源文件

/* Delete a key */
ES2.Delete("myInt");
/* Delete a file */
ES2.Delete("myFile.txt");
/* Delete a folder */
ES2.Delete("aFolder/myFolder/");
/* Delete a tag */
ES2.Delete("myFile.txt?tag=myTag");


Parameters 參數(shù)

ES插件允許我們在路徑中指定參數(shù)設(shè)置
這是一個類似HTTP Get 請求的格式化字符串,'?'后面的部分表示的是參數(shù),’&‘是參數(shù)與參數(shù)之間的分割
舉個例子,存儲數(shù)據(jù)的時候允許使用加密方式橄妆,且設(shè)置自己的密碼衙伶,我們可以使用

ES2.Save(123, "myFile.txt?encrypt=true&password=myPassword");

參數(shù)列表

通用參數(shù)

  • tag -- 通過tag來標(biāo)實一個文件中存儲的多條數(shù)據(jù)
  • encrypt -- true / false 來確定數(shù)據(jù)是否加密
  • password -- 開啟加密后的密碼
  • savelocation -- 我們希望操作的位置, File害碾,PlayerPrefs或者Resources
  • webusername -- 當(dāng)我們使用web相關(guān)的方法后,在ES2.php中指定的用戶名
  • webpassword -- 當(dāng)我們使用web相關(guān)的方法后,在ES2.php中指定的密碼
  • webfilename -- 保存到網(wǎng)絡(luò)時矢劲,我們要保存的網(wǎng)絡(luò)文件

Mesh網(wǎng)格參數(shù)

  • savenormals -- 保存Meshs信息是否同時保存normals
  • saveuv -- 保存Meshs信息是否同時保存UVs
  • saveuv2 -- 保存Meshs信息是否同時保存UV2s
  • savetangents -- 保存Meshs信息是否同時保存tangents


Tags: Saving Multiple Variables to One File 標(biāo)簽:在一個文件中保存多條數(shù)據(jù)

ES插件允許在一個文件中保存多條數(shù)據(jù),并通過tags來分別標(biāo)實對應(yīng)的數(shù)據(jù)
如果指定的tag已經(jīng)存在慌随,那么將會覆蓋原來的數(shù)據(jù)
您可以使用標(biāo)簽將不同類型的數(shù)據(jù)保存到文件中芬沉,并以任意順序加載。
你可以使用ES2.Delete(path)的方法來刪除tags標(biāo)簽儒陨,或者刪除對應(yīng)數(shù)據(jù)文件花嘶,那么將會刪除這個文件中所有的數(shù)據(jù)標(biāo)簽

/* Save two different pieces of data to one file */
ES2.Save("myObjectName", "file.txt?tag=nameTag");
ES2.Save(transform, "file.txt?tag=trTag");
 
/* Overwrite a tag with a new value */
ES2.Save("NewName", "file.txt?tag=nameTag");
 
/* Load our data in any order */
ES2.Load<Transform>("file.txt?tag=trTag", transform);
name = ES2.Load<string>("file.txt?tag=nameTag");
 
/* Delete all tags by deleting entire file */
ES2.Delete("file.txt");


Encryption and Obfuscation 加密和混淆

Encryption 加密

ES插件允許你使用AES 128-bit 的方式加密
如果你確定使用它,需要將參數(shù)encrypt設(shè)置為true蹦漠,同時你也可以為其設(shè)置密碼
加密對強化混淆數(shù)據(jù)是非常有用的,當(dāng)最終數(shù)據(jù)的安全性很重要的時候,我們建議您使用HTTPS將數(shù)據(jù)安全的存儲在服務(wù)器上,ES插件對此是支持的

/* Save data with encryption */
ES2.Save(123, "file.es?encrypt=true&password=pass");
 
/* Load data with encryption */
int i = ES2.Load<int>("file.es?encrypt=true&password=pass");
Obfuscation 混淆

ES插件為您提供了XOR混淆方式车海, 這是一種非车言埃快的混淆方式,但是和上面的加密相比侍芝,安全性較低
你可以像使用加密的方式來使用它研铆,不過需要額外提供一個參數(shù)encryptiontype = obfuscate

/* Save data with encryption */
ES2.Save(123, "file.es?encrypt=true&encryptiontype=obfuscate&password=pass");
 
/* Load data with encryption */
int i = ES2.Load<int>("file.es?encrypt=true&encryptiontype=obfuscate&password=pass");


Saving and Loading from Web 通過Web存儲和加載

ES插件允許使用ES提供的PHP文件和MySQL數(shù)據(jù)庫保存到網(wǎng)絡(luò)上的MySQL服務(wù)器
它使用ES自己的格式保存到數(shù)據(jù)庫,無論如何州叠,你可以使用

ES2Web.UploadRaw(string data)
ES2Web.LoadRaw()

來從數(shù)據(jù)庫上傳和下載原生字符串

SetUp 安裝配置

1.在Assets/Easy Save 2/Web文件夾下找到ES2.php和ES2Sql.sql文件
2.使用ES2SQL.sql文件將ES2表添加到新的或現(xiàn)有的MySQL數(shù)據(jù)庫棵红。記下你添加了表的數(shù)據(jù)庫的名字,因為在稍后的階段你需要這個名字咧栗。
3.打開ES2.php文件逆甜,填寫ES2表的MySQL數(shù)據(jù)庫主機名,用戶名致板,密碼交煞,數(shù)據(jù)庫名
4.同樣在ES2.php中,輸入在調(diào)用ES2Web函數(shù)時候?qū)⒃赨nity中使用的用戶名和密碼
5.將ES2.php文件放到您的Web服務(wù)器上斟或,然后該文件的URL輸入到Web瀏覽器中素征,如果上面的步驟都正確,那么你會看到提示信息"ES2.php and MySQL database are working correctly"

現(xiàn)在你可以在Unity中使用ES2Web了
在使用ES2Web方法前,你需要確定你提供的用戶名和密碼和在ES2.php中的相同

Save to Web 保存到網(wǎng)絡(luò)

我們通過使用協(xié)程來從網(wǎng)上上傳和下載數(shù)據(jù)御毅,因為這允許我們在多幀中下載根欧,我們建議你先熟悉協(xié)程操作在你嘗試從web保存和加載數(shù)據(jù)前
在這個例子中,我們創(chuàng)建一個協(xié)程去上傳一個Mesh信息到網(wǎng)絡(luò)上端蛆,你可以使用StartCoroutine()方法來啟動它
1.首先,我們創(chuàng)建一個 ES2Web 對象凤粗,然后填入ES2.php所在服務(wù)器的完整路徑,我們也可以在URL后提供參數(shù).webfilename是一個重要的參數(shù),它用來指定我們保存在MySQL服務(wù)器上的邏輯文件欺税。
2.其他重要參數(shù)包括 webusername 和 webpassword侈沪,他們和我們在ES2.php中指定的相同,我們也可以使用 tag 和 encrypt 參數(shù)
3.現(xiàn)在我們使用 ES2Web.Upload(data)來上傳數(shù)據(jù)
4.最后晚凿,我們使用ES2Web.errorCode和ES2Web.error變量來檢查ES2Web返回的錯誤亭罪。錯誤列表可以在ES2Web頁面的錯誤代碼部分找到。

public IEnumerator UploadMesh(Mesh mesh, string tag)
{
    // Create a URL and add parameters to the end of it.
    string myURL = "http://www.server.com/ES2.php";
    myURL += "?webfilename=myFile.txt&webusername=user&webpassword=pass";
 
    // Create our ES2Web object.
    ES2Web web = new ES2Web(myURL + "&tag=" + tag);
      
    // Start uploading our data and wait for it to finish.
    yield return StartCoroutine(web.Upload(mesh));
      
    if(web.isError)
    {
        // Enter your own code to handle errors here.
        Debug.LogError(web.errorCode + ":" + web.error);
    }
}
Loading from Web 從服務(wù)器加載

在這個例子中我們提供了一條數(shù)據(jù)讓你從服務(wù)器加載它歼秽,你也可以通過不指定 tag 的方式來下載一整個文件
URL和參數(shù)的工作方式與上面的“Save to Web”部分完全相同
1.首先应役,創(chuàng)建一個 ES2Web 對象并給上URL
2.現(xiàn)在,使用 ES2.Download() 來代替 ES2.Upload() 方法來從服務(wù)器上下載數(shù)據(jù)
3.一旦下載燥筷,而且我們已經(jīng)檢查了錯誤信息箩祥,我們可以做下面兩件事

  • 1 -- 通過 ES2Web.SaveToFile(path) 保存到本地文件
  • 2 -- 通過 ES2Web.Load(tag) 直接加載下載的數(shù)據(jù)
public IEnumerator DownloadMesh(string tag)
{
    // Create a URL and add parameters to the end of it.
    string myURL = "http://www.server.com/ES2.php";
    myURL += "?webfilename=myFile.txt&webusername=user&webpassword=pass";
 
    // Create our ES2Web object.
    ES2Web web = new ES2Web(myURL + "&tag=" + tag);
      
    // Start downloading our data and wait for it to finish.
    yield return StartCoroutine(web.Download());
      
    if(web.isError)
    {
        // Enter your own code to handle errors here.
        Debug.LogError(web.errorCode + ":" + web.error);
    }
    else
    {
        // We could save our data to a local file and load from that.
        web.SaveToFile("myFile.txt");
 
        // Or we could just load directly from the ES2Web object.
        this.GetComponent<MeshFilter>().mesh = web.Load<Mesh>(tag);
    }
}
Delete from Web 從Web刪除

通過 ES2Web.Delete(path) 方法刪除數(shù)據(jù),和上傳下載方式類似

public IEnumerator DeleteWebFile(string file)
{
    // Create a URL and add parameters to the end of it.
    string myURL = "http://www.server.com/ES2.php";
    myURL += "?webfilename="+file+"&webusername=user&webpassword=pass";
 
    // Create our ES2Web object.
    ES2Web web = new ES2Web(myURL);
      
    // Start downloading our data and wait for it to finish.
    yield return StartCoroutine(web.Delete());
      
    if(web.isError)
    {
        // Enter your own code to handle errors here.
        Debug.LogError(web.errorCode + ":" + web.error);
    }
}
Integrating with a Login System 與登錄系統(tǒng)集成

我們強烈建議您將ES2.php集成到您選擇的登錄系統(tǒng)中
ES2.php文件中包含了一個 Authenticate($uaername,$password)的方法肆氓,你可以修改該方法集成到您的登錄系統(tǒng)中去
這有兩個參數(shù):
username : 即在Unity中指定的webusername
password :即在Unity中指定的webp袍祖、Password,默認(rèn)通過MD5加密了谢揪,所以如果你想要在PHP中進行轉(zhuǎn)換請使用 MD5($str) 方法
或者蕉陋,您可以讓ES2以純文本格式發(fā)送密碼。為此拨扶,請將ES2Web對象的hashType變量設(shè)置為ES2Web.HashType.None凳鬓。但是,不建議您這樣做患民,除非您使用HTTPS缩举。
如果用戶名或密碼不匹配,則Authenticate方法應(yīng)該返回false;如果兩者匹配匹颤,則返回true

Error Codes 錯誤碼

錯誤碼列表
列表仅孩,參見Error Codes section of the ES2Web documentation



Saving and Loading from Resources 從Resources保存和加載

Resources 允許包含和加載問價在運行時,包括ES2保存的文件

Saving to Resources 保存到Resources

ES智能保存到編輯器環(huán)境下的的Resources文件夾中,因為Build Unity應(yīng)用程序時候Resources文件夾不存在
如果你想將文件保存到Resources中惋嚎,以便稍后加載杠氢,則任何文件都必須以.bytes為后綴
因為ES2.Save接受一個絕對路徑,我們可以使用Application.dataPath來獲取我們Assets文件夾的絕對路徑,然后通過在path參數(shù)的后面追加Resources文件夾路徑
或者另伍,您可以將數(shù)據(jù)保存到您選擇的文件夾鼻百,然后將其拖到“Resources”文件夾中绞旅。
另外請注意,如果您希望在創(chuàng)建文件后立即在Unity中顯示文件温艇,則需要調(diào)用AssetDatabase.Refresh()因悲,或者從Unity中刷新資源。

ES2.Save(123, Application.dataPath+"/Resources/myFile.bytes?tag=myInt");
AssetDatabase.Refresh();
從Resources加載

要想從Resouces下加載資源勺爱,你必須設(shè)置你的 Save Location 存儲路徑為Resources晃琳。你可以使用Parameters參數(shù)的方式指定,或者使用 ES2Setting 對象
注意琐鲁,與保存不同卫旱,我們不必提供Resources文件夾的路徑

// Load from Resources using the savelocation parameter
int myInt = ES2.Load<int>("myFile.bytes?tag=myInt&savelocation=resources");
// Load from Resources using ES2Settings
ES2Settings settings = new ES2Settings();
settings.saveLocation = ES2Settings.SaveLocation.Resources;
 
int myInt = ES2.Load<int>("myFile.bytes?tag=myInt", settings);


Saving and Loading Images 保存和加載圖片

您可以使用Easy Save來將JPEG或PNG圖像加載為Texture2D。您還可以將Texture2D保存為PNG围段。

Loading an Image as a Texture2D

您可以使用ES2.LoadImage將JPEG或PNG文件加載為Texture2D顾翼。
例如,要將用戶硬盤上的JPG加載到GameObject的材質(zhì)中奈泪,可以使用以下代碼:

renderer.material.mainTexture = ES2.LoadImage("C:/Users/User/myImage.jpg");
Saving a Texture2D as a PNG

要將Texture2D保存為PNG适贸,請使用ES2.SaveImage方法。
例如涝桅,要保存分配給GameObject的材質(zhì)的Texture2D拜姿,可以使用下面的代碼:

ES2.SaveImage(renderer.material.mainTexture, "C:/Users/User/MyImage.png");


Loading Audio 加載音頻

Easy Save允許您使用ES2.LoadAudio方法將MP3,Ogg冯遂,WAV蕊肥,XM,IT蛤肌,MOD和S3M文件加載為Unity音頻片段晴埂。

請注意,您無法在Mac和PC上加載MP3文件寻定,也無法在移動設(shè)備上加載Ogg文件。

將一個Ogg音頻文件加載到一個AudioSource然后播放它精耐,你可以使用下面的代碼:

audio.clip = ES2.LoadAudio("C:/User/Users/myAudio.ogg");
audio.Play();


Faster Saving and Loading using ES2Writer and ES2Reader 通過 ES2WriterES2Reader 更加快速的存儲與讀取

如果您在保存和加載時需要額外的性能狼速,或者一般情況下需要額外的靈活性,那么我們建議您使用ES2Writer和ES2Reader卦停。這比創(chuàng)建多個ES2.Save和ES2.Load調(diào)用要快向胡,因為它使文件在調(diào)用之間保持打開狀態(tài)

Using ES2Writer and ES2Reader with Tags 通過Tags 使用 ES2Writer 和 ES2Reader

與ES2.Save和ES2.Load類似,ES2Writer和ES2Reader可以與標(biāo)簽一起使用惊完。
在開始之前僵芹,還應(yīng)該注意,不應(yīng)該為同一個文件打開多個ES2Reader或ES2Writers小槐,否則會導(dǎo)致意外的行為拇派。

Saving Tags using ES2Writer 使用 ES2Writer 保存Tags

為了將數(shù)據(jù)保存到文件荷辕,您使用ES2Writer.Create創(chuàng)建一個ES2Writer對象,然后調(diào)用它的Write()方法將數(shù)據(jù)保存到文件中件豌。寫完文件后疮方,必須調(diào)用寫入器的Save方法,將數(shù)據(jù)存儲到文件中茧彤。
除非您使用ES2Writer作為Using語句的一部分骡显,否則必須在完成后調(diào)用Dispose方法。

using(ES2Writer writer = ES2Writer.Create("myFile.txt"))
{
    // Write our data to the file.
    writer.Write(this.name, "nameTag");
    writer.Write(this.transform, "transformTag");
    writer.Write(new int[]{1,2,3},"intArrayTag");
    // Remember to save when we're done.
    writer.Save();
}
Loading Tags using ES2Reader 使用ES2Reader加載Tags

要從文件加載數(shù)據(jù)曾掂,您需要使用ES2Reader.Create創(chuàng)建一個ES2Reader惫谤,然后調(diào)用它的Read()方法從文件加載數(shù)據(jù)。
您也可以使用Self-assigning Read讀取方法將數(shù)據(jù)直接加載到組件中珠洗。
除非您使用ES2Reader作為Using語句的一部分溜歪,否則必須在完成后調(diào)用Reader的Dispose方法。

using(ES2Reader reader = ES2Reader.Create("myFile.txt"))
{
    // Read data from the file in any order.
    reader.Read<Transform>("transformTag", this.transform);
    this.name = reader.Read<string>("nameTag");
    int[] myIntArray = reader.ReadArray<int>("intArrayTag");
}
Using ES2Reader and ES2Writer Sequentially 使用ES2Reader 和 ES2Writer 按順序進行讀寫

保存和加載數(shù)據(jù)的最快方法是按照與保存數(shù)據(jù)相同的順序加載數(shù)據(jù)险污,而不使用標(biāo)簽痹愚。除了我們在保存和加載時沒有指定標(biāo)簽之外,這和前面的例子完全一樣蛔糯。
按照保存的順序加載數(shù)據(jù)非常重要拯腮,否則在運行時會收到錯誤。
另外請注意蚁飒,當(dāng)按順序保存時动壤,我們使用Save(false)而不是Save()來告訴ES我們沒有使用標(biāo)簽。

Saving to a File Sequentially 按順序保存數(shù)據(jù)到文件
using(ES2Writer writer = ES2Writer.Create("myFile.txt"))
{
    // Write our data to the file in the order we are going to read it.
    writer.Write(this.name);
    writer.Write(this.transform);
    writer.Write(new int[]{1,2,3});
    // Remember to save when we're done.
    writer.Save(false);
}
按順序從文件中加載數(shù)據(jù)

要從文件加載數(shù)據(jù)淮逻,需要使用ES2Reader.Create(path)創(chuàng)建一個ES2Reader琼懊,然后調(diào)用它的Read()方法從文件加載數(shù)據(jù)。
按照保存的順序加載數(shù)據(jù)非常重要爬早。
您也可以使用Self-assigning Read讀取方法將數(shù)據(jù)直接加載到組件中哼丈。
除非您使用ES2Reader作為Using語句的一部分,否則必須在完成后調(diào)用Reader的Dispose方法筛严。

using(ES2Reader reader = ES2Reader.Create("myFile.txt"))
{
    // Read the data from the file in the same order as we saved it.
    this.name = reader.Read<string>();
    reader.Read<Transform>(this.transform);
    int[] myIntArray = reader.ReadArray<int>();
}


[Adding Support for Other Types 增加其他支持的類型]

Automatically adding support for a Type 自動添加對類型的支持

您可以嘗試通過轉(zhuǎn)到Assets菜單并選擇Easy Save 2>Manage Types 來自動添加對類型的支持醉旦。然后在類型列表中找到要添加支持的類型,選擇要保存的類型的屬性桨啃,然后按Add Type车胡。

Easy Save可以添加對提供無參數(shù)構(gòu)造函數(shù)的類型的支持,并且可以支持以下屬性:

  • Public
  • Non-static
  • Allows reading and writing
  • Is currently supported by Esay Save
    對于其他類型照瘾,你可能需要手動去添加
Manually adding support for a Type 手動添加支持的類型

如果支持不能自動添加類型匈棘,您可能能夠手動添加對它的支持。

最簡單的方法是創(chuàng)建一個ES2Type模板析命,方法是轉(zhuǎn)到Assets菜單并選擇Easy Save 2> Manage Types主卫,在類型列表中找到您的類型逃默,然后按Add Type。完成后队秩,按編輯類型在默認(rèn)編輯器中打開類型模板笑旺,以便編輯它。

然后馍资,您需要更改寫入和讀取方法以包含ES2Writer和ES2Reader調(diào)用

Adding to the Write method 增加write寫入方法

Write方法需要將要從數(shù)據(jù)變量中保存的數(shù)據(jù)寫入ES2Writer筒主。你可以通過使用writer.Write()調(diào)用。

public override void Write(object obj, ES2Writer writer)
{
    MyType data = (MyType)obj;
    // Add your writer.Write calls here.
    writer.Write( data.height );
    writer.Write( data.width );
    writer.Write( data.name );
}
Adding to the Read method 增加read讀取方法

Read方法需要按照Write方法中使用reader讀取數(shù)據(jù)的順序來reader.Read<T>()調(diào)用鸟蟹,然后使用該數(shù)據(jù)構(gòu)造加載的對象并將其返回乌妙。

public override object Read(ES2Reader reader)
{
    float height = reader.Read<float>();
    int width = reader.Read<int>();
    string name = reader.Read<string>();
 
    MyType type = new MyType(height, width, name);
    return data;
}


Viewing and Modifying Files using the File Editor 使用文件編輯器查看和修改文件

由于Easy Save以二進制格式存儲數(shù)據(jù),因此無法使用普通的文件編輯器對其進行編輯建钥。
但是藤韵,您可以使用Easy Save的文件編輯器編輯它們。

打開文件編輯器

在Editor編輯器環(huán)境下熊经,轉(zhuǎn)到Assets菜單并選擇Easy Save 2>File Editor
要打開文件泽艘,只需單擊Open File按鈕并選擇您的文件。
創(chuàng)建一個新文件镐依,只用很簡單的點擊New File按鈕

Using the File Editor 使用文件編輯器

文件編輯器允許您創(chuàng)建文件匹涮,刪除文件,創(chuàng)建標(biāo)簽槐壳,刪除標(biāo)簽和修改標(biāo)簽的數(shù)據(jù)然低。
窗口左側(cè)的列表顯示文件中的所有標(biāo)簽。選擇一個查看標(biāo)簽的數(shù)據(jù)或修改它务唐。
或者雳攘,在添加新標(biāo)簽字段中輸入標(biāo)簽名稱和類型,并將新標(biāo)簽添加到文件中枫笛。

Limitations一些局限
  • 它只能查看使用Easy Save標(biāo)簽保存的文件吨灭,而不是按順序?qū)懭氲臄?shù)據(jù)
  • 只能查看和修改“被支持的類型”列表中的類型。


[Exporting to Spreadsheet and Excel 導(dǎo)出電子表格和Excel]

使用ES2 Spreadsheet刑巧,Easy Save可以創(chuàng)建電子表格并以Excel格式沃于,OSX Numbers和OpenOffice等常用電子表格軟件支持的CSV格式進行存儲。

Using ES2Spreadsheet 使用 ES2Spreadsheet

要創(chuàng)建電子表格海诲,請執(zhí)行以下操作:
1.創(chuàng)建一個ES2Spreadsheet對象。
2.使用SetCell設(shè)置單元格的值檩互。

  • 請注意特幔,列和行號從0開始。
  • 如果值不是字符串闸昨,它將使用值的ToString()將其轉(zhuǎn)成字符串表示形式蚯斯。

3.使用保存將電子表格存儲到文件中薄风。

ES2Spreadsheet sheet = new ES2Spreadsheet();
// Add data to cells in the spreadsheet.
for(int col=0; col<10; col++)
    for(int row=0; row<8; row++)
        sheet.SetCell(col, row, "someData");
sheet.Save("mySheet.csv");
Appending rows to a spreadsheet 追加行到點擊表格中

如果要將數(shù)據(jù)附加到現(xiàn)有電子表格,請將電子表格的附加變量設(shè)置為true拍嵌。電子表格中的任何行將被添加到我們保存的行的末尾遭赂。

Limitations 一些局限

目前ES2Spreadsheet無法執(zhí)行以下操作,但可能會在將來執(zhí)行這些操作:

  • 保存公式横辆。
  • 存儲格式或樣式信息撇他。
  • 保存多個工作表。


[Auto Save: Code-free Saving and Loading 自動保存,無須代碼進行存儲和加載]

重要:自動保存目前處于測試階段狈蚤,因此某些功能(如保存集合困肩,引用和空引用)被禁用。如果在產(chǎn)品中使用此測試版脆侮,請確保在發(fā)布之前對其進行徹底測試锌畸!在測試版中,我們不提供任何保障
“自動保存”是Unity 5編輯器的可視化腳本編輯工具靖避,可讓您在不進行任何編程的情況下保存和加載數(shù)據(jù)潭枣。
它可以用于保存組件,變量幻捏,甚至引用預(yù)制

Auto Saving Scene Objects 自動保存場景中的物體

開啟自動保存場景
1.前往Window > Easy Save 2 > Auto Save >Scene
2.按下"click to enable Auto Save for this scene" 按鈕

這將顯示可視化腳本工具盆犁,它將您的場景層次結(jié)構(gòu)顯示在列表中。單擊一個對象或變量的名稱粘咖,它會顯示它的實例變量蚣抗。
旁邊的每一個都是一個"保存圖標(biāo)",它允許您告訴自動保存以保存并加載它瓮下。點擊圖標(biāo)翰铡,它將變成高亮顯示,表示將自動保存讽坏。

Auto Saving Prefabs 自動保存預(yù)制

自動保存預(yù)制件锭魔,請在項目層次結(jié)構(gòu)中右鍵單擊它們,然后選擇簡易保存2>啟用自動保存預(yù)制件
然后路呜,您可以使用Prefabs(預(yù)制)選項卡下的Auto Save(自動保存)窗口訪問這些預(yù)制件及其子項迷捧。

Auto Save’s Settings 自動保存設(shè)置

Auto Save 窗口中的“設(shè)置”選項卡允許您選擇各種選項。以下是主要選項的簡要說明:

When to Load / When to Save 何時加載/何時保存
允許你選擇何時保存和加載胀葱,這對應(yīng)于Unity’s Event Functions

  • 我們建議在所有平臺上都在Start方法中去加載
  • 在移動平臺上在On Application Pause的時候去存儲
  • 在所有非移動平臺上在On Application Quit的時候去存儲漠秋。

Filename/Path 文件名/路徑
這是一個文件的相對或絕對路徑,將被創(chuàng)建來存儲我們的自動保存數(shù)據(jù)抵屿。
Tag 標(biāo)簽
一個標(biāo)簽允許我們在一個可能包含許多不同的自動保存數(shù)據(jù)組的文件中唯一標(biāo)識這個自動保存數(shù)據(jù)庆锦。
例如,如果您打算將兩個不同場景中的不同數(shù)據(jù)自動保存到同一文件轧葛,則應(yīng)為每個場景使用不同的標(biāo)簽搂抒⊥Р螅或者,您可以為每個場景設(shè)置不同的文件名求晶。
Manually triggering Auto Save 手動觸發(fā)自動保存
有時您可能想要使用按鈕觸發(fā)自動保存焰雕,或者在您自己的事件中。
只需找到附加到ES2自動保存管理器對象的ES2自動保存管理器腳本芳杏,并調(diào)用它的Save()和Load()方法矩屁。
在代碼中獲取ES2自動保存管理器最簡單的方法如下

ES2AutoSaveManager mgr = GameObject.Find("ES2 Auto Save Manager").GetComponent<ES2AutoSaveManager>();

執(zhí)行此操作時,可能還需要將設(shè)置中的“Save”和“Load”事件設(shè)置為“None”蚜锨,以便只有在手動觸發(fā)游戲時才會自動保存游戲档插。
Known Beta Issues 了解測試版存在的問題
有時在退出Unity 5.3.3f1版本時,Auto Save/Prefabs中的選擇不會被保存亚再。
Unity的錯誤郭膛。請使用5.3.2f1或更低版本,或等待Unity的修復(fù)氛悬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末则剃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子如捅,更是在濱河造成了極大的恐慌棍现,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镜遣,死亡現(xiàn)場離奇詭異己肮,居然都是意外死亡,警方通過查閱死者的電腦和手機悲关,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門谎僻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寓辱,你說我怎么就攤上這事艘绍。” “怎么了秫筏?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵诱鞠,是天一觀的道長。 經(jīng)常有香客問我这敬,道長航夺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任崔涂,我火速辦了婚禮敷存,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己锚烦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布帝雇。 她就那樣靜靜地躺著涮俄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尸闸。 梳的紋絲不亂的頭發(fā)上彻亲,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音吮廉,去河邊找鬼苞尝。 笑死,一個胖子當(dāng)著我的面吹牛宦芦,可吹牛的內(nèi)容都是我干的宙址。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼调卑,長吁一口氣:“原來是場噩夢啊……” “哼抡砂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起恬涧,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤注益,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后溯捆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丑搔,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年提揍,在試婚紗的時候發(fā)現(xiàn)自己被綠了啤月。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡碳锈,死狀恐怖顽冶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情售碳,我是刑警寧澤强重,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贸人,受9級特大地震影響间景,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艺智,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一倘要、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦封拧、人聲如沸志鹃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曹铃。三九已至,卻和暖如春捧杉,著一層夾襖步出監(jiān)牢的瞬間陕见,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工味抖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留评甜,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓仔涩,卻偏偏與公主長得像扑浸,于是被迫代替她去往敵國和親搁料。 傳聞我的和親對象是個殘疾皇子瑟幕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容