聊聊2018.2的Scriptable Build流水線

聊聊2018.2的Scriptable Build流水線

來自專欄 Runtime26 人贊了文章

0x00 前言

在這篇文章中,我們選擇了過去幾周Unity官方社區交流群以及UUG社區群中比較有代表性的幾個問題,總結在這裡和大家進行分享。主要涵蓋了Scriptable Build Pipeline、Standard Assets、Scripting、Graphics、VS/VS Code等領域,其中會著重介紹一下Scriptable Build Pipeline以及使用Scriptable Build Pipeline流水線來打包Assetbundle的相關話題。

0x01 Scriptable Build Pipeline

Q:我安裝了2018.2.1f1,不過在Package Manager里沒找到Scriptable Build Pipeline,請問是需要什麼設置嗎?

A:有很多朋友都十分關注Unity2018中的Scriptable Render Pipeline,可能大家更喜歡作外貌協會的成員吧。其實除了關注度很高的Scriptable Render Pipeline,Unity2018.2版本中還推出了另一個Scriptable的Pipeline,即Scriptable Build Pipeline。

但是不少朋友可能會發現一個問題,即在Unity 2018.2的Editor中找不到Scriptable Build Pipeline的模塊,甚至在Package Manager中也沒有發現Scriptable Build Pipeline的package。

其實安裝Scriptable Build Pipeline十分簡單,我們只需修改工程目錄下的Packages/manifest.json文件即可,在 「dependencies」這項添加對SBP的依賴。

{ "dependencies": { "com.unity.scriptablebuildpipeline": "0.2.0-preview" }}

這樣,我們就將SBP安裝到我們的工程中了。

接下來,我們就可以調用SBP的API來構建大家都很熟悉的Assetbundle了。

新的構建介面叫做ContentPipeline.BuildAssetBundles,它定義在UnityEditor.Build.Pipeline這個命名空間下。

它的函數簽名如圖:

可以看到,所需的參數為IBuildParameters、IBundleBuildContent以及IBundleBuildResults,並且會返回一個ReturnCode,供我們查看構建的狀態,例如Success、Error、Canceled等等。

其中IBuildParameters主要提供了一些構建參數,比如構建的目標平台、輸出路徑、壓縮格式等等。IBundleBuildContent則是供SBP來使用的被構建為Assetbundle的Asset列表。IBundleBuildResults則保存了腳本編譯以及AssetBundle構建的一些比較詳細的結果。

與之對應,SBP仍然保留了傳統的Build Pipeline,在這裡它的名字叫做LegacyBuildPipeline.BuildAssetBundles,用法和之前的構建腳本一樣。

所以,我們就可以寫一個簡單的腳本來分別使用二者構建一個Assetbundle,並在運行時進行載入。

我們可以發現一個很有趣的結果,那就是使用SBP構建的Asetbundle與傳統的構建方式相比,是不生成mainfest文件的。

Legacy

SBP

除此之外,另外一個很大的不同在於,如果我們要使用傳統的AssetBundle載入介面來載入AssetBundle資源的話,使用SBP構建的AssetBundle在loadasset時要傳入該Asset的完整路徑,而不能只是該Asset名字。

當然傳入完整的路徑來載入Asset稍顯複雜,並且我們也想要能夠在腳本中直接指定需要打包的Asset,這時我們就可以利用AssetBundleBuild來定義AB包的數據了。並且利用AssetBundleBuild數組來創建一個BundleBuildContent實例。

其中AssetBundleBuild的assetNames欄位中指明的Asset會被構建到這個bundle中。

除此之外,addressableNames欄位的值可以代替之前完整的Asset路徑來載入對應的Asset,不過我在0.2.0 Preview版本上進行測試時這個欄位還有一些bug,向開發反饋之後也很快被修復了,之後的版本中應該可以正常執行相關的操作了。

Addressable Asset System

如果不使用傳統的資源載入API來載入資源呢?聽說過Scriptable Build Pipeline的朋友,也一定或多或少的聽過Addressable Asset System。Addressable Asset System其實也在Unity 2018.2發布了,我們採用和Scriptable Build Pipeline類似的方式來激活它吧。

同樣我們要來修改一下 Packages/manifest.json文件,將Addressable Asset System添加到依賴項中。

"dependencies": { "com.unity.addressables": "0.2.2-preview",}

這樣我們就可以在工程中使用Addressable資源系統了。

但是需要注意的是,目前SBP和Addressable資源系統都還處於preview階段,也就是說仍然會有大量的修改和變化。

上面的小例子可以在這裡獲取:

chenjd/SBP_AssetBundles_Demo?

github.com圖標

SBP的文檔可以點擊下面的鏈接來查看:

| Package Manager UI website?

docs.unity3d.com

Addressable資源系統的文檔可以點擊下面來查看:

Unity Addressable Asset System?

docs.unity3d.com

0x02 Standard Assets

Q:Unity2018.2 安裝包中沒有standard asset 選項。如果想要安裝standard asset需要通過什麼途徑?

A:在Unity2018.2版本中,通過Unity安裝程序或Unity Hub來安裝Unity時,可以發現standard asset選項消失了。

這是因為這套standard asset的版本比較老舊,可以追溯到Unity5.0的版本。因此Unity的新版本會逐漸更換現有的standard asset資源。

當前可以選擇去Asset Store上下載老版本的Standard Asset,也可以考慮使用Unity新的2D、3D Game Kit,或者是Unity Learn上的其他示例工程。

0x03 Scripting

Q:我現在想實現用Attribute對修飾的欄位進行依賴注入來創建實例,所以我希望這個Attribute能夠獲取得到它所修飾的欄位的類型。

然後在Attribute構建實例的時候,順便把它所修飾的類型也新建一個返回出去,賦值給它所修飾的這個欄位,請問如何實現?

A:你要做的其實就是自定義個Attribute然後根據它修飾的對象類型用它來初始化對象。你可以參考一下這篇文章:

Custom attributes??

answers.unity.com圖標

深圳-Starsky

0x04 Graphics

Q1:Hi,大家好!諮詢一個問題,有使用U3D2018.2 GPU instance 的嗎?我測試了一下勾選shader的GPU實例化,發現即使在同一燈光貼圖,如果渲染隊列排序中,中間還隔著另外一個對象話,也會導致拆分成多個批次。但是用靜態批處理就不會有這種現象,如果場景排放的物體交錯程度很高,GPU實例化效果就不理想,你們對這種情況有別的處理方案嗎?

A:有可能,你可以查看frame debugger,如果沒有合併成功的話,會有沒有合併在一起的原因。比如使用GPU Instance但是是不同的mesh或submesh,就會失敗。

使用GPU Instance的並不少。而且2018.1增加了GPU Instance對GI的支持。但是GPU instancing對硬體要求較高,因此對於場景中普遍出現的靜態物體建議使用static batch可以兼顧到低端設備,對於大量在高端機上出現的物體,例如大量的草,樹木,這類物體可以使用GPU Instance,在低端機上可以進行剔除優化,或者不顯示。

Q2:問一下大佬們Unity可不可以使用球面諧波係數產生高光效果?

A1:思路錯了,SH一般用來提供低頻的光照信息,不是用來做高光的。

A2:SH達不到高光細節的頻率,你自己寫shader硬要這麼做可以,但是高光會變化的非常『平緩』。(北京-人丑就要多讀書

A3:達不到。Unity的SH就三階最高了。為什麼不用反射球?(上海-CGBull

0x05 VS/VS Code

Q1:大家好,我在Unity中使用vs code可為什麼不提示呢?而且也不報錯。

這裡無法引用到UI。

A:你打開的應該是單獨的一個cs文件,而不是整個project。如果正常載入的話,是沒有問題的。

你可以參考一下這個文檔:

Visual Studio Code and Unity?

code.visualstudio.com圖標

Q2:有沒人遇到過unity5.6.0f3,在vs裡面修改代碼後在editor裡面看任然是沒有改動的情況?

兩邊代碼不一致的情況如上面的截圖所示。

A:這種問題通常是由於你沒有勾選Unity Preference中的Auto Refresh選項。這個選項在Unity Preference/General中。

勾選上即可。

0x06 後記

好了,以上就是想和大家分享的幾個在群里討論的小問題。

再次,歡迎大家加入我們這個討論乾貨的官方技術群,交流分享呀。

Unity官方社區交流群:629212643

-EOF-

最後打個廣告,歡迎支持我的書

《Unity 3D腳本編程:使用C#語言開發跨平台遊戲》(陳嘉棟)【摘要 書評 試讀】- 京東圖書?

item.jd.com圖標
推薦閱讀:

PBRT-E2.8-應用變換
【GPU精粹與Shader編程】(四) 《GPU Gems 2》全書核心內容提煉總結 · 上篇
Signed Distance Field Shadow in Unity
pbrt學習(二):攝像機建模
圖解光線追蹤中,軸對齊邊界盒(AABB)演算法

TAG:Unity遊戲引擎 | 遊戲開發 | 計算機圖形學 |