【Asset和Object的區別】
Unity將Assets檔案夾下的檔案稱為"Asset",翻譯成中文的意思是資源,為了便于理解,本文不翻譯,一個檔案就是一個Asset,我們知道這些檔案是存盤在硬碟上的,
UnityEngine.Object是Asset的實體,A是B的實體所表示的意思是,將B的資料復制一份得到A,所以經常將實體叫克隆,這和類的實體化的意思差不多,兩者區別是Asset的實體是完全復制不修改,類的實體化會修改某些欄位的值,Object(的資料)存盤在記憶體上,
【Asset的分類】
可以將Asset分為不同的型別,如紋理、音頻、模型、材質、預制體等,不同型別的Asset有不同的格式,也即不同檔案的格式不同,
有些檔案格式是行業內的標準格式,如音頻的mp3、wav格式,紋理的png、jpg格式,文本的txt等,
有些檔案格式是Unity自己定義的格式,也即原生格式(native),如材質的mat格式、預制體的prefab格式、場景的unity格式、Meta檔案的meta格式、網格的mesh格式等等,
有些檔案格式在Unity中不能直接使用,如模型的fbx格式,fbx格式的模型被匯入時會被轉換成原生格式的,
這些檔案格式都是Unity支持的檔案格式,也即這些檔案都是Unity支持的Asset型別,而Unity原生格式的檔案又叫做Native File,其他的檔案(其他各種軟體匯出的檔案)又叫做Source File,
【Asset的匯入】
Source File需要被匯入到Unity中才能被使用,這一操作由AssetImporter完成,
如果我們將一張圖片拖到Unity的Project視窗下,表示想將紋理型別的Asset匯入到Unity中,Unity會自動將圖片匯入,我們通常能覺察的現象是打開Windows的資源管理器時,發現多了一個與圖片同名的.meta檔案,看到這個檔案就表示圖片已經被匯入了,
如果我們直接將圖片拖到Windows資源管理器中的檔案夾中,這時沒有.meta檔案,也即這張圖片還沒有被匯入Unity工程中,隨后,打開Unity界面,這張圖片才會被匯入,
對比之下,我們可以知道,Unity的資源匯入是自動呼叫的,Unity會自動掃描Assets檔案夾,如果有增刪改的情況,就開啟呼叫,如果我們的工程過大,有時候不能自動開啟呼叫,需要我們按快捷鍵Ctrl+R 手動開啟呼叫,
我們還可以通過AssetImporter API 處理資源匯入,每個型別Asset都有對應的Importer,
Assets檔案下的檔案在匯入后會被處理為適用于游戲的內部資料,這些內部資料能被CPU、GPU等硬體更快速處理,其被保存在Library檔案夾下,而不會對原來的檔案做任何修改,所以,我們會看到Library檔案夾的大小只比Assets檔案夾小一點,第一次加載工程時,會為所有的檔案生成對應的內部資料,所以打開程序會很慢,之后打開工程會讀取Library檔案夾中的資料,所以打開更快,如果將Library檔案夾洗掉,那么重新打開工程時需要重新加載生成對應的內部資料,因此,Library檔案夾在多人協作時不必上傳,
【兩類特殊的物件】
Asset匯入處理的結果是生成Object,有的Asset只能生成一個Object,如紋理Asset;有的Asset可以生成多個Object,如3D模型Asset,我們在Project視窗看到的各種檔案都是Object,而不是Asset,選擇一個Object,在Inspector視窗下,在"Inspector"處右鍵選擇“Debug”模式,可以看到這個Object的Instance ID,當Asset實體生成Object時,同時會給Object一個Instance ID,
我們在這里看到的物件型別都是Unity內置,有兩類特殊的物件:
- ScriptObject 為可以讓我們方便的定義自己的資料型別,這些型別可以被Unity本地序列化和反序列化,并可在Inspector視窗中進行操作,我們一般用ScriptObject存盤資料,
- MonoBehaviour 我們都很熟悉,其可以掛在GameObject物件下,GameObject物件可以被存盤為Prefab物件,需要強調的是.cs檔案是一個MonoScript型別的Asset,MonoBehaviour中有一個對MonoScripts的參考,MonoScript里僅包含定位特定腳本類的資訊,兩者都不包含可執行代碼,
【MonoScript】
一個MonoScript含有三個字串:程式集名稱,類名稱,命名空間(assembly name, class name, and namespace)
在構建專案時,Unity 將 Assets 檔案夾中的所有獨立腳本檔案編譯為 Mono 程式集,Plugins 檔案夾外的 C# 腳本放置在 Assembly-CSharp.dll 中,Plugins 檔案夾中的腳本放置在 Assembly-CSharp-firstpass.dll 中,
這些程式集以及預構建的程式集DLL檔案都包含在最終構建的應用程式中,這些所有程式集被MonoScript參考,他們在應用程式啟動的時候被全部加載,因此,腳本資源不能在程式運行時動態加載,
所以我們可以通過MonoScripts找到具有可執行代碼的腳本,
因此,AssetBundle\Scene\Prefab檔案(物件)中的MonoBehaviour 組件都不包含可執行代碼,這樣就可以讓不同的MonoBehaviour參考特定的共享類,即便這些MonoBehaviour不在同一個AssetBundle中,
【參考】
Assets, Resources and AssetBundles - Unity Learn
Unity - Manual: Importing assets (unity3d.com)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/326025.html
標籤:其他
