第69節 - Unity: File I/O, Read & Write Text File & PlayerPrefs
我在第28節 - LibGDX: File I/O (Preferences)介紹過LibGDX的File I/O,File I/O就是用來把遊戲的資料儲存在電腦或手機上,每次開啟遊戲時程式就可以讀取遊戲資料,繼續遊戲。
這一節我會介紹Unity: File I/O & PlayerPrefs,主要介紹二種方法(Read & Write Text File和PlayerPrefs),當大家學會讀取和儲存數據,我會在下一節介紹如何讀取遊戲的狀況(Game State),再介紹如何製作Level Selection Screen,現在我會介紹以下方法:

1: Read File Using Drag & Drop Text File
2: Read File Using Resources.Load() Method
3: Read File Using File.ReadAllLines() Method
4: Read File Using StreamReader Class and Stored in String
5: Read File Using StreamReader Class and Stored in List<T>
6: Read & Write File Using StreamReader & StreamWriter Class
7: Read & Write File Using PlayerPrefs (Example no.1 - Game HighScore)
8: Read & Write File Using PlayerPrefs (Example no.2 - English-Chinese Dictionary)
1.0) Read File Using Drag & Drop Text File
第一個例子運用Drag & Drop(拖放),把一個預設的Text File (.txt檔案)拖放到Unity的Inspector內:

- 選擇Main Camera。
- 建立Assets/Resources directory。
- 把C# MyScript1拖放到Main Camera內,再製作一個text file "myfile.txt",把它拖放到C# MyScript1內。
注意: myfile.txt檔案可以用Notepad製作。

- 大家可用Notepad製作以上三行的文字檔案(myfile.txt)。

- 建立一個public TextAsset dataFile物件,這樣做就可以在Inspector內把text file "myfile.txt",拖放到C# MyScript1內。
- 把text file "myfile.txt"的三行資料讀取到Array dataLines[ ]內。
- 再把Array dataLines[ ]內的三行資料用分號"," 分析開,再儲存在Array dataPairs[ ][ ]內。

- 執行結果。
2.0) Read File Using Resources.Load() Method
這一個例子運用C# Script Resources.Load()方法讀取檔案。
注意: 這一個例子會把文字檔案的所有內容一次過讀入一個TestAsset dataFile物件內,再作下一步處理,如果文字檔案的內容太大,就會影響執行效率,解決方法就是改用就四個例子,改用ScreamReader類別,我會詳細介紹。

- 選擇Main Camera。
- 把C# MyScript2拖放到Main Camera內。

- 建立一個TextAsset dataFile物件,用Resources.Load()方法讀取檔案
注意: 文字檔案必須放在Asset/Resources Directory內。 - 把text file "myfile.txt"的三行資料讀取到Array dataLines[ ]內。
- 再把Array dataLines[ ]內的三行資料用分號"," 分析開,再儲存在Array dataPairs[ ][ ]內。

- 執行結果。
3.0) Read File Using File.ReadAllLines() Method
這一個例子運用C# Script File.ReadAllLines()方法讀取檔案。
注意: 與第二個例子相似,這一個例子會把文字檔案的所有內容一次過讀入一個TestAsset dataFile物件內,再作下一步處理,如果文字檔案的內容太大,就會影響執行效率,解決方法就是改用就四個例子,改用ScreamReader類別,我會詳細介紹。

- 選擇Main Camera。
- 把C# MyScript3拖放到Main Camera內。

- 建立一個TextAsset dataFile物件,用Resources.Load()方法讀取檔案 。
- 把text file "myfile.txt"的三行資料讀取到Array dataLines[ ]內。
- 再把Array dataLines[ ]內的三行資料用分號"," 分析開,再儲存在Array dataPairs[ ][ ]內。

- 執行結果。
4.0) Read File Using StreamReader Class and Stored in String
這一個方法運用C# Script StreamReader類別讀取資料,它的好處是每次只讀取一行資料,程式執行效率大大提升。

- 選擇Main Camera。
- 把C# MyScript4拖放到Main Camera內。

- 建立一個TextReader reader物件。
- 用reader.ReadLine()方法讀取檔案。

- 執行結果。
5.0) Read File Using StreamReader Class and Store in List
這一個例子會把例子四運用C# Script StreamReader類別讀取資料,再把資料儲存在於List<T>內,它的好處是除了每次只讀取一行資料,程式執行效率大大提升外,資料儲存在List<T>內可以在程式執行時的任何時間內讀取資料。

- 選擇Main Camera。
- 把C# MyScript5拖放到Main Camera內。

- 建立一個StreamReader reader物件。
- 用reader.ReadLine()方法讀取檔案。
- 再把每行資料儲存在List<string>內。
- 大家也可以把每行資料儲存在Array內。

- 執行結果。
6.0) Read & Write File Using StreamReader & StreamWriter Class
這一個方法會把例子五運用C# Script StreamReader類別讀取資料和運用StreamWriter把資料儲存在一個新的文字檔案內。

- 選擇Main Camera。
- 把C# MyScript6拖放到Main Camera內。

- 選擇Main Camera。
- 建立Assets/Resources directory。
- 把C# MyScript1拖放到Main Camera內,再製作一個text file "myfile2.txt",把它拖放到C# MyScript6內。
注意: myfile2.txt檔案可以用Notepad製作。

- 大家可用地Notepad製作以上空文字檔案(myfile.txt)。

- 建立文字檔案儲存路徑。
- 建立要儲存的資料。
- 用StreamWriter類別儲存文字檔案。
- 用StreamReader類別讀取文字檔案。

- 執行結果。
7.0) Read & Write File Using PlayerPrefs (Example no.1 - Game HighScore)
我在第28節 - LibGDX: File I/O (Preferences)介紹過LibGDX的Preferences,它與Unity的PlayerPrefs相似,它只可以用來儲存key-value pair的資料,則是只可以一對一,例如: HighScore=100等。

- 選擇Main Camera。
- 把C# MyScript7拖放到Main Camera內。

- 用PlayerPrefs.SetInt(Highscore, 100)方法建立須要儲存的資料。
注意: 儲存的資料只可以是key-value pair,則是只可以一對一,例如: HighScore=100等。 - 用PlayerPrefe.Save())方法儲存資料。
- 用PlayerPrefs.GetInt(key, 0)方法方法讀取資料。
注意: 在GetInt(key, 0) 的0是代表如果找不到key的值,就把指定的數值儲存到key上,即key=0。

- 執行結果。

- Data Type可以是PlayerPrefs.GetInt(key, value)、PlayerPrefs.GetString(key, value)或PlayerPrefs.GetFloat(key, value)。
以下是PlayerPrefs檔案在Windows 10儲存的位置。

- 選擇Run。
- 輸入regedit。
- 按下OK。

- 選擇在以上路徑。
- 就可以找到key = HighScore。
- Double Click就可以顯示Value = 100。
8.0) Read & Write File Using PlayerPrefs (Example no.2 - English-Chinese Dictionary)
以下會用PlayerPrefs舉一個英譯中字典(English-Chinese Dictionary)例子:

- 建立一個Canvas。
- 設定Canvas的不同值。
- 選擇Main Camera,把Main Camera拖放到Render Camera內。

- 在於Canvas內建立一個Text。
- 把C# MyScript8拖放到Text內。

- 用PlayerPrefs.SetString(key, value)方法建立須要儲存的資料。
注意: 儲存的資料只可以是key-value pair,則是只可以一對一,例如: HighScore=100等。
用PlayerPrefe.Save())方法儲存資料。 - 用PlayerPrefs.GetString(key, "Zero")方法方法讀取資料。
注意: 在GetString(key, "Zero") 的"Zero"是代表如果找不到key的值,就把指定的數值儲存到key上,即key=Zero。 - 顯示讀取資料。

- Scene結果畫面。

- Unity Console執行結果。

- 遊戲執行結果。