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階段,也就是說仍然會有大量的修改和變化。
上面的小例子可以在這里獲取:
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選項消失了。
這是因為這套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然后根據它修飾的對象類型用它來初始化對象。你可以參考一下這篇文章: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,就會失敗。
使用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。如果正常加載的話,是沒有問題的。
你可以參考一下這個文檔:https://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#語言開發跨平台游戲