在Inspector面板右上角的下拉菜單中,選擇Debug命令,啓動調試模式,此時將顯示組件包含的全部變量,包括私有變量,當運行編輯器時,能夠實時查看各組件全部變量的變化。數組
當使用Debug.Log方法輸出信息時,可將gameObject做爲此方法的第二個參數,當程序運行時,點擊Console面板中對應的輸出信息,可在Hierarchy面板中高亮顯示掛載了此腳本的遊戲對象。緩存
void Start() { Debug.Log("this is a message",gameObject); }
當Debug.Log方法的輸出消息是字符串時,可使用富文本標記來強調內容。以下代碼所示:性能優化
Debug.Log("<color=red>Fatal error:</color> AssetBundle not found");
輸出效果:編輯器
當變量隨着時間的推動而改變時,可以使用AnimationCurve實例在程序運行時繪製此數據,以下代碼所示:ide
public AnimationCurve plot = new AnimationCurve(); void Update() { float value = Mathf.Sin(Time.time); plot.AddKey(Time.realtimeSinceStartup, value); }
返回Unity編輯器,運行程序,點擊plot屬性,此時會隨着時間動態繪製數據的變化狀況,以下圖所示:函數
選擇遊戲對象,在Inspector面板上點擊Add Component按鈕,在搜索框中輸入新建的腳本名稱並回車,可新建腳本並掛載到目標遊戲對象上,雙擊腳本名稱進行腳本編寫。工具
Unity可以讀取部分第三方創做工具保存的項目文件,好比Photoshop的PSD,Blender的源文件等,不須要從這些軟件導出中轉文件格式,好比Jpg、FBX等。性能
將PSD文件另存爲PSB格式,將其導入Unity後可保留文件圖層結構,此時須要在Package Manager中安裝2D PSD Importer,而且在文件的導入屬性中設置Texture Type 爲Sprite (2D and UI)。測試
點擊遊戲對象Inspector面板左上角的下拉菜單,可爲遊戲對象指定一個特定顏色的標識,這對空遊戲對象的可視化也比較有用。點擊Other...按鈕,能夠用本身的圖片來進行標識。優化
點擊Scene面板右上角的Gizmo下拉列表,能夠選擇顯示或隱藏某類組件的圖標和Gizmo標識;也可點擊Game面板右上角的Gizmo按鈕,顯示或隱藏全部資源的圖標和Gizmo。
可以使用StringBuilder進行字符串的拼接,不要使用字符串相加的形式,由於這樣會帶來額外的內存垃圾。以下代碼所示:
StringBuilder myStr = new StringBuilder(); myStr.Append("Hello").Append("The").Append("World");
不建議:
string myStr = "Hello" + "the" + "world";
使用StringBuilder須要引用命名空間System.Text。
對於遊戲數據好比武器、成就等,可以使用ScriptableObjects在編輯器中進行有效組織。以下代碼所示:
using UnityEngine; [CreateAssetMenu(fileName = "New Item", menuName = "Item")] public class NewBehaviourScript : ScriptableObject { public string ItemName; public int ItemLevel; public Texture2D ItemIcon; }
選擇 Edit > Preferences > General 命令,在Script Changes While Playing中,能夠設置編輯器在播放狀態下若是腳本發生改變後的處理,好比中止播放從新編譯等。
將類繼承自EditorWindow,能夠添加自定義窗口,在此基礎上編寫一些命令和工具,以下代碼所示:
using UnityEngine; using UnityEditor; public class ExampleWindow : EditorWindow { [MenuItem("Window/Example")] public static void ShowWindow() { GetWindow<ExampleWindow>("Example"); } }
執行效果:
也可對Inspector進行自定義,添加一些控件。以下代碼所示:
using UnityEngine; using UnityEditor; [CustomEditor(typeof(Sphere))] public class SphereEditor : Editor { public override void OnInspectorGUI() { GUILayout.Label("自定義Inspector"); GUILayout.Button("肯定"); } }
執行效果:
使用快捷鍵Q、W、E、R、T、Y切換移動、旋轉、縮放等工具。
RectTransform工具通常用於縮放2D物體,對3D物體使用該工具能夠在某個二維平面對其進行縮放,這取決於物體與視口的關係。
按下Ctrl鍵對遊戲對象進行移動、旋轉、縮放,將以步進的形式進行操做,選擇Editor > Snap Settings...命令,可設置步進大小。
按下V鍵,在遊戲對象上選擇頂點進行拖放,將以此頂點爲基礎,把遊戲對象吸附到其它頂點的位置。
在Project面板中選擇Create > Assembly Definition 命令,建立程序集文件,而後將其拖放到指定的文件夾中,定義腳本依賴關係,能夠確保腳本更改後,只會從新生成必需的程序集,從而減小編譯時間。
當時間縮放爲0時(即Time.timeScale=0f),waitForSeconds方法將不會中止等待,後續代碼也不會執行,此時可以使用WaitForSecondsRealtime方法,以下代碼所示:
Time.timeScale = 0f; yield return new WaitForSecondsRealtime(1f);
當某組件須要被頻繁訪問時,可在初始化時預先獲取該組件的引用,從而避免在訪問時因爲重複獲取引發的性能開銷。
private Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } void Update() { rb.AddForce(0f, -2f, 0f); }
一樣的狀況,也不要在使用Camera.main獲取攝像機組件,尤爲避免使用相似如下方法:
Camera cam = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<Camera>();
這樣會帶來更大的性能消耗。
若是某字符串在整個應用過程當中不會改變且被頻繁使用,可將其存儲在靜態只讀變量中,從而節省內存分配,以下代碼所示:
static readonly string Fire1 = "Fire1"; void Update() { Input.GetAxis(Fire1); }
不建議:
void Update() { Input.GetAxis("Fire1"); }
爲變量添加一些屬性可以使它們在Inspector面板中更容易被使用。在變量前添加Range屬性可將其限定在某個範圍內使用滑塊進行調節,以下代碼所示:
[Range(0f,10f)] public float speed = 1f;
執行效果:
兩個變量聲明之間加入[Space]可在Inspector中添加一個空行;添加Header可在Inspector面板中加入一段文字,以下代碼所示:
[Header("Player Settings")] public float speed = 1f; public int size = 10;
執行效果:
在變量前加入Tooltip,當鼠標懸停在Inspector面板中的變量上時,可顯示關於此變量的說明,以下代碼所示:
[Tooltip("移動速度")] public float speed = 1f;
執行效果:
在Project面板中,將一個場景文件拖到另一個上,可將場景進行合併。
選擇一個遊戲對象,使用快捷鍵Ctrl+D可快速建立該遊戲對象的副本,一樣的方法可建立數組元素的副本。
當完成某個組件的屬性設置後,可點擊組件右上角的預設按鈕,將當前屬性設置保存爲預設,方便後續進行組件設置時使用。
可以使用foreach循環遍歷遊戲對象的全部子物體,以下代碼所示:
foreach (Transform child in transform) { Debug.Log(child.name); }
使用transform.SetSiblingIndex方法能夠設置遊戲對象在Hierarchy面板中的順序,以下代碼所示:
transform.SetSiblingIndex(1);
以上代碼實如今遊戲運行時,設置遊戲對象在Hierarchy面板中的順序爲同級節點中的第二個。
當選擇了多個遊戲對象後,可在 Edit > Selection 的子菜單中選擇一個Save Selection項,暫存當前選擇狀態。選擇Load Selection+對應的序號,便可恢復某個選擇狀態。此方法對跨節點選擇多個對象的狀況很是適用,這樣將沒必要依次展開節點從新進行查找選擇。
使用#region 和 #endregion能夠將二者之間包含的代碼摺疊,方便閱讀。
使用EditorApplication.isPaused可經過代碼在編輯器播放時將其暫停,以下代碼所示:
void Update() { if (Time.time >= 10f) { EditorApplication.isPaused = true; } }
須要引用命名空間UnityEditor。
點擊暫停按鈕右側的步進(Step)按鈕,能夠在程序運行時逐幀查看程序運行狀態。
點擊Game窗口右上角的Stats按鈕能夠查看遊戲性能統計數據,如幀率、批處理等指標。
查看更加詳細的分析數據,可以使用Window > Analysis > Profiler工具;使用Profiler.BeginSample和Profiler.EndSample方法可在Profiler中查看函數的資源使用狀況,以下代碼所示:
Profiler.BeginSample("expensive"); CalculateSomething(); Profiler.EndSample();
須要引入UnityEngine.Profiling命名空間。
一般狀況下,項目資源在Inspector面板底部均有一個預覽窗口。鼠標右鍵點擊預覽窗口頂部,可將該窗口彈出,做爲獨立窗口,放置在編輯器的任意位置。
點擊Game窗口右上角的Mute Audio按鈕,可在編輯器播放時將全部聲音關閉。
InvokeRepeating可以按照必定的時間間隔反覆執行某個函數,若不使用CancelInvoke方法,InvokeRepeating將持續執行,即便將方法所在的腳本關閉。
使用Frame Debugger(Window > Analysis > Frame Debugger)能夠查看每一幀的渲染過程。
使用Physics Debugger(Window > Analysis > Physics Debugger)能夠查看碰撞引發的異常,當開啓Collision Geometry選項後,場景中全部遊戲對象的碰撞體都將被繪製出來,而不用依次選擇遊戲對象進行檢查。以下圖所示,球體由於添加了不正確的Box Collider,在物理碰撞時必然不能達到預期的表現效果。