Unity資產,特殊資料夾以及重要路徑

ivy_0709發表於2018-07-26

     本文將介紹Unity中的資產,Unity中的特殊資料夾,Unity的一些路徑對應各個平臺上的具體路徑。

     第一部分就是介紹資產Assets——哪些是Assets,Assets型別具體有哪些,如何在編輯器中搜尋特定的Assets,與Assets息息相關的meta檔案,對於從外界匯入的Assets怎麼進行流程化處理,如何設定對於一些二進位制的資產進行序列化。

     第二部分是Unity工程目錄下的一些有特定用處特殊命名的資料夾。

     第三部分介紹 Application.dataPath,Application.streamingAssetsPath,Application.persistentDataPath,Application.temporaryCachePath這四個介面在IOS,Android和Windows下具體的路徑在哪裡。

    第四部分是Unity自帶的工具。

目錄

一:資產型別

1.資產(Asset)和資源(Resource)的區別:

2.資產型別(通過副檔名識別):

3.搜尋資產和載入資產

4.資產meta檔案

5.資產匯入

6.資產序列化

二:特殊資料夾

1.Assets資料夾下的特殊資料夾

2.Library資料夾

1)ScriptAssemblies資料夾 

2)metadata資料夾

3)AtlasCache 和 ShaderCache

3.ProjectSettings資料夾

4.Temp

三:重要路徑

iOS

1.四個路徑對應的平臺下的路徑

2.app的獨立資料儲存目錄

3.各路徑對應的OC訪問方法

Android

1.四個路徑對應的平臺下的路徑

2.重要目錄

Windows:

四:Unity工具

1.檢視unity裡的二進位制檔案

參考:



一:資產型別

1.資產(Asset)和資源(Resource)的區別:

資產:Assets目錄下的所有檔案和資料夾

資源:Resources特殊目錄下的檔案

 

2.資產型別(通過副檔名識別):

場景(.unity)

預置體(.prefab)

模型(.fbx)

貼圖(.jpeg/.png/.tga/…)

指令碼(.cs/.js)

文字(.txt/.bytes/.json/…)

•聲音等

特別的,對於Lua指令碼

因為副檔名是.lua不能被Unity識別為TextAsset

所以打包lua時候:先改副檔名 .bytes--》再打包AssetBundle--》最後再改回來

 

3.搜尋資產和載入資產

1.Project 檢視: 搜尋框輸入比如  t:Prefab   t:Mesh   t:Scene   t:Model   t:ScriptableObject (等價於點選搜尋框右邊的 SearchByType)

2.程式碼中使用搜尋:介面 AssetDatabase.FindAssets

string[] guids = AssetDatabase.FindAssets("t:Mesh", searchFolder);

3.程式碼中載入資產,使用對應的類:介面 AssetDatabase.LoadAssetAtPath

 AudioClip audioClip = AssetDatabase.LoadAssetAtPath("XXXX路徑下音訊名.wav",typeof(AudioClip)) as AudioClip;

 

4.資產meta檔案

Asset中的所有檔案、資料夾,經過unity的匯入過程後,會為每個都生成一個.meta檔案,這個檔案是unity內部管理檔案的重要內容,包含:

1)GUID(標識資產的唯一編號)。 優點之一是物件之間的引用不是通過資產路徑來引用,而是通過GUID來引用。所以改變資產路徑不會使得引用失效。所以一旦Meta中的GUID變更了,就要注意,它很可能引起一場引用丟失的災難。編輯器中使用AssetDatabase.GUIDToAssetPathAssetDatabase.AssetPathToGUID中可以進行互轉。

 

       GUID保持不變的情況:移動、重新命名、改動資原始檔,都對GUID沒有影響,GUID還是指向這個資原始檔。

       GUID改變的情況:注意不要隨意刪除資原始檔相關的meta檔案。如果刪除了meta檔案,unity會認為原始的資原始檔被刪除了,並給此資源重新生成一個新的GUID。(為什麼有時候場景中資源的引用會突然斷開)

 

2)匯入設定(default import setting):可以在meta檔案中找一下在匯入設定中的對應專案。

根據不同的檔案型別,它的資料是不同的ImportSetting資料,比如上面的NativeFormatImporter、ModelImporter、AudioImporter等等。只要對照Inspector皮膚中的條目,都可以看懂每一行的意義。所以假如我們把一個檔案和這個檔案的Meta檔案從一個Unity工程複製到另一個Unity工程中,它的配置是不會變的

比如在出現了dll出現在多個地方的錯誤: Plugin xxx is used from several locations ,就需要看下其Inspector設定中平臺選擇,修改過以後再看meta檔案就有了相應的修改,就不會出錯了

https://blog.csdn.net/huihut/article/details/86114865

 

 

關於meta檔案

       1. 新增資產檔案或資料夾,一定要連同生成的meta檔案一同提交。

       2. 重新命名和移動要在Unity內進行,這樣可以保證相應的meta檔案自動完成相應操作。

       3. 複製資產時儘量在Unity內用Ctrl+D進行,這樣會生成GUID不同的meta檔案。

       4. 用指令碼操作資產時要注意meta檔案的同步,儘量用AssetDatabase類的API而非檔案I/O。

       5. AssetDatabase.Refresh() 何時使用:當你使用System.IO 的東西去增刪檔案的時候,需要呼叫這個函式把修改的東西匯入一遍,防止 Unity 繼續使用快取內容。如果使用 AssetDatabase 的方法來增刪檔案,是不需要呼叫這個函式

 

5.資產匯入

匯入單個資產可能要花費好幾秒。以貼圖為例,需要做的一些事情:

生成必要的壓縮圖片以用於目標平臺

生成預覽用的小圖

生成GUID

……

使用 指令碼 將匯入流程自動化  AssetPostprocessor 類。

待看:

https://blogs.unity3d.com/cn/2012/10/26/in-depth-cache-server/

https://blogs.unity3d.com/cn/2012/10/26/in-depth-cache-server/

 

6.資產序列化


二:特殊資料夾

1.Assets資料夾下的特殊資料夾

Editor

1.不會被打包。

2.放一些編輯器指令碼,外掛的安裝包,以及不需要打進包的工具的資源。

Plugins

1.會被打包。可以不放在根目錄下。

2.用來放外掛,jar包,第三方SDK等。

Resources

1.資源會被壓縮,轉化成二進位制。會被加密。

2.使用Resources.Load載入

3.不應放太多資源,以及配置檔案等資源。Resources 目錄大小和啟動速度的關係https://blog.uwa4d.com/archives/QA_Loading_1.html

1.該資料夾下的資源無論使用與否都會被打包。

2.打包後資料夾下的資源只讀。

3.無法做熱更新。

Streaming Assets

1.打包時候資源不壓縮不加密。所以此資料夾一定要注意大小,打包前多大,就會多大打到包中。

2.載入路徑:Android平臺上的特殊性——不能直接用檔案I/O,即不能用Application.streamingAssetsPath

應該用:"jar:file://"+Application.dataPath+"!/assets"

3.在這個資料夾下主要存放一些二進位制檔案。

2.Library資料夾

此放的是程式集和庫的快取檔案。

1)ScriptAssemblies資料夾 

存放的是當前工程的程式集:

其依賴關係,分成執行時程式集和編輯器程式集(各自都要依賴於firstpass,所以取名叫first)

編輯器程式集:是在 Editor 目錄裡的程式碼構成的。

執行時程式集:打包的時候只會構建執行時的程式集。

2)metadata資料夾

存放的是 unity匯入的原始資源(存放Assets資料夾下)生成了unity內部特定的格式(unity可識別)檔案在遊戲中使用的檔案。

每次修改了原始資原始檔,就需要重新匯入,生成unity可識別的檔案格式。即每次刪除此資料夾,再次開啟unity,也就是重新匯入一次,重新生成這個資料夾的那些檔案。

資料夾都是兩個字元,取自檔案的GUID的前兩個字元,檔名即是GUID。(meta檔案)

如果把Assets資料夾下的原始資源刪除了,Unity會自動刪除其meta檔案,以及 metadata資料夾下相關的檔案。

 

3)AtlasCache資料夾 和 ShaderCache資料夾

 atlas和shader的快取。

 

4)assetDatabase3

類AssetDatabase的資料支撐。

保證了mete被刪除後,仍能建立回擁有相同guid的meta檔案。

而刪除了整個Library,當Library再次重建回來,被刪的meta建立出來的guid就不再一樣了。

 

 

3.ProjectSettings資料夾

此資料夾下是很多 .asset 檔案,可以以文字的方式開啟檢視。

各個檔案對應與工程中的 Project Settings 中的各個項。在Unity編輯器中設定了這些專案屬性以後,其實都是儲存在了這個資料夾下的.asset檔案中。

ps:如果想檢視Unity工程是用哪個版本開啟的,除了直接用Unity開啟檢視以外,還可以看這個目錄下的 ProjectVersion.txt 這個檔案。

 

4.Temp

Library Temp 都是快取,可以刪除,因此也不應該在版本控制之下。

 

5.Plugin/Android資料夾——用於Android打包

其中AndroidManifest.xml這個檔案用來告訴android系統,這裡面有關於APP的配置資訊,你需要根據裡面的設定的配置資訊來執行APP的程式碼,顯示介面。

xml包含標籤,屬性,值。AndroidManifest.xml常用的標籤有(每個標籤裡的屬性啊值啊就不介紹了):

<manifest>——根節點

          <application>——應用節點,必須有,作為<manifest>的子節點

                            <activity>,<provider>,<service> 描述應用的元件,作為<application>的子節點

          <uses-feature>——使用者特徵標籤,描述應用所依賴的硬體或者軟體條件。在應用商店搜尋的時候進行過濾。

          <uses-permission>——使用者許可權標籤,描述應用需要的許可權

 

如果其下沒有自己寫的AndroidManifest,打包的時候Unity會用它預設的AndroidManifest(mac中存在 unity.app/Contents/PlaybackEngines/AndroidPlayer下面,當你在進行打包apk的時候,unity會拷貝該路徑下的所有引數)。

 


三:重要路徑

iOS

1.四個路徑對應的平臺下的路徑

Application.dataPath

/var/containers/Bundle/Application/app sandbox/xxx.app/Data

也就是app安裝路徑app本身就在這裡,此目錄是只讀的。

Application.streamingAssetsPath

/var/containers/Bundle/Application/app sandbox/xxx.app/Data/Raw

streamingAssetsPathdataPath下的Raw目錄。

Application.persistentDataPath

/var/mobile/Containers/Data/Application/app sandbox/Documents

下面介紹獨立資料儲存目錄 Documents目錄

Application.temporaryCachePath

/var/mobile/Containers/Data/Application/app sandbox/Library/Caches

下面介紹獨立資料儲存目錄 Library下的Caches子目錄

2.app的獨立資料儲存目錄

Documents資料夾這個目錄用於儲存需要長期儲存的資料,比如我們的熱更新內容就寫在這裡。需要注意的是,iCloud會自動備份此目錄,如果此目錄下寫入的內容較多,稽核的可能會被蘋果拒掉。
Library資料夾Caches子目錄

一個相對臨時的目錄,適合存放下載快取的臨時檔案,空間不足時可能會被系統清除。

我把熱更新的臨時檔案寫在這裡,等一個版本的所有內容更新完全後,再把內容轉移到Documents目錄

Preferences子目錄用於應用儲存偏好設定,用NSUserDefaults讀取或設定。
tmp資料夾臨時目錄,存放應用執行時臨時使用的資料

3.各路徑對應的OC訪問方法

app安裝路徑[[NSBundle mainBundle] resourcePath]
app資料沙盒儲存根目錄NSHomeDirectory()
DocumentsNSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 
LibraryNSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) 
CachesNSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)
tmpNSTemporaryDirectory()

 

Android

1.四個路徑對應的平臺下的路徑

Application.dataPath

 /data/app/package name-n/base.apk

也就是apk安裝路徑

Application.streamingAssetsPathjar:file:///data/app/package name-1/base.apk!/assets
Application.persistentDataPath

/storage/emulated/0/Android/data/package name/files  外部儲存路徑-私有目錄-files目錄

Application.temporaryCachePath

/storage/emulated/0/Android/data/package name/cache 外部儲存路徑-私有目錄-cache目錄

2.重要目錄

  

各路徑對應的Java訪問方法

apk安裝路徑

/data/app/package name-n/base.apk

就是上面的dataPath返回的目錄

AssetManager.open(String filename)
記憶體儲存路徑(InternalStorage)

/data/data/package name-n/,使用者或其它app都不能訪問

開啟會發現裡面有4個目錄(需要root) 

cache 快取目錄,類似於iOS的Cache目錄

context.getFilesDir().getPath()

或者

context.getCacheDir().getPath()

databases 資料庫檔案目錄 
files 檔案目錄,類似於iOS的Documents目錄 
shared_prefs,類似於iOS的Preferences目錄,用於存放常用設定,比如Unity3D的PlayerPrefs就存放於此
外部儲存路徑(ExternalStorage)

在內建或外插的sd上,使用者或其它app都可以訪問

外部儲存目錄又分私有和公有目錄

公有目錄

DCIMMusicMoviesDownload這樣系統建立的公共目錄,

也有各自app建立的資料夾(在sd卡根目錄下),解除安裝app資料依舊存在。

context.getExternalFilesDir().getPath()

或者

context.getExternalCacheDir().getPath()

私有目錄

/storage/emulated/n/Android/data/package name/

開啟可以看到裡面有兩個資料夾cachefiles

為什麼跟內部儲存目錄重複了?

這是為了更大的儲存空間,以防記憶體儲存空間較小。

推薦把不需要隱私的、較大的資料存在這裡,而需要隱私的或較小的資料存在內部儲存空間。

 

Windows:

Application.dataPath應用的appname_Data/
Application.streamingAssetsPath

應用的appname_Data/StreamingAssets

Application.persistentDataPath

C:\Users\username\AppData\LocalLow\company name\product name

Application.temporaryCachePath

C:\Users\username\AppData\Local\Temp\company name\product name


四:Unity工具

1.檢視unity裡的二進位制檔案

.prefab   .anim  .mat .assets  以及 metadata下的檔案

用 Unity\Editor\Data\Tools 安裝路徑下的 binary2text.exe 進行轉化

2.檢視Editor的日誌

\AppData\Local\Unity\Editor

 

 

參考:

專案分享ppt

https://blog.csdn.net/ynnmnm/article/details/52253674

https://blog.csdn.net/k46023/article/details/64439313

相關文章