2017年12月19日 星期二

Unity 2017.3 新功能:程式集定義檔

作者:Lukasz Paczkowski 原文
潤稿:Kelvin Lo



隨著2017.3的到來,我們想要跟你介紹兩個你可能會喜歡的新功能。

首先是程序集定義檔(Assembly Definition Files)。有了這個功能你可以選擇在一個文件夾中定義自己的託管程序集。透過定義依賴關係,就可以確保在腳本中進行更改時,只會重建所需的程序集,進而縮短編譯時間。


當專案越大,編譯時間就不可避免地變久。在一個專案上迭代時很容易造成麻煩,所以設定合適的程序集定義檔可以幫助你更有效率,並花費更少的時間等待腳本的編譯。

第二個功能是新的變換工具(Transform Tool)。我們把三種常用的工具(移動、旋轉和縮放)整合成一個。對我們來說很容易辦到但卻可以節省很多調整時間。

快去下載新的Unity 2017.3。記住在升級專案之前最好先備份。

腳本編譯—程式集定義檔


Unity自動定義腳本編譯為託管程式集的方式。Unity編輯器中進行腳本更改反覆運算的編譯時間會隨腳本數量的增加而增加。當然,在進行迭代運算時,我們一定是希望編譯的速度越快越平順越好。

使用新的程式集定義檔特性,基於資料夾中的腳本定義你自己的託管程式集。如果你將專案腳本分為多個程式集,並定義良好的依賴,確保你在更改某個腳本時,只重新產生必需的程式集。這減少了編譯時間,因此你可以在Unity專案中將每個託管程式集看做是單個的庫。




上圖展示可以將專案腳本分為多個程式集。如果你只改了Main.dll中的腳本,那其它程式集都不需要重新編譯。由於Main.dll包含的腳本更少,因此它的編譯速度比Assembly-CSharp.dll更快。 同樣的你對Stuff.dll的更改,僅會導致Main.dll和Stuff.dll重新編譯。

如何使用程式集定義檔


程式集定義檔是資源檔,可以透過Assets > Create > Assembly Definition功能表來建立。它們的副檔名是.asmdef。

你可以將一個程式集定義檔加到Unity專案中的一個資料夾裡,對裡面所有的腳本進行編譯,然後在檢視視窗中
設定程式集名稱

注意:程式集定義檔所在的資料夾名稱,以及程式集定義檔的檔案名,對程式集的名稱毫無影響。



你還可以使用檢視視窗增加對專案中其它程式集定義檔的引用。編譯器集和定義程式集間的依賴時會用到這些引用。

Unity使用引用來編譯器集,以及定義程式集之間的依賴關係。你可以在檢視視窗中設定程式集定義檔的平台相容性,也可以選擇排除或包括特定平台。

資料夾層級中的多程式集定義檔


如果在一個資料夾層級中,有多個程式集定義檔(副檔名:asmdef),將會使每個腳本被添加到最短路徑距離的程式集定義檔中去。

範例:

假設你有一個Assets/ExampleFolder/MyLibrary.asmdef和一個Assets/ExampleFolder/ExampleFolder2/Utility.asmdef檔,那麼:

  • Assets > ExampleFolder > ExampleFolder2資料夾中的所有腳本將會被編譯到Assets/ExampleFolder/ExampleFolder2/Utility.asmdef定義的程式集中。
  • Assets > ExampleFolder資料夾中的所有腳本,除Assets > ExampleFolder> ExampleFolder2中的腳本之外,將會被編譯到Assets/ExampleFolder/MyLibrary.asmdef定義的程式集中。

程式集定義檔不屬於產生系統的檔


注意:程式集定義檔不屬於程式集產生檔。它們不支援在產生系統中常見的條件化產生規則。

這也是程式集定義檔不支援預處理指令(定義)的原因,因為它們一直是靜態的。

向下相容與隱式依賴


程式集定義檔向下相容Unity中現存的[預定義編譯系統](Predefined Compilation System)。也就是說,預定義程式集總是依賴於每個程式集定義檔的程式集。這與Unity中所有腳本都依賴於所有和當前生成目標相容的預編譯器集(外掛程式/.dll)的情況相似。



圖表顯示了預定義程式集、程式集定義檔以及預編譯器集之間的依賴關係。

Unity給予程式集定義檔的優先順序要比[預定義編譯系統](ScriptCompileOrderFolders)高。

這代表任何來自程式集定義檔資料夾內的預定義編譯的特殊資料夾名,都不會對編譯產生任何影響。Unity只將它們視為常規資料夾。

強烈建議你對專案中的所有腳本使用程式集定義檔,或完全不使用。否則,沒有使用程式集定義檔的腳本會在每次程式集定義檔重新編譯時也被重新編譯。這會減少你在專案中程式集定義檔所帶來的好處。


API


在UnityEditor.Compilation命名空間中,有一個靜態的CompilationPipeline類,你可用它獲取程式集定義檔以及所有由Unity生成的程式集的資訊。


檔案格式


程式集定義檔都是JSON檔。它們有以下這些欄位:

FieldType
namestring
references (optional)string array
includePlatforms (optional)string array
excludePlatforms (optional)string array

欄位includePlatforms和 excludePlatforms不能在同一個程式集定義檔中使用。要獲取平台名,可使用:

1
CompilationPipeline.GetAssemblyDefinitionPlatforms


範例



更多相關討論與範例可以訪問討論區

變換工具 Transform Tool

2017.3裡你會發現一個新的變換工具,從此你就不需要再移動、旋轉、縮放之間切來切去,一個工具搞定。

點工具列最右邊的按鈕,或按"Y"即可開始使用。


World gizmo

將軸心旋轉設為"Global"模式,可以沿著世界座標軸平移和旋轉物件。

座標軸平移,平面平移

座標軸旋轉,螢幕空間旋轉,自由旋轉

全域縮放


Local gizmo

當軸心設為"Local"模式,你可以沿本地座標軸進行縮放

本地座標軸縮放


Screen Space Gizmo

如果你按住Shift鍵會進入螢幕空間模式。這個模式可以在整個螢幕裡移動和旋轉。


鎖定(Snapping)

當你按住Ctrl(Win)或Command(Mac)時,會賦予鎖定(Snap)給下列功能:

  • 坐標軸平移 Axes translations
  • 平面平移 Plane translations
  • 座標軸旋轉 Axes rotations
  • 座標軸縮放 Axes scaling
  • 全域縮放 Global scaling
平面平移,座標軸平移,全域縮放,座標軸旋轉


頂點吸附(Vertex Snapping)

當你按住V鍵時,物件會進入頂點吸附模式。這樣你可以平移所選物件,讓他的頂點與另外一個物件頂點黏合。


Unity 2017.3已經發佈,立刻到官網下載體驗!

沒有留言:

張貼留言

關於我自己

我的相片
Unity台灣官方部落格 請上Facebook搜尋Unity Taiwan取得Unity中文的最新資訊