原帖地址:https://zhuanlan.zhihu.com/p/54763553
1. 高亮選擇
在Scene面板右上角的Gizmo下拉列表中,可以通過設置Selection Outline選項決定是否在選中物體時顯示邊緣高亮的標識。
2.Pixel Perfect Camera
在攝像機上掛載Pixel Perfect Camera組件能夠使2D像素風格的游戲畫面更加整潔清晰。此組件需要使用Package Manager安裝2D Pixel Perfect包。
3.以Y軸為依據進行Sprite排序
對於2D游戲,將Transparency Sort Mode (Edit > Project Settings > Graphics ) 設置為Custom Axis,然后設置Transparency Sort Axis,場景中的Sprite可以根據Y軸進行排序。如下圖所示,當設置為(0,1,0)時,Y坐標相對較大的Sprite排在Y坐標相對較小的Sprite之下,當設置為(0,-1,0)時,則相反。
4. 延遲銷毀游戲對象
默認情況下,使用Destroy()方法會立即銷毀游戲對象,如果想延遲一段時間再銷毀,可在此方法中傳遞一個時間參數,如下:
Destroy(gameObject,2f);
5. 快速新建基於自定義Shader的材質
在Project面板中選中一個自定義Shader,右鍵選擇新建材質(Create>Material),則材質默認使用的着色器為z之前選擇的Shader,同時材質名稱為Shader的名稱。
6. 腳本不掛載到游戲對象執行
通常情況下,新建的腳本要掛載到游戲對象上才能運行,如果在腳本中的方法前使用[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)],可以不用掛載到任何游戲對象上即可在程序運行時執行此方法,方便在在程序初始化前做一些額外的初始化工作。如下代碼所示:
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] public static void DoSomething() { Debug.Log("It's the start of the game"); }
7. 保存程序運行時組件屬性的改變
在程序運行時改變組件的各屬性值,當停止運行后,這些改變將重置為編輯狀態下的數值,。程序運行時改變了組件的屬性值,可以點擊組件右上角的齒輪按鈕,選擇Copy Component命令,停止播放后,在相同的組件上,執行Paste Component Value,從而能夠保存在運行時對該組件做出的改變。
8. 獲取一個隨機布爾值
我們知道Random.value能夠返回0~1之間的隨機數,所以讓此隨機數與0.5f進行比較,就能夠獲取一個隨機的布爾值True或者False,如下代碼所示:
bool trueOrFalse = (Random.value > 0.5f);
9. 使用Struct代替Class
如果數據結構僅保存了有限的幾個數值變量,可以考慮使用struct代替Class,因為Class實例由垃圾回收機制來保證內存的回收處理;而struct變量使用完后立即自動解除內存分配。
10. Visual Studio 自動語句補全
當使用Visual Studio進行代碼編寫時,可雙擊Tab鍵來輔助完成像if、for、switch等語句的補全。
11.協程嵌套
在一個協程里開啟另外一個協程,可使用以下方法:
void Start() { StartCoroutine(FirstCo()); } IEnumerator FirstCo() { yield return StartCoroutine(SecondCo()); } IEnumerator SecondCo() { yield return 0; }
12.腳本變量參與動畫制作
使用Animation工具還可以改變腳本的變量。
13/14. Animation窗口快捷鍵
在Animation窗口中,按下Ctrl+A,所有關鍵幀將集中顯示在窗口中;選擇某些關鍵幀,按下F鍵,可將它們居中顯示在窗口中;按下C鍵,可以在曲線視圖和關鍵幀視圖間切換;按下K鍵添加關鍵幀。
15. 反向播放動畫
在Animator窗口中,設置動畫的Speed屬性為-1可使動畫片段反向播放。
16.快速比較距離
將兩點之間的距離與一個固定距離進行比較時,可使兩點相減然后取平方(即sqrMagnitude),然后用該值與某個距離值的平方進行比較。不建議使用Vector3.Distance方法獲取兩點之間距離,然后與給定的距離值進行比較。因為Vector3.Distance(a,b) 相當於 (a-b).magnitude,即求平方后開根,而sqrMagnitude方法省去了求平方根的操作,所以比magnitude執行快。
建議:
if ((pointA - pointB).sqrMagnitude < dist * dist) { }
不建議:
if (Vector3.Distance(pointA, pointB) < dist) { }
17. 使用TextMeshPro
使用TextMeshPro能夠獲得更多的文字控制自由度,並且能夠有效防止文字邊緣模糊。如下圖所示,第一行文字通過"Create > UI > Text"命令創建,第二行文字通過"Create > UI > TextMeshPro - Text"命令創建。
18.在Inspector面板中顯示私有變量
將私有變量標記為SerializeField,可在Inspector面板中將其顯示。
[SerializeField] private int myNumber = 20;
19. 在Inspector面板中隱藏公有變量
如果不希望在Inspector面板中顯示公有變量,可將其標記為[HideInInspector]。
[HideInInspector] public int myNumber = 20;
20. 變量重命名后繼續保持值
當變量重命名后,如果希望繼續保留其數值,可使用FormerlySerializedAs,如下代碼所示:
[FormerlySerializedAs("hp")] public int myNumber = 20;
需要引用命名空間:
using UnityEngine.Serialization;
21.使用文件夾快捷方式
可將經常訪問的文件夾的快捷方式拖入Project面板中,雙擊快捷方式可快速打開此目錄。
22/23.F與Shift+F
選擇游戲對象,按下F鍵,可將Scene的視口中央移動到該游戲對象處;按下Shift+F,可將視口與該游戲對象鎖定,即無論如何移動游戲對象,視口中央始終跟隨此游戲對象。
24.對齊Scene與Game視圖
在Hierarchy面板中選擇攝像機,按下Ctrl+Shift+F,可將攝像機移動到能夠呈現Scene窗口中內容的位置。
25. CompareTag方法
當對游戲對象的Tag進行比對時,從性能考慮,可使用CompareTag方法,不建議使用雙等號進行判斷。因為CompareTag不需要內存分配以及垃圾回收,而從游戲對象中檢索字符串的話,會分配內存並且需要垃圾回收。
建議:
if (gameObject.CompareTag("Enemy")) { }
不建議:
if (gameObject.tag == "Enemy") { }
26.使用空游戲對象作為分隔符
在Hierarchy面板中,可以使用名稱中帶有分隔符的空游戲對象進行組織管理。
27. 查找含有某組件的游戲對象
如果需要查找掛載了某個組件的游戲對象,直接在Hierarchy面板的搜索框中輸入組件名稱即可,需要注意組件名稱中的空格,比如搜索”MeshCollider“而不是”Mesh Collider“。
28. 查找某種類型的資源
在Project面板中的搜索框中輸入"t:"+資源類型,可以過濾顯示某種類型的資源,比如輸入"t:scene",會過濾出所有場景文件,輸入"t:texture",則會顯示所有貼圖。
29. 移動代碼行
在Visual Studio中,使用快捷鍵Alt+上下鍵,可以在代碼塊中快速上移/下移光標所在的代碼行,不用復制粘貼。
30.快速查看組件文檔
點擊組件右上角的文檔按鈕,可快速打開關於當前組件的文檔。建議下載離線文檔,以便更加快速打開文檔,如果沒有下載,Unity將打開在線文檔。
31.文檔版本歷史
在Unity文檔中點擊Documentation Version鏈接,可查看不同版本的文檔。
32. 展開/折疊所有節點
在Hierarchy面板中,按下Alt鍵,鼠標左鍵點擊樹形節點,可展開/折疊當前節點下的所有子節點。
33.保存編輯器窗口布局
Unity窗口布局可自定義,調整完畢以后,如果希望以后繼續沿用此布局,點擊編輯器右上角的Layout下拉列表,選擇命令Save Layout,可將當前窗口布局進行保存。
34+35. 改變編輯器顏色
選擇命令Editor > Preferences命令,可自定義編輯器當前主題的顏色。
修改Playmode tint的顏色值,可以改變編輯器在運行模式時的顏色,以提醒開發者此時為運行模式。
36.開關場景特效
在Scene面板頂部的圖片下拉列表中,可選擇開關某種類型的特效。
37.MenuItem屬性
要在編輯器的菜單欄中選擇執行編寫的函數,可在函數前添加MenuItem屬性,如下代碼所示:
[MenuItem("MyMenu/Do Something")] static void DoSomething() { }
38.ContextMenu
使用ContextMenu屬性標記函數,能夠在腳本所在的上下文菜單中調用,如下代碼所示:
[ContextMenu("Do Something")] void DoSomething() { }
39+40. 隱藏和鎖定層
在編輯器右上角的Layers下拉列表中,點擊對應層右側的眼睛按鈕,可以隱藏或顯示某個層上的對象;點擊鎖按鈕,可對某個層進行鎖定或解鎖,當被鎖定后,該層上的所有對象將不能被選擇。
41.層子菜單
當創建層時,使用斜杠符進行路徑式命名可以為層添加子菜單,可以更好地組織項目。
42. 使用Scripting Define Symbols定義腳本
在不同的目標平台下添加 Scripting Define Symbols(Project Settings > Player > Scripting Define Symbols),以分號分隔,可以將這些符號像使用Unity內置標簽一樣用作#if指令的條件。
43+44.顏色
在使用Color控件的滴管工具進行顏色選擇時,可以拾取Unity編輯器之外的顏色。
在顏色屬性之間也可以使用右鍵命令進行復制粘貼。
45.最大化窗口
使用快捷鍵Shift+空格鍵,可以快速最大化鼠標所在的窗口,而不用選擇窗口右上角的Maximize命令。
46. 序列化Struct和Class
在數據類型Struct和Class聲明前使用[System.Serializable],可以將其顯示在Inspector面板中進行賦值。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { public A[] AList; public B[] BList; public A a; public B b; // Use this for initialization void Start () { } // Update is called once per frame void Update () { } } [System.Serializable] public struct A { public int a; public GameObject b; public Vector3 c; } public struct B { public int a; public GameObject b; public Vector3 c; }
可以看到,結構體B的數據無法再面板內顯示,而A的則可以顯示。
47.碰撞矩陣
在 Edit > Project Settings... > Physics 中,通過設置Layer Collision Matrix 可以決定能夠互相碰撞的層。
48.Collider相互作用矩陣
當兩個對象發生碰撞時,會發送不同的碰撞事件,如OnTriggerEnter、OnCollisionEnter等等,這取決於具體的碰撞體設置,下表列出了不同類型的碰撞體發生碰撞時所能發出的事件類型。詳情可參考Unity 官方文檔:https://docs.unity3d.com/Manual/CollidersOverview.html
49. 數值輸入
在Inspector面板中涉及到數值輸入的字段,不僅可以直接輸入數據,還可以在輸入框中輸入數學表達式,按下回車后Unity會將計算結果填充到輸入框中。
50.鎖定Inspector
點擊Inspector右上角的鎖定按鈕,或在上下文菜單中選擇Lock命令,可以將當前選中游戲對象的Inspector面板鎖定。然后選擇Add Tab > Inspector命令,添加一個Inspector,這樣能夠方便在兩個游戲對象之間互相拷貝組件數據。