原帖地址:https://zhuanlan.zhihu.com/p/54763553html
在Scene面板右上角的Gizmo下拉列表中,能夠經過設置Selection Outline選項決定是否在選中物體時顯示邊緣高亮的標識。數據結構
在攝像機上掛載Pixel Perfect Camera組件可以使2D像素風格的遊戲畫面更加整潔清晰。此組件須要使用Package Manager安裝2D Pixel Perfect包。dom
對於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)時,則相反。編輯器
默認狀況下,使用Destroy()方法會當即銷燬遊戲對象,若是想延遲一段時間再銷燬,可在此方法中傳遞一個時間參數,以下:ide
Destroy(gameObject,2f);
在Project面板中選中一個自定義Shader,右鍵選擇新建材質(Create>Material),則材質默認使用的着色器爲z以前選擇的Shader,同時材質名稱爲Shader的名稱。函數
一般狀況下,新建的腳本要掛載到遊戲對象上才能運行,若是在腳本中的方法前使用[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)],能夠不用掛載到任何遊戲對象上便可在程序運行時執行此方法,方便在在程序初始化前作一些額外的初始化工做。以下代碼所示:工具
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] public static void DoSomething() { Debug.Log("It's the start of the game"); }
在程序運行時改變組件的各屬性值,當中止運行後,這些改變將重置爲編輯狀態下的數值,。程序運行時改變了組件的屬性值,能夠點擊組件右上角的齒輪按鈕,選擇Copy Component命令,中止播放後,在相同的組件上,執行Paste Component Value,從而可以保存在運行時對該組件作出的改變。佈局
咱們知道Random.value可以返回0~1之間的隨機數,因此讓此隨機數與0.5f進行比較,就可以獲取一個隨機的布爾值True或者False,以下代碼所示:性能
bool trueOrFalse = (Random.value > 0.5f);
若是數據結構僅保存了有限的幾個數值變量,能夠考慮使用struct代替Class,由於Class實例由垃圾回收機制來保證內存的回收處理;而struct變量使用完後當即自動解除內存分配。動畫
當使用Visual Studio進行代碼編寫時,可雙擊Tab鍵來輔助完成像if、for、switch等語句的補全。
在一個協程裏開啓另一個協程,可以使用如下方法:
void Start() { StartCoroutine(FirstCo()); } IEnumerator FirstCo() { yield return StartCoroutine(SecondCo()); } IEnumerator SecondCo() { yield return 0; }
使用Animation工具還能夠改變腳本的變量。
在Animation窗口中,按下Ctrl+A,全部關鍵幀將集中顯示在窗口中;選擇某些關鍵幀,按下F鍵,可將它們居中顯示在窗口中;按下C鍵,能夠在曲線視圖和關鍵幀視圖間切換;按下K鍵添加關鍵幀。
在Animator窗口中,設置動畫的Speed屬性爲-1可以使動畫片斷反向播放。
將兩點之間的距離與一個固定距離進行比較時,可以使兩點相減而後取平方(即sqrMagnitude),而後用該值與某個距離值的平方進行比較。不建議使用Vector3.Distance方法獲取兩點之間距離,而後與給定的距離值進行比較。由於Vector3.Distance(a,b) 至關於 (a-b).magnitude,即求平方後開根,而sqrMagnitude方法省去了求平方根的操做,因此比magnitude執行快。
建議:
if ((pointA - pointB).sqrMagnitude < dist * dist) { }
不建議:
if (Vector3.Distance(pointA, pointB) < dist) { }
使用TextMeshPro可以得到更多的文字控制自由度,而且可以有效防止文字邊緣模糊。以下圖所示,第一行文字經過"Create > UI > Text"命令建立,第二行文字經過"Create > UI > TextMeshPro - Text"命令建立。
將私有變量標記爲SerializeField,可在Inspector面板中將其顯示。
[SerializeField] private int myNumber = 20;
若是不但願在Inspector面板中顯示公有變量,可將其標記爲[HideInInspector]。
[HideInInspector] public int myNumber = 20;
當變量重命名後,若是但願繼續保留其數值,可以使用FormerlySerializedAs,以下代碼所示:
[FormerlySerializedAs("hp")] public int myNumber = 20;
須要引用命名空間:
using UnityEngine.Serialization;
可將常常訪問的文件夾的快捷方式拖入Project面板中,雙擊快捷方式可快速打開此目錄。
選擇遊戲對象,按下F鍵,可將Scene的視口中央移動到該遊戲對象處;按下Shift+F,可將視口與該遊戲對象鎖定,即不管如何移動遊戲對象,視口中央始終跟隨此遊戲對象。
在Hierarchy面板中選擇攝像機,按下Ctrl+Shift+F,可將攝像機移動到可以呈現Scene窗口中內容的位置。
當對遊戲對象的Tag進行比對時,從性能考慮,可以使用CompareTag方法,不建議使用雙等號進行判斷。由於CompareTag不須要內存分配以及垃圾回收,而從遊戲對象中檢索字符串的話,會分配內存而且須要垃圾回收。
建議:
if (gameObject.CompareTag("Enemy")) { }
不建議:
if (gameObject.tag == "Enemy") { }
在Hierarchy面板中,可使用名稱中帶有分隔符的空遊戲對象進行組織管理。
若是須要查找掛載了某個組件的遊戲對象,直接在Hierarchy面板的搜索框中輸入組件名稱便可,須要注意組件名稱中的空格,好比搜索」MeshCollider「而不是」Mesh Collider「。
在Project面板中的搜索框中輸入"t:"+資源類型,能夠過濾顯示某種類型的資源,好比輸入"t:scene",會過濾出全部場景文件,輸入"t:texture",則會顯示全部貼圖。
在Visual Studio中,使用快捷鍵Alt+上下鍵,能夠在代碼塊中快速上移/下移光標所在的代碼行,不用複製粘貼。
點擊組件右上角的文檔按鈕,可快速打開關於當前組件的文檔。建議下載離線文檔,以便更加快速打開文檔,若是沒有下載,Unity將打開在線文檔。
在Unity文檔中點擊Documentation Version連接,可查看不一樣版本的文檔。
在Hierarchy面板中,按下Alt鍵,鼠標左鍵點擊樹形節點,可展開/摺疊當前節點下的全部子節點。
Unity窗口布局可自定義,調整完畢之後,若是但願之後繼續沿用此佈局,點擊編輯器右上角的Layout下拉列表,選擇命令Save Layout,可將當前窗口布局進行保存。
選擇命令Editor > Preferences命令,可自定義編輯器當前主題的顏色。
修改Playmode tint的顏色值,能夠改變編輯器在運行模式時的顏色,以提醒開發者此時爲運行模式。
在Scene面板頂部的圖片下拉列表中,可選擇開關某種類型的特效。
要在編輯器的菜單欄中選擇執行編寫的函數,可在函數前添加MenuItem屬性,以下代碼所示:
[MenuItem("MyMenu/Do Something")] static void DoSomething() { }
使用ContextMenu屬性標記函數,可以在腳本所在的上下文菜單中調用,以下代碼所示:
[ContextMenu("Do Something")] void DoSomething() { }
在編輯器右上角的Layers下拉列表中,點擊對應層右側的眼睛按鈕,能夠隱藏或顯示某個層上的對象;點擊鎖按鈕,可對某個層進行鎖定或解鎖,當被鎖定後,該層上的全部對象將不能被選擇。
當建立層時,使用斜槓符進行路徑式命名能夠爲層添加子菜單,能夠更好地組織項目。
在不一樣的目標平臺下添加 Scripting Define Symbols(Project Settings > Player > Scripting Define Symbols),以分號分隔,能夠將這些符號像使用Unity內置標籤同樣用做#if指令的條件。
在使用Color控件的滴管工具進行顏色選擇時,能夠拾取Unity編輯器以外的顏色。
在顏色屬性之間也可使用右鍵命令進行復制粘貼。
使用快捷鍵Shift+空格鍵,能夠快速最大化鼠標所在的窗口,而不用選擇窗口右上角的Maximize命令。
在數據類型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的則能夠顯示。
在 Edit > Project Settings... > Physics 中,經過設置Layer Collision Matrix 能夠決定可以互相碰撞的層。
當兩個對象發生碰撞時,會發送不一樣的碰撞事件,如OnTriggerEnter、OnCollisionEnter等等,這取決於具體的碰撞體設置,下表列出了不一樣類型的碰撞體發生碰撞時所能發出的事件類型。詳情可參考Unity 官方文檔:https://docs.unity3d.com/Manual/CollidersOverview.html
在Inspector面板中涉及到數值輸入的字段,不只能夠直接輸入數據,還能夠在輸入框中輸入數學表達式,按下回車後Unity會將計算結果填充到輸入框中。
點擊Inspector右上角的鎖定按鈕,或在上下文菜單中選擇Lock命令,能夠將當前選中游戲對象的Inspector面板鎖定。而後選擇Add Tab > Inspector命令,添加一個Inspector,這樣可以方便在兩個遊戲對象之間互相拷貝組件數據。