Unity序列化 基本篇
此篇我想來跟大家聊聊序列化。在此之前如果你已經知道什麼是序列化了,那這篇文章的難度可能不太適合你。在本文中我會盡可能簡單的來介紹unity中你會碰上的序列化。
序列化概念
要談序列化前要先來談談電腦的運作原理。在這邊我把電腦簡化到剩下CPU、記憶體、還有硬碟
當你辛辛苦苦在unity裡面洋洋灑灑寫了300行代碼,按下執行之後系統會做某些事來運行你的代碼。系統會根據你寫的類別生成相應的物件並且配置到記憶體裡面,這個過程我們稱之為實例化。
實例化出來的物件存在於記憶體,而記憶體中的資料只要遊戲結束或是整台電腦爆炸就會消失的一乾二淨。
那如果我想要把我的遊戲進度保存的話,必須把記憶體中的資料再把他存回硬碟裡面。
這個行為就是序列化。
反之把序列化後的資料載入回記憶體就是反序列化。
序列化的格式
資料存在記憶體時與存在硬碟時,因為電腦的架構所以格式會有所不同,至於原因,這有點超出本文的範圍了,有機會再跟大家講解。
因為格式上的不同,在操作序列化時必須給定一個格式,記憶體中的資料會依據你給定的格式儲存在硬碟中。
這邊介紹幾個常見的序列化格式。
1.Json
2.Xml
3.potobuf
每一種檔案格式都有各自的特色,分別來簡單介紹。
json
目前算是很主流的序列化方案,有很多的插件可以選用,unity官方也有提供相關的工具,因為序列化出來的文件可讀性還算高,熟悉格式的人也可以直接修改檔案,算是非常方便。
[圖片Json]
xml
Xml是一種標記語言,簡單來說就是會用<>和</>把資料夾住,如果有看過HTML的程式碼應該有概念。相比於Json Xml算是一個比較古老的語言,常用在網路傳輸,因為格式統一性高。其實同一種格式例如Json,也有可能因為序列化的插件不同而有不同的結構。在這邊Xml就比較沒有這個問題。
[圖片 Xml]
potobuf
由google開發維護,強項在於高效率跟資料壓縮,potobuf在序列化的時候會盡可能的壓縮檔案,例如bool值只存false值這樣可以在解析時藉由有沒有保存該值來判斷是true或是false以節省一半的大小。這一點在網路傳輸上來講非常有優勢(可以減少流量。但卻有一個缺點potobuf在儲存的時候是用2進制來儲存,幾乎沒有可讀性。
[圖片 Potobuf]
如何使用?
接下來我會實際操作一次序列化,我用的是unity官方的Json工具。
我先定義一個類
這個類是玩家資料類,是一個單純的C#類,主要保存了玩家的資料如血量、等級。
[代碼] 基本的玩家類
接下來再編寫一個測試類,這是一個mono類,用來測試序列化。
[代碼] 測試腳本
運行後可以看到玩家的資料,按下A鍵可以扣血。
最後按下S鍵序列化,序列化後可以看到畫面輸出了一大堆文字,這些就是序列化後的資料。
[GIF] 輸出結果
再來修改代碼,把序列化後的資料保存成檔案並寫入硬碟。
[代碼] 寫入硬碟
再加上反序列化方法。
[代碼] 反序列化
Start函數也修改一下
最後你可以看到角色的資料被完好的保存了。
[GIF]運行結果
此系列的代碼可以在這個儲存庫瀏覽
以上是最簡單的序列化應用。
基礎篇的內容大概就是這樣了,剩下的我們進階篇再見。
如果你喜歡我這樣的文章可以GP 訂閱 留言
最後讓我抱怨一下,巴哈的小屋沒有辦法用網頁嵌入真的很不方便,都2020了欸確定不支援一下markdown格式嗎www