Unity3D遊戲開發之使用disunity提取Unity3D遊戲資源
各位朋友,大家好,我是秦元培。今天博主想和分享的是使用disunity提取Unity3D遊戲素材。這個工具呢,博主在Unity3D遊戲開發之反編譯AssetBundle提取遊戲資源這篇文章中其實已經提到過了,不過因為有些朋友對如何使用這個工具依然存在問題,所以博主決定特地寫一篇文章來講解如何使用disunity來提取Unity3D遊戲中的素材。
準備工作
- disunity:負責對Unity3D的資料檔案進行解包
- Unity3D:負責將匯出的資料檔案顯示出來
- Bleander或者3DsMax:負責Unity3D資料檔案的轉換處理,二選一即可。個人推薦Blender。
- Java:負責為disunity提供編譯環境
測試檔案
提取流程
好了,在確定做好所有的準備工作後,我們就可以正式開始今天的內容了!
編譯disunity
雖然我們可以從disunity的專案主頁中下載release版本,不過為了保險起見,博主依然建議大家自行編譯disunity。編譯的方法是在命令列中切換到disunity的目錄,然後執行命令:
java -jar disunity.jar
如果大家的Java環境沒有任何問題的話,那麼接下來我們就應該可以看到:
[Info] DisUnity v0.3.4
以及各種關於這個工具的使用方法和引數選項。那麼好了,現在我們就來熟悉下disunity這個工具的常用命令。disunity命令的基本形式是:
disunity [CommandName] [CommandOptions]
disunity命令
- dump:將一個二進位制的物件轉化成人類可以閱讀的文字資訊。
- dump-struct:將一個二進位制的物件轉化為結構化的資訊。
- extract:將Unity3D的資料檔案轉化為常見的文字、聲音、圖片等資訊。
- extract-raw:將Unity3D的資料檔案轉化為可序列化的物件,在extract命令不被支援的情況下使用。
- extract-txt:和dump命令類似輸出轉換結果到命令列。
- extract-struct:和dump-struct命令類似輸出轉換結果到命令列。
- info:輸出Unity3D的資料檔案和AssetBundle檔案的變數資訊。
- bundle-extract:釋放所有的被打包到AssetBundle中的檔案。
- bundle-inject:將從AssetBundle中打包的檔案重新打包
暫時先介紹這些,因為其它的命令我們基本用不到,如果需要深入研究這些命令,可以參考disunity專案中的README.md檔案。
解析《新仙劍OL 》的AssetBundle檔案
這裡我們以遊戲目錄/assetbundles/NPC/Models/下的s049.unity3d_CC9026FB為例來講解遊戲模型的提取。
模型檔案提取
首先我們將這個檔案的副檔名改為s049.unity3d,因為這是它原始的副檔名,是Unity3D中匯出AssetBundle的一種檔案格式。好了,我們將這個檔案放在一個無中文路徑的目錄下,這裡以C:\Users\Robin\Desktop即桌面為例。注意首先進入disunity的目錄,然後執行命令:
disunity extract C:\Users\Robin\Desktop\s049.unity3d
接下來會在桌面生成一個名為s049的資料夾,在這個資料夾中找到Mesh的子資料夾,會得到一個s049.obj的檔案,這個檔案就是我們提取到的模型檔案。
模型貼圖提取
好了,下面我們再來看看怎麼提取這個模型檔案對應的貼圖,在遊戲目錄/assetbundles/NPC/Texture/下有一個名為s049_1.unity3d_1D2446B9的檔案,這就是s049這個模型對應的貼圖了。同樣地,我們將其重新命名為s049_1.unity3d然後執行命令:
disunity extract C:\Users\Robin\Desktop\s049_1.unity3d
接下來在桌面上生成一個名為s049_1的資料夾,在這個資料夾中找到Texture2D的子資料夾,會得到一個名為s049_1.dds的貼圖檔案,這就是我們要提取的模型s049的貼圖檔案。
將模型和貼圖合併
我們開啟Blender並將s049.obj檔案匯入,然後將場景中預設的燈光和攝像機都刪除,因為我們只需要一個模型檔案,我們發現在Blender中已經可以看到模型了,因為Unity3D中使用的是FBX模型,所以我們這裡將模型檔案匯出為FBX備用。因為Unity3D可以識別dds型別的貼圖,所以對貼圖我們不用做任何處理。
開啟Unity3D將童年林月如的模型和貼圖一起匯入,將童年林月如的模型拖入到遊戲場景中,因為模型的尺寸沒有經過調整,所以模型剛開始可能會比較小,我們可以在Unity3D進行區域性的調整。接下來我們會發現模型沒有貼圖,只要選擇這個模型然後在屬性視窗為它附上s049_1.dds的貼圖檔案即可。下面是童年林月如的模型匯入Unity3D以後的效果:
解析《新仙劍OL》的assets檔案
和AssetBundle不同,assets檔案是整個Unity3D專案中專案資源的打包集合,比如說Asset檔案下的資源都會被打包到這裡,所以說解析assets檔案可能會有更大的收穫吧!因為所有的Unity3D遊戲都會有這樣的檔案,而AssetBundle檔案只有在使用了這項技術的遊戲專案中才有。比如說在Unity3D中有一個重要的Resource資料夾,這個資料夾打包後被被打包成resources.assets檔案。這裡我們以xianjian_Data/resources.assets檔案為例。首先執行命名:
disunity extract C:\Users\Robin\Desktop\resources.assets
接下來會在桌面生成一個resources的資料夾,開啟這個資料夾我們會發現三個子資料夾,分別是Shader、TextAsset和Texture2D。解析的結果似乎有點失望,不過在TextAsset資料夾下我們會找到一個叫做ResourceFiles.txt的檔案,這是一個純文字檔案,我們可以直接開啟,開啟後我們發現它的內容是一個Xml檔案,並且在這個Xml檔案中定義了遊戲中使用的各種資源的路徑,不過這些資源都是以AssetBundle的形式來定義的。這說明什麼呢?這說明《新仙劍OL》的場景和介面資源是通過動態載入的方式載入到遊戲當中的,而這些資源則是通過這個Xml檔案來配置和管理的,這符合我們平時在Unity3D遊戲開發中的觀點和方法。通過這個檔案,我們找到了assetbundles/config/movieconfig.unity3d這個檔案,這是一個負責維護遊戲中場景過場動畫的檔案。下面我們就來嘗試解析這個檔案,不過遊戲製作方對config資料夾下的內容進行了加密,因為在這個資料夾下面是兩個AssetBundle檔案,博主嘗試用extract和bundle-extract兩個命令進行解析,可是得到的只是些文字檔案,對我們繼續研究沒有什麼幫助。那麼好了,現在我們能夠進行解析的只有xinjian_Data/sharedassets0.assets檔案了:
disunity extract C:\Users\Robin\Desktop\sharedassets0.assets
這個解出來的話是些沒有什麼用的貼圖檔案,看來如果要提取音樂或者圖片的話,還需要進行更加深入的研究才行啊。
解析《雨血前傳.蜃樓》的assets檔案
因為解析《新仙劍OL》的assets檔案沒有得到什麼有用的東西,所以我們接下來來嘗試解析《雨血前傳.蜃樓》的assets檔案。這款遊戲是博主比較喜歡的一款遊戲,基於Unity3DY引擎,而且這款遊戲是作為Unity3D官方範例來推廣的,因此研究這款遊戲對我們提高Unity3D的資源打包機制會比較有幫助。好了,我們直接上手:
disunity extract C:\Users\Robin\Desktop\resources.assets
哈哈,這款遊戲果然沒有讓我們失望,我們得到了什麼呢?
總結
- 不同的遊戲採用的資源配置方案都不同,不過一般可以從resources.assets這個檔案入手作為突破點。
- 如果能拿到遊戲中資料配置方案,對於我們提取遊戲中的素材會有較大的幫助,因為這樣方向性會更強些。
- 通過AssetBundle動態載入到場景中最好還是採用一個配置表來進行配置,這樣便於我們管理和維護整個遊戲專案。
- 如果沒有伺服器段的干預,理論上只要修改了本地的AssetBundle檔案就可以實現對遊戲內容和資料的更改,換句話說,可以做外掛和修改器。