聊聊2018.2的Scriptable Build Pipeline以及構建Assetbundle


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。
WX20180823-143843@2x.png

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

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

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

這樣,我們就能將SBP安裝到我們的工程中了。
WX20180823-144339@2x.png

接下來,我們就可以調用SBP的API來構建大家都很熟悉的Assetbundle了。
新的構建接口叫做ContentPipeline.BuildAssetBundles,它定義在UnityEditor.Build.Pipeline這個命名空間下。它的函數簽名如圖:
屏幕快照 2018-08-24 下午3.04.07.png
可以看到,所需的參數為BuildParameters、BundleBuildContent以及BundleBuildResults,並且會返回一個ReturnCode,供我們查看構建的狀態,例如Success、Error、Canceled等等。
其中BuildParameters主要提供了一些構建參數,比如構建的目標平台、輸出路徑、壓縮格式等等。BundleBuildContent則是供SBP來使用被構建為Assetbundle的Asset列表。BundleBuildResults則保存了腳本編譯以及AssetBundle構建的一些比較詳細的結果。

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

所以,我們就可以寫一個簡單的腳本來分別使用二者構建一個Assetbundle,並在運行時進行加載。
WX20180824-160550@2x.png

我們可以發現一個很有趣的結果,那就是使用SBP構建的Asetbundle與傳統的構建方式相比,是不生成mainfest文件的。
屏幕快照 2018-08-24 下午4.16.11.png

屏幕快照 2018-08-24 下午4.16.19.png

除此之外,另外一個很大的不同在於,如果我們要使用傳統的AssetBundle加載接口來加載AssetBundle資源的話,使用SBP構建的AssetBundle在loadasset時要傳入該Asset的完整路徑,而不能只是該Asset名字。
WX20180824-173755@2x.png

當然傳入完整的路徑來加載Asset稍顯復雜,並且我們也想要能夠在腳本中直接指定需要打包的Asset,這時我們就可以利用AssetBundleBuild來定義AB包的數據了。並且利用AssetBundleBuild數組來創建一個BundleBuildContent實例。
屏幕快照 2018-08-25 下午5.09.57.png
其中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資源系統了。
屏幕快照 2018-08-25 下午5.26.19.png

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

上面的小例子可以在這里獲取:
https://github.com/chenjd/SBP_AssetBundles_Demo

SBP的文檔可以點擊下面的鏈接來查看:
https://docs.unity3d.com/Packages/com.unity.scriptablebuildpipeline@0.0/api/index.html

Addressable資源系統的文檔可以點擊下面來查看:
https://docs.unity3d.com/Packages/com.unity.addressables@0.2/manual/index.html

0x02 Standard Assets

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

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

WX20180827-114304@2x.png

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

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

0x03 Scripting

Q:我現在想實現用Attribute對修飾的字段進行依賴注入來創建實例,所以我希望這個Attribute能夠獲取得到它所修飾的字段的類型。QQ20180827-0.png
然后在Attribute構建實例的時候,順便把它所修飾的類型也新建一個返回出去,賦值給它所修飾的這個字段,請問如何實現?

A:你要做的其實就是自定義個Attribute然后根據它修飾的對象類型用它來初始化對象。你可以參考一下這篇文章:https://answers.unity.com/questions/896763/custom-attributes.html
深圳-Starsky

0x04 Graphics

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

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

使用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可為什么不提示呢?而且也不報錯。
D5ED33EFA6D57B8DB664E4518D5357A8.jpg
這里無法引用到UI。

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

你可以參考一下這個文檔:https://code.visualstudio.com/docs/other/unity

Q2:又沒人遇到過unity5.6.0f3 在vs里面修改代碼后在editor里面看任然是沒有改動的情況?
QQ20180827-1.png

QQ20180827-2.png
兩邊代碼不一致的情況如上面的截圖所示。

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

勾選上即可。

0x06 后記

好了,以上就是想和大家分享的幾個在群里討論的小問題。
再次,歡迎大家加入我們這個討論干貨的官方技術群,交流分享呀。
Unity官方社區交流群:629212643

圖片 1.png

-EOF-

最后打個廣告,歡迎支持我的書
Unity 3D腳本編程:使用C#語言開發跨平台游戲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM