Unity3D研究院之將場景導出XML或JSON或二進制並且解析還原場景《二》

本文轉載自雨鬆大大


導出Unity場景的所有遊戲對象信息,一種是XML一種是JSON。本篇文章我們把遊戲場景中游戲對象的、旋轉、縮放、平移與Prefab的名稱導出在XML與JSON中。然後解析剛剛導出的XML或JSON通過腳本把導出的遊戲場景還原。在Unity官網上下載隨便下載一個demo Project,如下圖所示這是我剛剛在官網上下載的一個範例程序。

 

Unity3D研究院之將場景導出XML或JSON或二進制並且解析還原場景(四十二) - 雨鬆MOMO程序研究院 - 1

 

          接着將層次視圖中的所有遊戲對象都封裝成Prefab保存在資源路徑中,這裏注意一下如果你的Prefab綁定的腳本中有public Object 的話 ,需要在代碼中改一下。。用 Find() FindTag()這類方法在腳本中Awake()方法中來拿,不然Prefab動態加載的時候無法賦值的,如下圖所示,我把封裝的Prefab對象都放在了Resources/Prefab文件夾下。

Unity3D研究院之將場景導出XML或JSON或二進制並且解析還原場景(四十二) - 雨鬆MOMO程序研究院 - 2

 

OK,現在我們就需要編寫我們的導出工具、在Project視圖中創建Editor文件夾,接着創建腳本MyEditor 。如下圖所示。

Unity3D研究院之將場景導出XML或JSON或二進制並且解析還原場景(四十二) - 雨鬆MOMO程序研究院 - 3

 

因爲編輯的遊戲場景數量比較多,導出的時候我們需要遍歷所有的遊戲場景,一個一個的讀取場景信息。然後取得遊戲場景中所有遊戲對象的Prefab的 名稱 旋轉 縮放 平移。有關XML的使用請大家看我的上一篇文章: Unity3D研究院之使用 C#合成解析XML與JSON(四十一) 代碼中我只註釋重點的部分,嘿嘿。

 MyEditor.cs

 

OK。此時我們就可以導出遊戲場景的信息拉,注意遊戲場景的需要現在Project Setting 中註冊。點擊 GameObject – > Export    XML 和 GameObject – > ExportJson 菜單項即可開始生成。

 

Unity3D研究院之將場景導出XML或JSON或二進制並且解析還原場景(四十二) - 雨鬆MOMO程序研究院 - 4

 

如下圖所示,場景導出完畢後,會將xml 與Json 文件保存在StreamingAssets路徑下,放在這裏的原因是方便移動平臺移植,因爲它們屬於二進制文件,移動平臺在讀取二進制文件的路徑是不一樣的。一定要放在這裏喔。

 

Unity3D研究院之將場景導出XML或JSON或二進制並且解析還原場景(四十二) - 雨鬆MOMO程序研究院 - 5

 

接着,我繼續創建兩個遊戲場景,一個用來解析XML的場景,一個用來解析JSON的場景。 

XML場景中,創建一個空的遊戲對象,把XML.cs掛上去。

 

接着JSON場景中,創建一個空的遊戲對象,把JSON.cs掛上去。

 

本例XML和JSON的解析與還原場景,在IOS真實設備上測試通過。

 

Unity3D研究院之將場景導出XML或JSON或二進制並且解析還原場景(四十二) - 雨鬆MOMO程序研究院 - 6

 

本例的下載地址:http://vdisk.weibo.com/s/k0_DE

雨鬆MOMO 祝大家學習愉快,準備睡覺,安 。歡迎討論與學習 嘿嘿。

補充

最近在做客戶端與服務器的交互,使用JSON 和XML會感覺數據量太大,影響效率。最後使用二進制的方式來完成。如下圖所示,使用二進制可以把空間節省到803K ,是不是很不錯呢? 下面我們開始學習如何製作吧。

 

Unity3D研究院之將場景導出XML或JSON或二進制並且解析還原場景(四十二) - 雨鬆MOMO程序研究院 - 7

 

導出場景時增加導出二進制文件選項,代碼如下。

 

 

註解

在寫入二進制數據時用到的核心類就是BinaryWriter ,Binary是二進制的意思 ,可見操作二進制寫入就用BinaryWriter了。 常用的數據類型會分配固定的字節數量,假設BinaryWriter 寫入一個short 那麼就佔2字節,寫一個 int 就佔4字節,如果是數組的話需要數組類型字節長度在乘以數組長度。

byte:一個字節(8位) 
short:兩個字節(16位) 
int:四個字節(32位)(一個字長) 
long:八個字節(64位)
float:四個字節(32位)
double:八個字節(64位)

然後在說說string,字符串它並不是標準的數據類型,它是一個對象 object 那麼它的字節長度就是可變的。開始我也在string 上糾結了一小會兒。還有BinaryWriter 在寫入string 的時候會現將字符串的長度以byte的形式儲存,然後在儲存字符串的字節長度。那麼在解析字符串的時候需要先解析字符串長度,然後在根據長度取得後面對應長度的字節數組,再把這個字節數組轉換成string就行啦。還有,上面我用的是short x 100 其實上爲了節省長度, 因爲short是2字節,float是4字節。我在解析的時候用short 在除以100 就可以 換算成float拉。

然後我們在看看解析的代碼,寫入的時候我們用的是BinaryWriter 那麼讀取的時候應該是 BinaryReader。

Binary.cs

 

運行一下,場景依然生成的非常完美,在處理二進制解析的時候需要特別注意的就是字節對齊,因爲你的所有數據其實就是一個byte[]字節數組,需要有理有序的把字節數組拆分,然後在轉換成對應的數據,所以一定要對齊不然肯定會出錯的。

 

Unity3D研究院之將場景導出XML或JSON或二進制並且解析還原場景(四十二) - 雨鬆MOMO程序研究院 - 8

 

最後把代碼放出來,晚安 Good Ngith 哇咔咔。

下載地址 :http://vdisk.weibo.com/s/la_QE 

 

留言中剛好有人討論到這塊。另外還有一種方式也可以實現動態增加建立場景,使用.unity 來實現場景的加載,我覺得這種方式可能會更好一些。我在網上已經發現有人寫了,那就轉載過來吧。

原文地址:http://blog.csdn.net/cony100/article/details/8842919

在Unity3d中,場景(scene)多半通過在build settings中點擊add current或者把場景拖進面板實現,假如不這麼做,你的場景便不會被加載,哪怕你制定了絕對路徑。

就是說,一個遊戲裏要加載多少場景多半都是固定的。

這樣的方法會有很多不便,不容易動態加載場景。所以我們今天要說的,是一種動態加載場景的方法。

首先,你需要一個編輯器文件,放在editor文件夾下。注意,這個文件不可以繼承自monobehaviour

這樣,在你的unity編輯器上出現了一個按鈕,你執行這個按鈕,則會在你的Assets同級目錄下出現你build好的streamed.unity3d文件,你把這個文件放在服務器上,下面一步就是下載這個文件並build了。

大家注意到了嗎。下載好以後就可以直接loadlevel了,不需要手動進行add current的操作了。

 

這裏還有一篇聖典翻譯的文章 http://game.ceeger.com/Script/BuildPipeline/BuildPipeline.BuildStreamedSceneAssetBundle.html

     最後我在補充一下使用.unity3d確實方便很多,因爲它不僅會把場景打包進去,並且還會把場景中對應的資源文件打包進去。舉個例子,你將美工做好的模型文件放在Project視圖中,然後在將模型放在Hierarchy視圖中的 100,100,100座標點中,最後把該場景打包成.unity3d文件。此時你在新建一個工程只需下載剛剛打包的場景文件,他會自動把模型放在 100,100,100座標點中。

      這說明場景文件,包含了該場景中所用到的所有模型,並且還包含了模型資源與Hierarchy視圖的關係。它會帶來一個弊端,比如你有N個場景,每個場景中都有相同的模型文件,這樣每個場景都需要重複下載這些相同的模型文件,所以我覺得最好還是使用assetbundle來對同類的資源文件進行分包處理。


發佈了49 篇原創文章 · 獲贊 11 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章