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

來源:互聯網
上載者:User
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這個命名空間下。它的函數簽名

可以看到,所需的參數為BuildParameters、BundleBuildContent以及BundleBuildResults,並且會返回一個ReturnCode,供我們查看構建的狀態,例如Success、Error、Canceled等等。
其中BuildParameters主要提供了一些構建參數,比如構建的目標平台、輸出路徑、壓縮格式等等。BundleBuildContent則是供SBP來使用被構建為Assetbundle的Asset列表。BundleBuildResults則儲存了指令碼編譯以及AssetBundle構建的一些比較詳細的結果。

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

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

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

除此之外,另外一個很大的不同在於,如果我們要使用傳統的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階段,也就是說仍然會有大量的修改和變化。

上面的小例子可以在這裡擷取:
github.com/chenjd/SBP_AssetBundles_Demo

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

Addressable資源系統的文檔可以點擊下面來查看:
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選項消失了。

這是因為這套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然後根據它修飾的物件類型用它來初始化對象。你可以參考一下這篇文章: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,就會失敗。

使用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。如果正常載入的話,是沒有問題的。

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

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


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

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

勾選上即可。

0x06 後記

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

-EOF-

最後打個廣告,歡迎支援我的書
Unity 3D指令碼編程:使用C#語言開發跨平台遊戲

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.