iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0
自我挑戰組

深入淺出做中學Unity系列 第 7

Unity – 關於保留美好回憶這件小事(2)

  • 分享至 

  • xImage
  •  

接續上一篇的關於保留美好回憶這件小事(1),那麼在有了圖像之後,該如何留存影像呢?今天就讓我娓娓道來 :

儲存與讀取 (Save and Load)

儲存,即是將資料儲存在可永久紀錄的空間,可能是本機的硬碟檔案、雲端伺服器空間等或者是其他儲存設備;讀取,便是將該資料從儲存設備中取出。

若要本機端硬碟儲存資料大致上有以下幾種方式:

PlayerPrefs (in String)
1. 需考慮在各個平台實作的容量限制
2. Windows 平台,若是 standard format 僅有 1MB 容量
3. 若序列化檔案格式非字串,則須考慮使用 Base64 轉換成字串後儲存

void PlayerPrefsExample(byte[] serializedData)
{
   var s = System.Convert.ToBase64String(serializedData);
   PlayerPrefsExample(s);
}

void PlayerPrefsExample(string serializedData)
{
   const string key = "gamesave";
   
   // Save
   UnityEngine.PlayerPrefs.SetString(key, serializedData);
   
   // Load
   serializedData = UnityEngine.PlayerPrefs.GetString(key);
}

寫入檔案

遊戲存檔最適合方案
一律寫入到 Unity 所提供長期儲存的資料夾路徑 Application.persistentDataPath
要注意上述路徑在 Android & iOS 會根據 Bundle Identifier 來產生(改變 Bundle Identifier 將無法讀取到之前得檔案)

using UnityEngine;
using System.IO;
using System.Text;

void FileExample(string serizliedData)
{
   var raws = Encoding.UTF8.GetBytes(serizliedData);
   FileExample(raws);
}

void FileExample(byte[] serizliedData)
{
   const string fileName = "gamesave.dat";
   var filePath = Application.persistentDataPath + "/" + fileName;

   // Save
   try
   {
      File.WriteAllBytes(filePath, serizliedData);
   }
   catch (System.Exception e)
   {
      // TODO: Handle exception
   }

   // Load
   try
   {
      serizliedData = File.ReadAllBytes(filePath);
   }
   catch (System.Exception e)
   {
      // TODO: Handle exception
   }
}

如果是雲端伺服器空間,那就得看雲端伺服器的 API 文件來進行操作,例如 Firebase 可參考其文件:Firebase: Saving Data,串接 Steam 可參考其文件:Steamworks: Steam Cloud。

完整存檔讀取範例,採用 JSON 格式寫入至硬碟檔案

public static void Save(object gameState, string fileName = "gamesave.dat")
{
   var serializedData = JsonUtility.ToJson(gameState);
   var filePath = Application.persistentDataPath + "/" + fileName;
   File.WriteAllBytes(filePath, serizliedData);
}

public static T Load<T>(string fileName = "gamesave.dat")
{
   var filePath = Application.persistentDataPath + "/" + fileName;
   var serizliedData = ([]byte)(null)
   try
   {
      serizliedData = File.ReadAllBytes(filePath);
   }
   catch (System.IO.FileNotFoundException)
   {
      return null;
   }
   return JsonUtility.FromJson<T>(serializedData);
}

如此一來也能將想保留的事物以影像的方式留存下來了,下一篇將要講的是如何保留文字的方式,有興趣的話千萬別錯過,每週一到五中午12點,Sun師綜合台 - 關於保留美好回憶這件小事。


上一篇
Unity - 關於保留美好回憶這件小事(1)
下一篇
Unity - 關於保留美好回憶這件小事(3)
系列文
深入淺出做中學Unity9
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言