2018年7月26日 星期四

Unity 2018.2新功能介紹

作者:Thomas Krogh-Jacobsen 原文
潤稿:Wei J

Unity 2018.1標榜全新發佈週期的開始,最核心的兩個創新功能:可編程渲染管線Scriptable Render Pipeline (SRP) 和 著色器編輯器Shader Graph。它們為美術和開發者帶來了更多強大的功能;C# Job System、Burst Compiler和ECS,讓使用者合理利用多核心處理器成為可能。Unity 2018.2以此為基礎,增加一些新功能。本文我們將詳細為大家介紹Unity 2018.2中的重要功能與更新。

你可以從Unity Hub或這裡下載Unity 2018.2

Unity 2018.2版本新功能簡介

Unity 2018.2的主要目標之一是發佈可編程渲染管線SRP,強化下一代渲染技術。另一個目標則是把新功能和改進內容帶給開發者能在手機領域開發取得成功。現在先簡要介紹我們在這兩方面所做的工作。

Unity 2018.2優化了輕量級渲染管線LWRP的效能,增強了高清晰渲染管線HDRP的效果,幫助開發者實現高級視覺效果,著色器視圖Shader Graph也有多項改進,使它能夠支援上述兩個管線。

我們增加了對iOS、Android、Windows、MacOS、UWP和PS4的IL2CPP支援,並且開始為輕量級渲染管線LWRP增加了針對手遊設備的優化。

對於Android專案,我們正式發佈了對64位(ARM64)支援,現在我們允許開發者直接添加Java程式到Unity Plugins目錄下,而不需先建立Java庫。

最後,新版本中還加入了一些新的2D功能,它們將作為體驗版Package發佈,包括支援Vector Graphics(向量圖形)和Pixel Perfect(完美像素)。向量圖形匯入器能讓輕鬆處理SVG圖形格式,Pixel Perfect使你可以更輕鬆地在各種設備上實現不同解析度的完美點陣圖。

我們將在下文為大家詳細介紹改進的細節功能及內容。

圖像

可編程渲染管線SRP

在Unity 2018.1中,我們加入了可編程渲染管線SRP,它讓美術和程式能夠自主控制強大的新渲染管線。而Unity 2018.2包含以下SRP更新:

SRP批次處理器,加速CPU渲染

SPR批處理器(SRP batcher)是一種Unity引擎的新型內循環程式,它可在不影響GPU效能的情況下加速CPU渲染速度,它替代了傳統的SRP渲染程式。

使用PBR的遊戲常常會有很多物件和網格,物件上不同的材質共享著相同的Shader和Shader keyword。SRP批次處理器幫使用PBR的遊戲提供了很大的CPU速度提升。

SRP批次處理器能夠與高品質渲染管線HDRP和輕量級渲染管線LWRP結合使用,目前支援PC DirectX11、Metal和PlayStation 4。


可編程著色器變體拆離(Scriptable shader variants stripping)

由於專案中的著色器變體數量增多,安裝包打包時間和資料大小會隨著專案複雜度而提升。這個功能在Unity 2018.2加入,你可以用它管理產生的著色器變體數量,大幅減少安裝包打包時間和資料大小。

這個功能還允許你移除所有帶有無效程式通道或無用功能的著色器變體,建立著色器構配置,例如:標記為「debug」和「release」的設定,而不會影響迭代時間和維護複雜度。我們預期這個功能將大幅提高開發效率。

想更瞭解著色器變體拆離可以閱讀這篇文章


在GraphicsSettings中的著色器變體拆離選項


輕量級渲染管線LWRP

SRP是一個能自訂渲染的功能,但所有的工作都得開發者自己做,為此Unity貼心的製作了兩個模板HDRP和LWRP。

輕量級渲染管線LWRP提供了高效能且相容低階硬體、支援XR和手遊設備等效能要求較低的應用和平台。

LWRP通過利用優化磁磚功能(Optimized Tile)來提升了效能和優化效果。LWRP會調整磁磚的載入和存儲數量,進而優化手機GPU的記憶體。它可分批對光照著色,減少重復繪制和Draw Calls的次數。

LWRP的基本功能支援所有VR平台,然而在Unity 2018.3之前,它還不會支援MSAA技術。

請注意:LWRP目前還不支援手機AR開發工具,包含:ARCore、ARKit、HoloLens以及Magic Leap設備。這部分有新消息將在未來的計劃中發佈。


LWRP為低階硬體和XR等效能要求較高的應用提供了較高的效能


高品質渲染管線HDRP

高品質渲染管線HDRP在Unity 2018.1首次作為體驗版發佈,它針對PC和主機等高階平台處理高品質視覺效果。

在Unity 2018.2中,我們進一步幫助開發者呈現更高品質視覺效果。SRP目前仍處於測試階段,所以我們還不推薦將它們用於正式專案製作之中。這次更新的改進內容包括體積測定(volumetrics)、光滑平面反射(glossy planar reflection)、幾何鏡面反射AA(Geometric specular AA)、代理螢幕空間反射及折射(Proxy Screen Space Reflection & Refraction)、網格貼花(Mesh decals)和陰影遮罩(Shadow Mask)。 接下來會一一介紹:


  • 體積測定:體積霧會從除了區域光外所有支援的光照類型獲取光照。你也可以用密度體積來控制霧的密度。
  • 光滑平面反射:平面反射功能現在已支援光滑的反射效果,代表它會考慮材質的光滑度。
  • 幾何鏡面反射AA:三角形數量較為密集的網格會造成鏡面鋸齒現象。為了解決這個問題,我們新增了一個選項來降低並限制鋸齒數量。
  • 代理螢幕空間反射和折射:此功能允許你使用代理體積即接近場景邊界的體積,來執行螢幕空間的反射和折射。儘管它和使用深度緩衝(depth buffer)得到的效果相比並沒有那麼準確,但它在運行時的效能消耗較低。
  • 網格貼花:這個功能可以在投影器貼花之外,還可以讓你用網格來貼花。
  • 陰影遮罩:以前HDRP中的這個功能使用距離陰影遮罩(Distance Shadowmask)模式,這個模式會使動態陰影漸變為最大陰影距離位置的陰影遮罩。在Unity 2018.2中,如果動態陰影只渲染一個不受光照貼圖影響的物件(對應內建渲染管線的陰影遮罩模式),你可以選取每個光照。所以,和內建渲染管線不同,HDRP還能同時啓用陰影遮罩模式,這樣便可為內建陰影遮罩模式控制每個光照。

除此之外,我們還加了"一些"HDRP對Shader Graph的支援,可通過可視化的方式建立著色器,我們也提升了穩定性和效能。"一些"是指只有HDRP功能中的一個子集可以在Shader Graph中使用。目前Shader Graph針對HDRP的支援還不包括高階材質功能像是SSS或clear coat等,也無法進行曲面細分(tessellation)。

請注意:HDRP目前不支援任何AR或VR平台。對這些平台的支援預計在2019年,新的計劃將在之後通知。


在楓丹白露攝影製圖演示中,帶有來自陽光的體積光射線



採用Unity HDRP製作的一段汽車廣告


漸進式光照系統

漸進式光照系統(Progressive Lightmapper)在Unity 2018.1版本結束測試成為正式版本,這次更新加了不少改進。


可配置烘焙光照衰減

漸進式光照系統中的可配置光照衰減功能可以讓你在烘焙光照時得到近似物理特性的衰減曲線。在之前的光照系統裡,投射燈(spot-light)和點光源(point-light)光的強度會大幅受到光的範圍值影響,這樣的效果是不符合物理規則的,因為現實中光的衰減距離或衰減量是由光的強度決定。




此功能允許漸進式光照系統透過與世界空間(world-space)距離相關聯的距離衰減,來讓光的距離與強度之間脫鉤。雖然Unity仍支持原先的衰減功能,但現在也新增了對線性衰減和距離平方衰減的支持,以及在範圍限制位置衰減為0的距離平方衰減。HDRP為了搭配即時光照,在預設狀況下使用平方反比衰減,並且為光的強度啓用物理單位(physical units)。


用於預計算光照的實例化反光材質(albedo)和發光材質(emissive) 

在之前的光照系統中會將反光材質跟發光材質分配給一個獨立的光照空間。然而,由於實例(instance)經常會共享反光/發光的特性,現在將會開始支援每個貼圖獨有的實例之產生。這樣會減少漸進式光照系統所使用的記憶體總量,進而能夠烘焙更大的場景。


附加場景光照警告

出於性能原因,最好將大型場景分割為較小的子場景,這些子場景能夠在執行時根據可視性來加載和卸載。我們稱之為「附加性加載」或「多場景」設置。


帶有全域光照的附加載入場景

當為多個場景配置產生GI光照時,Unity所提供的工作流程會讓使用者載入所有需要的子場景,然後為全部的場景階層(hierarchy)產生照明。這將會輸出一個LightingData.asset檔案,它會保存光照貼圖、預計算即時GI和探針(probe)數據。這些與第一個載入的場景有關,該場景又被稱作「主」("Master")場景。

在執行期間,加載/卸載的場景會從與主場景相關聯的LightingData.asset中導出它們的照明數據。在這種情況下,子場景的照明設置無關緊要。然而,根據目的將會以不同的順序單獨烘焙場景或加載場景。這可能導致場景帶有不相容的照明設置和不符合的照明數據。例如:天空盒(skybox)可能會不太相同,光照貼圖解析度可能會變化,混合光照模式可能也會改變。

此前,Unity從未警告使用者這個問題,而得到的結果與預期不一致讓使用者感到困惑。現在Unity會產生一個警告,提醒使用者有不相容的問題,接著顯示關於不相容的明確信息以便除錯和驗證。


其它改進內容

我們還讓剔除光照貼圖陰影投射器函數(僅在腳本API中)顯示出「per light」選項,讓它能夠被HDRP使用。


著色器視圖Shader Graph(預覽版)

在Unity 2018.1中,我們引入了Shader Graph,使開發者能夠透過視覺建構著色器。這個過程無需編寫程式碼,便可在圖形網絡中直接創建並連接節點。視圖中的每個節點都會依照改動提供即時回饋,其易用性使得新使用者也可以參與著色器創建。在Unity 2018.2中,我們進行了一些改進,其中包括:


支援高品質渲染管線

著色器視圖Shader Graph現在支援HDRP擁有PBR和Unlit的Master節點。用著色器視圖構的著色器在LWRP與HDRP中都可以使用。





頂點位置

現在可以通過PBR和Unlit Master節點上的Position屬性槽(slot)來修改頂點位置。預設情況下,對此節點輸入的是物件空間位置(object space position)。對這個槽的自定義輸入應該指定特定頂點的絕對本地位置。在頂點著色器上,有一些特定節點,例如——程序化形狀節點不會顯示出來。因為這類節點不相容於這個屬性槽。




Master節點設定

現在可以透過一個小視窗進入Master節點的設定,你可以為你的著色器切換開關來修改著色器上的多個渲染設定。




屬性參照名字和開放的狀態

現在你可以編輯屬性的參照名字,使它更輕易地從腳本引用你的著色器屬性。為此,首先選擇所需屬性,然後在參照旁邊輸入一個新名字。如果你想要重置回預設的名字,在參照上按右鍵,然後選擇重設參照即可。

現在可以在擴充的屬性視窗中對開放的選項做切換。




視圖的可編輯路徑

現在你可以修改Unity的著色器視圖和子視圖的路徑。當你修改著色器視圖的路徑時,將修改其在著色器選項列表中的位置。當你修改子視圖的路徑時,它會在節點創建選單(node-creation menu)中得到一個不同的位置。






Is Front Face節點



使用此節點,你可以根據給予片段(fragment)的面標識(face sign)來改變視圖的輸出內容。如果當前片段是正面的一部分,節點會返回True。如果是背面,節點會返回False。請注意:這個功能會要求你在主節點上使用雙面(two sided)屬性。


梯度(Gradient)節點




此功能會通過兩個新節點添加漸變功能。Sample Gradient節點會通過已有的Time參數取樣漸變。你可以在控制視圖的Gradient槽定義這個漸變。Gradient Asset節點會定義一個漸變,這個漸變可以使用不同的Time參數來被多個Sample Gradient節點採樣。


Texture3D和Texture2D陣列




這個改動使Unity能夠對紋理類型支援兩個新的屬性類型和四個新節點。這些新增內容允許你對著色器視圖中的Texture 3D和Texture 2D Array類型資源進行定義和取樣


Texture 2D LOD節點

這會為Texture 2D Sample 上的LOD功能添加新節點。Sample Texture 2D LOD使用的輸入和輸出槽和Sample Texture 2D相同,但多包含了一個通過Vector1槽調整細節等級的輸入。


顯示產生的程式碼




現在可以查看任意節點產生程式碼。右鍵點擊節點,點擊Show Generated Code即可,該程式碼片段會在連接Unity的編輯器中打開。


Vulkan for editor 於Windows及Linux平台(試驗版)

Unity 2018.2支援在Windows和Linux端編輯器運行Vulkan。Vulkan是新一代圖形和計算API。它可以對PC、主機、移動端和嵌入式平台的各類設備上的GPU提供高效的跨平台存取功能。


紋理Mipmap串流

在Unity 2018.2中開始支援向記憶體添加紋理Mipmap串流。(可以在需要的時候才開啟)

這有什麼好處?

啟用此功能可以減少Unity應用程式的紋理記憶體需求。

如何運作

啟用此系統後,Unity將僅在網格(mesh)靠近啟動中的攝影機時加載更高解析度的紋理Mipmap。高解析度Mipmap數據保存在記憶體中,整體的紋理記憶體會限制在使用者定義的預算範圍內。如果在加載新的紋理Miplevel後,紋理記憶體超出預算,那麼與攝影機距離最遠的網格上,較高解析度的Mipmap會從記憶體中釋放出來。

加速初次載入時間

由於首次加載的紋理數據減少,即僅加載較低解析度的mipmap,初始場景的載入速度也會加速。初始加載速度的提升效果將根據平台有所不同。


更多的可控性

你可以完全控制紋理Mipmap串流系統,決定哪些Mipmap會加載到記憶體中。通常Unity會加載所有存儲在硬碟上的Mipmap,但使用此系統,你可以直接控制要加載哪些Mipmap等級。

此系統還會佔用一小部分的CPU時間,從而節省大量的GPU記憶體儲存。

輕易地啟動和管理

通過品質設置(Quality Setting)可以輕鬆啟用該功能,你可以定義每個紋理是否應進行串流式處理。你也可以查詢指標,以識別紋理記憶體的使用情況,同時見到記憶體的節省。

控制系統的各種設置,讓記憶體的節省和CPU消耗之間取得平衡,並允許優先處理一些紋理,例如將角色紋理優先於環境紋理。



C#動畫工作 

AnimationPlayable現在允許使用者編寫自定義的C# Playables來直接與動畫數據進行互動。

使用者也可以編寫多線程C#程式碼來控制PlayableGraph所使用的AnimationStream數據,它也允許將使用者編寫的IK解決方案、程序化動畫或甚至是自定義混音器集成到當前動畫系統中。


粒子系統的改進

下面為Unity 2018.2中的粒子系統的改進:


  • 支持多達8個UV:可以使用比以往更多的自定義數據。
  • MinMaxCurve和MinMaxGradient:現在能夠在粒子系統之外使用這兩個類型的自定義腳本,以便於搭配粒子系統UI所使用的風格。
  • 線性顏色空間:上傳粒子數據到GPU前,粒子系統能適時將顏色轉換為線性空間。
  • 從Sprite發射:我們給形狀(Shape)模組加入了兩個新模式,讓它能夠從Sprite或SpriteRenderer組件發射,並將粒子發射效果與Sprite視覺效果完美搭配。
  • BakeMesh:我們新增了兩個API來將粒子系統的幾何體(geometry)烘焙到網格中,BakeMesh會烘焙粒子幾何體,而BakeTrailsMesh會將軌跡模組(Trails module)烘焙到網格中。
  • 僅顯示選取的對象(即Solo Mode):這是使用者一直想要的功能,我們使得這個功能更具探索性和易用性,並在場景視圖的Overlay層加入了其它預覽控制功能,例如:播放、重放和暫停等按鍵。
  • ETC紋理支援:當你在紋理集動畫(Texture Sheet Animation)模組中使用Sprite時,帶有獨立Alpha紋理的著色器現在可以在粒子上使用了。


完美像素攝影機 Pixel Perfect Camera(預覽版Package

嘗試使用完美像素(Pixel Perfect)預覽版Package,使畫面遵循你的像素藝術風格。無論螢幕大小如何,完美像素攝影機(Pixel Perfect Camera)組件將會自動完成所有計算來幫助你獲得完美清晰的像素畫面。


Toge Productions製作的Infectonator 3: Apocalypse畫面


在sprites進行運動或旋轉時,此功能有助於它們保持清晰的像素效果,而且不用添加補幀畫面來使邊界變得平滑,效果如下圖所示。




2D Sprite 渲染器「通過軸心點排序」

在過去,Sprite渲染器和坐標軸之間的距離用來決定哪個Sprite最後渲染,從而出現在所有圖像的最前面。

在此版本中,你可以使用軸心點而不是Sprite中心作為各種排序方法的參照點,像是根據軸心點到螢幕上方的距離來做排序。例如:在俯看視角RPG遊戲中,你需要底部Sprite來決定Sprite的渲染順序。新的軸心點設定會更適合你遊戲開發。





2D六邊形Tilemap地圖

Unity 2018.2能夠構六邊形Tilemap地圖。這包括支持創建平坦的和點狀凸起的六邊形Tilemap,這類Tilemap在製作策略遊戲或是電子桌游時十分實用。






David Baumgart 的創作

SVG輸入器(預覽版Package)

此功能讓可拓展向量圖形(Scalable Vector Graphics,即SVG)能夠直接輸入到自己的專案中。SVG輸入器能以很小的檔案大小來創建Sprite資源,並且在任意解析度下保持它們原有的畫面質量。

SVG輸入器支持SVG 1.1規範中的常見功能,例如:漸變、填充、裁切路徑、虛線和圓角等。Unity的2D工具支持以這種方式輸入向量圖形Sprite。

當一個SVG檔案被輸入後,向量數據會被曲面細分為三角形,然後產生Sprite。這個Sprite能夠在之後用在2D系統中。SVG輸入器的原始碼可以在Package的Editor資料夾中找到。

你可以從Package管理器中獲取SVG輸入器,它是向量圖形(Vector Graphics)預覽版資源的一部分。


向量圖形API可以直接在程式碼中創建和操作向量結構。向量圖形API的原始碼可以在Runtime資料夾下的向量圖形命名空間中找到。


全新2D API

你可以在程式碼中使用Vector Graphics API來創建或操作向量數據。全新的2D Atlas API能讓你編寫自定義工具來創建或更新圖集。例如:你可以使用玩家的個人資料圖片創建個性化角色紋理,也可以基於安裝包的設置來優化圖集。


編輯器

支援.java和.cpp檔案作為Unity專案中的插件

現在你可以添加.java(以及.cpp和.a)檔案到Unity專案的插件資料夾中。這些檔案將被識別為Unity插件,不需要使用者在Android Studio中單獨構函式庫就可以被編譯到APK檔案中。插件程式碼會作為Unity專案的一部分,不需要額外創建單獨的Android Studio專案。


標準資源(Standard Assets)置換

在Unity 2018.2中,我們從安裝器移除了Unity 5.0版本的標準資源,並為之前的每個原型Package製作了替代的Package。

第一個Package(即Standard Assets: Characters)將在Unity 2018.2發佈後不久作為預覽版Package推出。它將包含一個與Cinemachine集成的第一人稱和第三人稱控制器,以及通過Probuilder構的原型環境。

更多細節後續我們會進行介紹。如果你需要之前的Unity 5.0版Package,可以從Asset Store獲取。


Unity Hub

Unity Hub (v1.0)將在最近正式推出,作為一個簡化所有使用者的入門和設定過程的全新工具,它提供了一個用以管理Unity專案的集中位置,簡化了搜索下載管理Unity編輯器認證(licenses)和附加組件。

下面是隨著Hub v1.0推出的一些功能:


  • 專案模板功能
  • 自定義安裝位置
  • 為新的專案增加Asset Store Packages
  • 修改專案建構的位置
  • 編輯器:新增組件的後期安裝

更多Unity Hub的介紹,請閱讀簡化你的工作流程-Unity Hub (Beta)


影視方面

攝影機的物理屬性

Unity 2018.2版本包括一些新功能,使得藝術家和電影攝影師在使用Unity創作時更有自信,也得到更多的控制權,這些新功能包括:


  • 新增了一個用於顯示物理攝影機(Physical Camera)設置的按鈕,上面有藝術家和攝影師十分熟悉的屬性。例如:標準的焦距、感光元件尺寸和鏡頭偏移等屬性。
  • 模型輸入器現在能夠保留從Autodesk® Maya®和其它相容DCC中導出的物理攝像機屬性。
  • Unity中的攝影機現在能與其它DCC中的攝像機完美搭配,不用添加額外的組件或是手動地FOV計算。
  • 攝影機組件現在會提供一個感光元件尺寸的下拉列表,用來設定現實中的常見攝ㄧ機配置。






Unity Recorder 1.0



Unity Recorder 1.0將在不久後正式推出,它讓使用者以十分簡單的方式在編輯器中管理和錄製動畫剪輯(clip)、影片和圖像序列:


  • 全新UI:新的UI帶有簡潔的視圖,能夠輕鬆管理錄製結果。
  • 預設(Presets):你可以保存已有設定,不用每次都從頭修改設定內容。
  • API:你可以通過腳本中的API來觸發錄像。
  • 多重錄像:你可以立即開始多個錄像,並將它們保存在一個列表中,以便之後在需要時使用相同的設定。
  • 以多種格式錄製帶音頻的視頻剪輯。
  • 以多種格式錄製圖像序列。
  • 錄制並導出動畫:通過FBX導出動畫剪輯到你喜歡的DCC應用程式上。

Recorder v1.0請到Asset Store下載


引擎核心

移除舊版基於RakNet的網絡功能

RakNet是我們之前的網絡功能,在Unity 5.1中就被逐漸棄用,在Unity 2018.2中被徹底移除。這意謂著任何使用RakNet的專案都不適用於此版本。

可尋址資源系統(Addressable Asset System)

可尋址資源系統能夠輕鬆管理構成遊戲的所有內容,例如:Prefab、紋理、材質、音頻剪輯和動畫等。隨著專案數量的增長,資源的數量也會增加。使用者必須聰明地引用這些資源,否則遊戲中的所有內容包括本地記憶體和內容分配都將變得難以管理。

因為資源參照通常在構時才解決,你將更難去決定內容分配的策略,而使用者為了進行修改經常要面臨的是大量重構。

全新的可尋址資源系統將可以在遊戲規模擴大時讓你的團隊更容易地進行擴充。這個系統分離了運行時資源管理中的三個主要問題:參照、打包和分配。不管是在本地機器上還是透過CDN的在線分配,可尋址資源系統都簡化了參照內容的過程,因為內容會自動地載入和卸載從而更好地管理記憶體。我們還提供了性能分析工具來進一步優化記憶體使用。最終,此功能將為你帶來更短的迭代時間。




全新的可尋址資源系統將獨立發佈。它目前仍處於預覽階段,可以通過Package管理器作為附加內容取得。

高DPI顯示器支持

如果你擁有4K顯示器,現在你可以在編輯器中享受Linux和Windows上的高DPI縮放支持,此功能還支持在Windows上按照不同的顯示比例進行縮放。


棄用UWP所使用的.NET腳本後端支援

自從Unity 2018.1起,我們就在通用Windows平台 (UWP)上支援了兩個腳本後端:.NET和IL2CPP。在Unity 2018.2中我們棄用了對.NET腳本後端的支援。這次棄用的原因有兩個方面。

更容易將遊戲移植到UWP

首先是為了讓開發者更輕鬆的移植遊戲到UWP。過去很多開發者在將遊戲移植為UWP時所遇到的問題,主要是因為底層API的不同,以及.NET Native、Mono、和IL2CPP這些其它平台運行時之間的差異造成的。這一大變化將讓大多數開發者更輕鬆地將遊戲移植到UWP平台上。

幫助我們提供更好的支援

第二個原因是為了讓我們更有效地解決問題,來更好地為使用者提供支持。由於.NET腳本後端完全與其它Unity平台的運行時不同,對我們而言,相較於Unity的其它部分,維護穩定的質量等級是一個大難題。這次棄用將使我們花費更少的時間來維護.NET腳本後端,並擁有更多的時間來處理對使用者而言更為重要的功能和問題。

IL2CPP擁有和其它Unity平台相同的.NET底層API,而且IL2CPP已經支持WinRT類型和相應API的存取。因此,通過在Unity 2018.2中添加的IL2CPP管理除錯工具,IL2CPP的開發者體驗現在達到了與.NET腳本後端同樣亦或更優秀的水準。

從Unity 2017.2開始,編輯器就預設使用IL2CPP,所以我們認為多數使用者使用時不會遇到任何問題。如果你還沒有嘗試使用IL2CPP,而且遇到過一些問題,請務必提交問題,讓我們瞭解。我們計劃在Unity 2019.1結束對.NET腳本後端的支援。

C# Job System、實體組件系統和Burst Compiler

隨著我們在Unity 2018.1中推出新的高性能多執行緒系統,我們正在重構Unity的核心基礎。新的系統將使你的遊戲完全利用當下的多執行緒處理器,不用再為編程而煩惱。

這得益於全新的C# Job System,它為使用者提供了一個安全簡易的沙盒環境,能夠在裡面編寫並行程式碼。我們還引入了新的模型,預設使用實體組件系統(ECS)編寫高性能程式碼,並使用Burst Compiler產生高度優化的原生(native)程式碼。

有了預設提供的高性能,不僅可以在更多的硬體上運行自己的遊戲,還能使用更多的單位和更複雜的模擬效果來創建更豐富的遊戲世界。在這裡可以了解更多。

實體組件系統(ECS)

在Unity 2018.2中,我們加入了多個改進內容,包括反應系統(Reactive system)範例。反應系統將使你在組件狀態發生變化時做出響應,並模擬由事件驅動(event-driven )的行為。可以觀看這部 Joachim Ante在Unite Berlin上關於反應系統的影片來進一步了解。

我們還將提供有關如何使用ECS實作反應系統的大量範例和文檔。今年的下半年,我們還將提供由Unity使用者製作的小型Unity遊戲範例,我們會將這些範例轉換為ECS。

Burst Compiler

在Unity 2018.2版本中,Burst Compiler for ECS可以在所有編輯器支持的平台Windows、Mac和Linux上使用,你將能夠為獨立安裝包構AOT,這些安裝包包括桌面端、PS4、Xbox、iOS和Android。

在向Unity 2018.3邁進的過程中,我們還會繼續專注改進ECS的性能,發佈確定性系統的一個預覽版,並支持更多.NET C#語言結構,例如:DllImport、常量數組和foreach等。我們的目標是在Unity 2018.3期間使Burst Compiler脫離預覽階段。

IL2CPP管理除錯工具

現在可以使用IL2CPP管理除錯工具,它幫助開發者使用偏好除錯工具來找到並修補錯誤,即使在使用IL2CPP時也能進行。

所有調試功能將支持Visual Studio(使用Visual Studio Tools for Unity)和JetBrains Rider,而PlayStation 4、移動端平台和Xbox One等獨立安裝包將會在未來提供。




Unity 2018.2中的Scripting runtime改進

我們從.NET 4.x開始收到的各種使用者反饋,Unity 2018.2推出了與腳本runtime相關的大量錯誤修復。


Android ARM64位支持

在Unity 2018.2中,基於IL2CPP的Android ARM64位元支援正式脫離預覽階段。這將會提供性能優勢,因為64位元的Android應用程式和遊戲將有4GB以上的記憶體能夠利用。


根據架構分離APK檔案

現在新增一個選項用來根據目標架構,如x86、ARM 32和ARM 64分離出多個APK檔案,而不是產生一個較大的APK檔案。並且對於支持此選項的商店,例如Google Play,你只需要下載相應架構的APK檔案即可。




Google Play Instant Games插件

獲得新玩家的一大阻礙往往是因為繁瑣的安裝過程。下載並打開應用程序需要花費時間,這會導致不少玩家還沒體驗遊戲之前就放棄。

有了Google Play Instant,使用者不需要預先安裝就可以嘗試體驗遊戲的10MB版本。此插件通過Google Play Instant來進行配置,簡化了Unity-based Android應用轉換為即時應用的過程


該插件在GitHub上作為一個專案提供,並且能在Unity 2017.x及更高版本上使用。

該插件的功能包括:


  • 可在已安裝(Installed)和即時建構(Instant-build)模式之間切換的選項。
  • 帶有Unity建設置上的集中式視圖和Android安裝包設置,這些設置經過修改後能夠支持Google Play Instant。
  • 能夠在連接ADB的Android設備上建並運行即時應用。

C#平台認證同步功能

Unity現在完全支持.NET 4.x和UnityWebRequest API等所有平台上的現代加密協議TLS1.2。這包括針對特定平台的認證商店的自動驗證功能。

在不提供系統驗證存取功能的Xbox One和PS Vita平台上,我們使用嵌入式CA庫來進行驗證。


結束對UnityScript的支持

Unity 2018.2中我們結束了對UnityScript的支持。瞭解詳情,請閱讀這篇文章,Unity將僅支援C#腳本編程。

我們作出這個決定的原因是,隨著我們繼續更新Scripting Runtime和支持的C#版本,C#將能實現更多可能性:


  • 通過Scripting Runtime更新,開發者可以使用.NET 4.6及更高版本的C# 7。
  • JobSystem讓開發者能夠輕鬆編寫多執行緒程式碼,從而避免出現競爭危害(race conditions)和死結(deadlock)。
  • NativeArray類型允許開發者創建和使用由本機程式碼控制和存儲的大型陣列,這樣可以更好地控制分配行為並消除GC(garbage-collection)問題。
  • 開發者可以控制腳本編譯管線,自定義腳本和程序集的組合方式。

另外,Asset Store已經停止接受包含UnityScript程式碼的新Package,並且移除了原來帶有UnityScript的Package。

最後,我們提供了一個將UnityScript轉為C#程式碼的自動轉換工具,雖然已經出現有一些這樣的工具,但這些工具所用的方法我們認為並不合適。所以我們決定應用這些知識構自己的解決方案。可以在這裡下載到UnityScript轉為C#程式碼的自動轉換工具。


Visual Studio Code除錯工具擴充

對於使用Visual Studio Code作為IDE的使用者,我們開發並維護Visual Studio Code Debugger for Unity擴充,它目前作為預覽版推出。



請注意:我們還在進行更新,使之支持在Unity的Mono運行時中調試C#並解決報告的錯誤。


XR


HoloLens Holographic Remoting

HoloLens Holographic Remoting允許應用程式利用本地桌上型電腦的強大能力,從而在運行時卸載渲染和處理過程(processing)。我們認為我們的汽車和AEC客戶會發現這個功能非常有用。可以在這裡詳細了解如何開始使用。


發行說明

Unity 2018.2還包括183項改進內容和1426個錯誤修復。請查看發佈說明來瞭解所有新功能、改進和修復的信息。

2018年7月20日 星期五

Pre-Bake 360 如何利用360轉錄技術製作無模型場景

本文作者 Kelvin Lo

-文長-
想要讓手機能和PC擁有同樣的畫質水平,一直以來都是開發者追求的,但現實是礙於現下的軟硬體技術力,團隊必須要跨過相當大的技術門檻,對於一般開發者來說它就像是一座天秤,畫質與效能各自在天秤的兩頭,你必須有所取捨。

在以前,遊戲開發不像現在有那麼多的資源能運用,往往一個畫面要透過許多技巧或各種假畫面來欺騙玩家眼睛來達到在當時技術門檻難以達到的畫面。本文主要分享的內容是如何利用Unity 2018新的拍攝API來實現高質量畫面低Draw Call的場景技巧。

本專案採用Unity官方釋出的一個Demo叫Space Shooter,這是一個2D橫向捲軸射擊遊戲,用非常簡單太空圖片作為背景,在本文章裡,我們把背景換成了影片後,保持了原來的效能消耗,但畫面比起原來的版本要好許多。


改變前



改變後



影片展示

雖然畫面變好看了,但對於玩家而言還是太過單調,所以我們做了第二次的調整,把運鏡的感覺與攝像頭有限度的轉動導入了本次的改變,效果就好很多,而且Draw Call並沒有增長太多,結果如下:


第二次改變影片展示

之所以可以讓場景保持低消耗還能有這樣的畫面表現與互動,是因為這次採用的是360影片




用360影片作為場景


雖然這樣的呈現非常棒,但是有很多限制的,由於是影片格式,所以佔用的硬碟空間相對的就比原來的貼圖大很多,目前Untiy的Video Player尚未支援串流,因此必須把影片先放進專案中,或是透過URL模式下載,但仍然會佔用較大的專案空間。這種用360的產品互動設計也相對困難,最重要的是這種專案鏡頭只能轉動,不能位移。

雖然有上述的限制,但是好處就是可以讓手機產品做到接近PC的品質,而且再也不用擔心不同手機晶片會有無法執行的問題。這樣的作法當然也因為限制的關係只適合特定的遊戲類型。

簡單來說就是鏡頭不能移動(腳不用動)的類型:

飛機射擊遊戲遊戲
雲霄飛車遊戲
跑酷遊戲
上帝模式密室脫逃
博弈類機台

Unity 2018新的API



要把場景回拍成360可以採用Unity 2018兩個新的API:

Camera.RenderToCubemap()可以從相機的位置對環境拍攝一張Cubemap



這樣的圖可以做為Cubemap貼回Skybox。

或是用RenderTexture.ConvertToEquirect()把這張Cubemap在縫合成為一張全景圖(Panoramic images)



最後會算成一張這樣的圖,把這張圖包在一顆球上從裡面看就可以還原當時的場景。

最終結果

錄影套件:Recorder


實際上這個測試專案採用了Unity官方釋出的套件Recorder,這個套件完美的採用上述兩個API並且可以和Timeline整合在一起(必須是Unity 2018或以上版本),搭配Cinemachine的Dolly track軌道安排的路徑,能依照我規劃的路線拍出我要的鏡頭。


Unity2018以上版本就可以看到有能錄製360的選項



透過Dolly Track來安排我的鏡頭動線,依照路徑錄製場景移動

Post Processing後製特效

一般來說,在手機平台的特效都會建議能少開就少開,遮擋剔除(Occlusion Culling)或是場景LoD能多用就多用,但在這種預烘焙案例裡,反而是建議是把所有能開的特效全開,遮擋剔除和LoD能不開就不開,為的就是預烘焙的品質可以得到最好。


PPS OFF


PPS ON

由於PPS的特效有些是基於螢幕空間計算,因此要注意的是某些特效不適合用在這種流程,否則就會烘出下面這種有問題的圖


並非所有後製特效都適合烘焙360

Masking遮擋技巧

如果我們想讓飛機飛過一座橋底下,但一般來說這種預烘焙360圖層已經扁平化,沒辦法做到在物件底下的效果,這時我們可以另外烘焙一層遮罩來達成我們想要的效果。


用兩層360來製造飛機飛過橋下的效果

Unity原生支援兩種帶有Alpha頻道的影片格式,分別是Apple的ProRes 4444和Google的Webm VP8,但在本次測試我們並沒有採用這兩種格式,主要是因為製作不易之外,多一個Alpha頻道也讓空間佔用更大。

我們採用業內比較常見的Chorma Key,也就是把顏色去掉的綠幕作法。值得一提的是我們把石橋和橋上面的物件單獨設定為一個Layer,然後在相機裡面設定Clear Flags為Solid Color,綠色。Culling Mask設定只顯示石橋那一個Layer,結果就會只渲染石橋與上面的元件,其他部分都會只渲染成綠色。這樣的好處是完全不需要去切換物件的位置或是狀態,很簡單就能在不同圖層切換。

最後再包回圓球並用Shader把綠色都挖掉,就會呈現出如下圖的樣子,只要渲染在飛機之上就能呈現出經過橋下的效果,由於它也是一個影片,因此可以完美無瑕的和背景影片結合再一起。



綠幕作法

靜態圖片的360場景

介紹完用360影片製作的場景之後,我們來說說如何用靜態的360圖片來製作場景,利用圖片的好處是硬碟空間佔用比起影片小非常多。我們採用一個密室脫逃的遊戲類型來當作Demo展示,主角在一個有六個房間和一個走廊的建築結構裡行走,每個房間都帶有一個鏡頭,主角可以自由行走在這些房間,鏡頭會主動判斷切換。


Demo場景來自於ArchViz Pro No.3

你看到的畫面實際上並不存在真實的3D建築模型,而是在七個不同的360圖片之間作切換,並共用同一組碰撞結構,進而能達成這樣的效果,重點是Draw Calls還是維持非常低的20以內,很神奇對嗎?

360場景原理


這場景是如何製作的呢?首先我們還是必須要有建模流程,我們從Asset Store買了一套著名的Archvizpro interior No.3室內設計模型作為本次Demo的模型,在還沒烘焙成360之前,正常播放大約Draw Calls平均是2500-3000左右。我們在場景的每一個房間安置了Cinemachine的虛擬鏡頭(下圖紅點處),然後各自用Recorder錄製了一張全景圖。


建模流程

場景拍完後,我把所有的Mesh renderer元件都移除,這會讓場景只剩下Collider碰撞結構,每個房間的鏡頭位置都加上一個Sphere圓球,並把剛剛拍好的全景圖各自貼回去對應的房間,材質Shader指定為Skybox-Panoramic。由於碰撞結構沿用場景原本的Colliders,鏡頭的位置也都精準的放在對的位置,因此你會發現這時候的鏡頭看出去和碰撞結構的位置會完美的疊合一起。


將模型材質都清除只留下碰撞結構



修正簡化碰撞結構後,場景各自被圓球包覆眼睛看出去和碰撞結構可以完美疊合

Shader選擇與自訂

Unity內建的Standard Shader並不適合用在全景圖上,Skybox-Cubemap才適合,但Cubemap不適合用在影片格式的全景圖,因此展示時我們是採用也是內建的Skybox-Panoramic的Shader,但目前這兩個內建的Shader並沒有綠幕Key的功能,為了要一個Shader有兩個功能,我從官網下載Skybox-Panoramic Shader的原始碼,然後自行加上Chroma Key或Alpha Key的功能,通常是公司的TA技術美術來負責這個工作。


Panoramic Shader放360圖片線條才不會歪掉,為了讓一個Shader有兩個功能,稍微加工了一下Shader


有了這個Shader之後,運用和前面影片的遮罩製作方式,一樣把要留住的物件標記為獨立的Layer,然後從Camera去過濾留下要作為前景的物件拍出一張帶有Alpha的圖片或如下圖的綠底照片(依據你的Shader類型而定):



把箭頭的物件都設為一個Layer,利用鏡頭過濾掉其他的物件就不用移動物件或關閉物件來達到拍攝需求。


拍好的綠底Key圖片

靜態圖片和動態影片不同的是,你可以用帶有Alpha的圖片,甚至用其他的軟體來處理圖片,Unity設好後可以很容易就把不要的地方挖掉。

採用Alpha的圖片設定


由於人的眼睛在固定的定點時,只有一隻眼睛所看到的畫面並無深度資訊,好比場景被渲染到畫面之後就已經扁平化了,因此不管疊了多少層,人眼都無法感知深度的變化,我們可以利用這點來疊上無限層數的前景,你可以隨心所欲的設計各種不同的遮擋區域來達到幾乎跟真實3D場景一樣的前後效果。



但是要注意的是這種作法鏡頭不能移動,但可以360度的轉動

影片鏡頭只能轉不能移動




渲染前後順序

在一開始的場景你或許會覺得很奇怪,為什麼球體都那麼小?

由於為了要確保主角一定要在背景前面與前景後面,這個Demo在程式腳本做了一些判斷來動態的調整前景和背景的Render Queue,確保主角進入房間之後,該房間的背景和前景都會對應正確的數字,讓主角渲染在背景之前,前景之後。
這樣不管球體多小,他一定會在人物之前渲染。

利用Render Queue來排序前後關係

陰影處理

360原理是被一個圓球包覆,實際上沒有真的地板來投放陰影,因此許多AR或是這種360場景都沒有做陰影處理,實際上你可以放一片Mesh在腳上跟著主角,陰影會產生在這片臨時地板上,再透過Shader把陰影以外的部分去除掉,調低光源的強度讓陰影帶有一點半透明,就會產生不錯的影子效果。


陰影效果

窗戶投射的光源

為了要讓主角更加融入場景,我們希望主角走過窗戶時要有光投射到身上的效果,我們可以很簡單的把這個房間的背景圖複製一份之後,用Photoshop處理剩下光照的部分並把圖片設定作為Cookie

最重要的設定是alpha source要設定為From Gary Scale才能以圖片灰階為Alpha。

在鏡頭的位置擺設一顆Point Light之後,指定這張Cookie並只對主角有作用,就可以達到在對的位置投射窗戶的效果到主角身上,完全不需要任何模型作為基礎。是不是出乎意料的簡單?

採用Point cookie製作窗戶光影

製作鏡子反射


還原鏡子的反射在這裡我們用了第二隻鏡頭放在鏡子位置的後面,並且只設定對Player物件有反應,因此主角走過去之後會被鏡頭捕捉到,並做成一張Render Texture貼到原本鏡子該有的位置,從畫面上看來就可以造成幾可亂真的鏡子疊合假象。


鏡子反射

自動切換鏡頭

這個Demo的鏡頭切換採用Cinemachine裡的Clear shot鏡頭功能,他可以指定一個鏡頭群,並智能的判斷該切換到哪一個房間鏡頭,完全符合這個專案需求。


利用Cinemachine裡的Clear shot製作自動切換鏡頭


互動製作

從鏡子的製作你可以發現到,如果你有一些想要互動的物件,你仍然可以把他們留在場景裡不要刪除,這些物件在鏡頭觀看的時候還是會完美的和360疊合一起毫無維和,然後用一般的開發流程來幫他們加上互動要素。
360場景留下一台可以互動的拉霸機模型物件


總結

這樣的專案有幾個問題點:

  • 對於影片格式的360佔用空間要注意
  • 互動製作會因為場景扁平化之後變得比較不容易
  • 鏡頭必須動的專案類型不適合


這種專案的好處有:

  • 不管模型多複雜,效能都很好
  • 不管什麼奇怪的設備,能播影片的都能跑
  • 專案分為兩個一個用來錄製360, 一個作為產品專案會很小


其他注意事項:

  • 錄製360的Unity必須要2018以上,產品專案則不需要。
  • LoD, OC不要開
  • PPS 能開就開
  • 帶有文字的場景烘完後從內部看字會相反,這時可以從影片來源先水平翻轉一次。
  • 強烈建議4K品質效果會比較好



用攝影機拍攝的360是否也能這樣處理?
或許你有一個疑問,如果是用360鏡頭拍攝的是否也能夠做同樣的處理?答案是可行的,但它的處理方式又會有很多地方需要注意。以下是一段演講錄影,對於本次內容有問題的也可以參考這段影片。希望這些說明能給你帶來一些啟示。


著作人