一、前言
掌握一些Unity編輯器的小技巧,會讓你開發以及使用更加快捷有效。這篇文章就分享一些Unity在使用使用的一些小技巧,有什麼不對的記得留言哦。
二、原文位址
原文出處:蠻牛
原文作者:蠻牛教育講師 邵偉老師
原文連結:http://www.manew.com/thread-143268-1-1.html
三、正文
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.腳本變量參與動畫制作
使用工具還可以改變腳本的變量。
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]。
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方法,不建議使用雙等号進行判斷。
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面闆中進行指派。
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,這樣能夠友善在兩個遊戲對象之間互相拷貝元件資料。
51.Inspector調試模式
在Inspector面闆右上角的下拉菜單中,選擇Debug指令,啟動調試模式,此時将顯示元件包含的所有變量,包括私有變量,當運作編輯器時,可以實時檢視各元件所有變量的變化。
52.高亮顯示Debug.Log對應的遊戲對象
當使用Debug.Log方法輸出資訊時,可将gameObject作為此方法的第二個參數,當程式運作時,點選Console面闆中對應的輸出資訊,可在Hierarchy面闆中高亮顯示挂載了此腳本的遊戲對象。
void Start()
{
Debug.Log("this is a message",gameObject);
}
53.風格化Debug.Log的輸出資訊
當Debug.Log方法的輸出消息是字元串時,可以使用富文本标記來強調内容。如下代碼所示:
Debug.Log("<color=red>Fatal error:</color> AssetBundle not found");
輸出效果:
54.繪制調試資料
當變量随着時間的推進而改變時,可使用AnimationCurve執行個體在程式運作時繪制此資料,如下代碼所示:
public AnimationCurve plot = new AnimationCurve();
void Update()
{
float value = Mathf.Sin(Time.time);
plot.AddKey(Time.realtimeSinceStartup, value);
}
傳回Unity編輯器,運作程式,點選plot屬性,此時會随着時間動态繪制資料的變化情況,如下圖所示:
55.快速建立腳本并挂載到遊戲對象上
選擇遊戲對象,在Inspector面闆上點選Add Component按鈕,在搜尋框中輸入建立的腳本名稱并回車,可建立腳本并挂載到目标遊戲對象上,輕按兩下腳本名稱進行腳本編寫。
56.導入第三方項目檔案
Unity能夠讀取部分第三方創作工具儲存的項目檔案,比如Photoshop的PSD,Blender的源檔案等,不需要從這些軟體導出中轉檔案格式,比如Jpg、FBX等。
57.導入後保留PSD檔案的圖層結構
将PSD檔案另存為PSB格式,将其導入Unity後可保留檔案圖層結構,此時需要在Package Manager中安裝2D PSD Importer,并且在檔案的導入屬性中設定Texture Type 為Sprite (2D and UI)。
58+59.為遊戲對象指定/自定義圖示
點選遊戲對象Inspector面闆左上角的下拉菜單,可為遊戲對象指定一個特定顔色的辨別,這對空遊戲對象的可視化也比較有用。點選Other…按鈕,可以用自己的圖檔來進行辨別。
60/61.顯示/隐藏Gizmo
點選Scene面闆右上角的Gizmo下拉清單,可以選擇顯示或隐藏某類元件的圖示和Gizmo辨別;也可點選Game面闆右上角的Gizmo按鈕,顯示或隐藏所有資源的圖示和Gizmo。
62.字元串拼接
可使用StringBuilder進行字元串的拼接,不要使用字元串相加的形式,因為這樣會帶來額外的記憶體垃圾。如下代碼所示:
StringBuilder myStr = new StringBuilder();
myStr.Append("Hello").Append("The").Append("World");
string myStr = "Hello" + "the" + "world";
使用StringBuilder需要引用命名空間System.Text。
63.使用ScriptableObjects管理遊戲資料
對于遊戲資料比如武器、成就等,可使用ScriptableObjects在編輯器中進行有效組織。如下代碼所示:
using UnityEngine;
public class NewBehaviourScript : ScriptableObject
{
public string ItemName;
public int ItemLevel;
public Texture2D ItemIcon;
}
64.編輯器播放時修改腳本後的處理
選擇 Edit > Preferences > General 指令,在Script Changes While Playing中,可以設定編輯器在播放狀态下如果腳本發生改變後的處理,比如停止播放重新編譯等。
65.自定義視窗
将類繼承自EditorWindow,可以添加自定義視窗,在此基礎上編寫一些指令和工具,如下代碼所示:
using UnityEngine;
using UnityEditor;
public class ExampleWindow : EditorWindow
{
[MenuItem("Window/Example")]
public static void ShowWindow()
{
GetWindow<ExampleWindow>("Example");
}
}
執行效果:
66.自定義Inspector
也可對Inspector進行自定義,添加一些控件。如下代碼所示:
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(Sphere))]
public class SphereEditor : Editor
{
public override void OnInspectorGUI()
{
GUILayout.Label("自定義Inspector");
GUILayout.Button("确定");
}
}
67.工具快捷鍵
使用快捷鍵Q、W、E、R、T、Y切換移動、旋轉、縮放等工具。
68.使用RectTransform工具縮放3D物體
RectTransform工具一般用于縮放2D物體,對3D物體使用該工具可以在某個二維平面對其進行縮放,這取決于物體與視口的關系。
69+70+71.吸附
按下Ctrl鍵對遊戲對象進行移動、旋轉、縮放,将以步進的形式進行操作,選擇Editor > Snap Settings…指令,可設定步進大小。
按下V鍵,在遊戲對象上選擇頂點進行拖放,将以此頂點為基礎,把遊戲對象吸附到其它頂點的位置。
72. 管理程式集
在Project面闆中選擇Create > Assembly Definition 指令,建立程式集檔案,然後将其拖放到指定的檔案夾中,定義腳本依賴關系,可以確定腳本更改後,隻會重新生成必需的程式集,進而減少編譯時間。
73.WaitForSecondsRealtime
當時間縮放為0時(即Time.timeScale=0f),waitForSeconds方法将不會停止等待,後續代碼也不會執行,此時可使用WaitForSecondsRealtime方法,如下代碼所示:
Time.timeScale = 0f;
yield return new WaitForSecondsRealtime(1f);
74+75.緩存元件引用
當某元件需要被頻繁通路時,可在初始化時預先擷取該元件的引用,進而避免在通路時由于重複擷取引起的性能開銷。
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
rb.AddForce(0f, -2f, 0f);
}
同樣的情況,也不要在使用Camera.main擷取錄影機元件,尤其避免使用類似以下方法:
Camera cam = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<Camera>();
這樣會帶來更大的性能消耗。
76.字元串性能優化
如果某字元串在整個應用過程中不會改變且被頻繁使用,可将其存儲在靜态隻讀變量中,進而節省記憶體配置設定,如下代碼所示:
static readonly string Fire1 = "Fire1";
void Update()
{
Input.GetAxis(Fire1);
}
void Update()
{
Input.GetAxis("Fire1");
}
77/78/79/80.友善使用的中繼資料
為變量添加一些屬性可使它們在Inspector面闆中更容易被使用。在變量前添加Range屬性可将其限定在某個範圍内使用滑塊進行調節,如下代碼所示:
[Range(0f,10f)]
public float speed = 1f;
兩個變量聲明之間加入[Space]可在Inspector中添加一個空行;添加Header可在Inspector面闆中加入一段文字,如下代碼所示:
public float speed = 1f;
public int size = 10;
在變量前加入Tooltip,當滑鼠懸停在Inspector面闆中的變量上時,可顯示關于此變量的說明,如下代碼所示:
[Tooltip("移動速度")]
public float speed = 1f;
81.在Unit編輯器中通路Asset Store
Asset Store可在Unity編輯器和網頁浏覽器中通路。(此條有充數嫌疑)
82.合并場景
在Project面闆中,将一個場景檔案拖到另外一個上,可将場景進行合并。
83/84.建立遊戲對象/數組元素副本快捷鍵
選擇一個遊戲對象,使用快捷鍵Ctrl+D可快速建立該遊戲對象的副本,同樣的方法可建立數組元素的副本。
85.元件預設
當完成某個元件的屬性設定後,可點選元件右上角的預設按鈕,将目前屬性設定儲存為預設,友善後續進行元件設定時使用。
86.周遊遊戲對象所有子物體
可使用foreach循環周遊遊戲對象的所有子物體,如下代碼所示:
foreach (Transform child in transform)
{
Debug.Log(child.name);
}
87.通過腳本改變遊戲對象在Hierarchy中的順序
使用transform.SetSiblingIndex方法可以設定遊戲對象在Hierarchy面闆中的順序,如下代碼所示:
transform.SetSiblingIndex(1);
以上代碼實作在遊戲運作時,設定遊戲對象在Hierarchy面闆中的順序為同級節點中的第二個。
88.儲存選擇狀态
當選擇了多個遊戲對象後,可在 Edit > Selection 的子菜單中選擇一個Save Selection項,暫存目前選擇狀态。選擇Load Selection+對應的序号,即可恢複某個選擇狀态。此方法對跨節點選擇多個對象的情況非常适用,這樣将不必依次展開節點重新進行查找選擇。
89.#region 和 #endregion
使用#region 和 #endregion可以将兩者之間包含的代碼折疊,友善閱讀。
90.通過腳本暫定編輯器播放
使用EditorApplication.isPaused可通過代碼在編輯器播放時将其暫停,如下代碼所示:
void Update()
{
if (Time.time >= 10f)
{
EditorApplication.isPaused = true;
}
}
需要引用命名空間UnityEditor。
91.逐幀檢視程式運作
點選暫停按鈕右側的步進(Step)按鈕,可以在程式運作時逐幀檢視程式運作狀态。
92/93/94.檢視遊戲性能統計
點選Game視窗右上角的Stats按鈕可以檢視遊戲性能統計資料,如幀率、批處理等名額。
檢視更加詳細的分析資料,可使用Window > Analysis > Profiler工具;使用Profiler.BeginSample和Profiler.EndSample方法可在Profiler中檢視函數的資源使用情況,如下代碼所示:
Profiler.BeginSample("expensive");
CalculateSomething();
Profiler.EndSample();
需要引入UnityEngine.Profiling命名空間。
95.彈出預覽視窗
通常情況下,項目資源在Inspector面闆底部均有一個預覽視窗。滑鼠右鍵點選預覽視窗頂部,可将該視窗彈出,作為獨立視窗,放置在編輯器的任意位置。
96.測試遊戲時靜音
點選Game視窗右上角的Mute Audio按鈕,可在編輯器播放時将所有聲音關閉。
97.InvokeRepeating方法
InvokeRepeating能夠按照一定的時間間隔反複執行某個函數,若不使用CancelInvoke方法,InvokeRepeating将持續執行,即使将方法所在的腳本關閉。
98.Frame Debugger
使用Frame Debugger(Window > Analysis > Frame Debugger)可以檢視每一幀的渲染過程。