天天看點

【Unity3D】Unity3D基礎小技巧

一、前言

掌握一些Unity編輯器的小技巧,會讓你開發以及使用更加快捷有效。這篇文章就分享一些Unity在使用使用的一些小技巧,有什麼不對的記得留言哦。

二、原文位址

原文出處:蠻牛

原文作者:蠻牛教育講師 邵偉老師

原文連結:http://www.manew.com/thread-143268-1-1.html

三、正文

1.高亮選擇

在Scene面闆右上角的Gizmo下拉清單中,可以通過設定Selection Outline選項決定是否在選中物體時顯示邊緣高亮的辨別。

【Unity3D】Unity3D基礎小技巧

2.Pixel Perfect Camera

在錄影機上挂載Pixel Perfect Camera元件能夠使2D像素風格的遊戲畫面更加整潔清晰。此元件需要使用Package Manager安裝2D Pixel Perfect包。

【Unity3D】Unity3D基礎小技巧

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)時,則相反。

【Unity3D】Unity3D基礎小技巧
【Unity3D】Unity3D基礎小技巧

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,進而能夠儲存在運作時對該元件做出的改變。

【Unity3D】Unity3D基礎小技巧

8. 擷取一個随機布爾值

我們知道Random.value能夠傳回0~1之間的随機數,是以讓此随機數與0.5f進行比較,就能夠擷取一個随機的布爾值True或者False,如下代碼所示:

bool trueOrFalse = (Random.value > 0.5f);
      

9. 使用Struct代替Class

如果資料結構僅儲存了有限的幾個數值變量,可以考慮使用struct代替Class,因為Class執行個體由垃圾回收機制來保證記憶體的回收處理;而struct變量使用完後立即自動解除記憶體配置設定。

【Unity3D】Unity3D基礎小技巧

10. Visual Studio 自動語句補全
【Unity3D】Unity3D基礎小技巧

當使用Visual Studio進行代碼編寫時,可輕按兩下Tab鍵來輔助完成像if、for、switch等語句的補全。

11.協程嵌套

在一個協程裡開啟另外一個協程,可使用以下方法:

void Start()
{
    StartCoroutine(FirstCo());
}
IEnumerator FirstCo()
{
    yield return StartCoroutine(SecondCo());
}
IEnumerator SecondCo()
{
    yield return 0;
}
      

12.腳本變量參與動畫制作

使用工具還可以改變腳本的變量。

【Unity3D】Unity3D基礎小技巧

13/14. Animation視窗快捷鍵

在Animation視窗中,按下Ctrl+A,所有關鍵幀将集中顯示在視窗中;選擇某些關鍵幀,按下F鍵,可将它們居中顯示在視窗中;按下C鍵,可以在曲線視圖和關鍵幀視圖間切換;按下K鍵添加關鍵幀。

15.反向播放動畫

在Animator視窗中,設定動畫的Speed屬性為-1可使卡通片段反向播放。

【Unity3D】Unity3D基礎小技巧

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"指令建立。

【Unity3D】Unity3D基礎小技巧

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面闆中,輕按兩下快捷方式可快速打開此目錄。

【Unity3D】Unity3D基礎小技巧

22/23.F與Shift+F

選擇遊戲對象,按下F鍵,可将Scene的視口中央移動到該遊戲對象處;按下Shift+F,可将視口與該遊戲對象鎖定,即無論如何移動遊戲對象,視口中央始終跟随此遊戲對象。

24.對齊Scene與Game視圖

在Hierarchy面闆中選擇錄影機,按下Ctrl+Shift+F,可将錄影機移動到能夠呈現Scene視窗中内容的位置。

【Unity3D】Unity3D基礎小技巧

25. CompareTag方法

當對遊戲對象的Tag進行比對時,從性能考慮,可使用CompareTag方法,不建議使用雙等号進行判斷。

if (gameObject.CompareTag("Enemy"))
{
}
      
if (gameObject.tag == "Enemy")
{
}
      

26.使用空遊戲對象作為分隔符

在Hierarchy面闆中,可以使用名稱中帶有分隔符的空遊戲對象進行組織管理。

【Unity3D】Unity3D基礎小技巧

27. 查找含有某元件的遊戲對象

如果需要查找挂載了某個元件的遊戲對象,直接在Hierarchy面闆的搜尋框中輸入元件名稱即可,需要注意元件名稱中的空格,比如搜尋”MeshCollider“而不是”Mesh Collider“。

【Unity3D】Unity3D基礎小技巧

28. 查找某種類型的資源

在Project面闆中的搜尋框中輸入"t:"+資源類型,可以過濾顯示某種類型的資源,比如輸入"t:scene",會過濾出所有場景檔案,輸入"t:texture",則會顯示所有貼圖。

【Unity3D】Unity3D基礎小技巧

29. 移動代碼行

在Visual Studio中,使用快捷鍵Alt+上下鍵,可以在代碼塊中快速上移/下移光标所在的代碼行,不用複制粘貼。

30.快速檢視元件文檔

點選元件右上角的文檔按鈕,可快速打開關于目前元件的文檔。建議下載下傳離線文檔,以便更加快速打開文檔,如果沒有下載下傳,Unity将打開線上文檔。

【Unity3D】Unity3D基礎小技巧

31.文檔版本曆史

在Unity文檔中點選Documentation Version連結,可檢視不同版本的文檔。

【Unity3D】Unity3D基礎小技巧

32. 展開/折疊所有節點

在Hierarchy面闆中,按下Alt鍵,滑鼠左鍵點選樹形節點,可展開/折疊目前節點下的所有子節點。

【Unity3D】Unity3D基礎小技巧

33.儲存編輯器視窗布局

Unity視窗布局可自定義,調整完畢以後,如果希望以後繼續沿用此布局,點選編輯器右上角的Layout下拉清單,選擇指令Save Layout,可将目前視窗布局進行儲存。

34+35. 改變編輯器顔色

選擇指令Editor > Preferences指令,可自定義編輯器目前主題的顔色。

【Unity3D】Unity3D基礎小技巧

修改Playmode tint的顔色值,可以改變編輯器在運作模式時的顔色,以提醒開發者此時為運作模式。

36.開關場景特效

在Scene面闆頂部的圖檔下拉清單中,可選擇開關某種類型的特效。

【Unity3D】Unity3D基礎小技巧

37.MenuItem屬性

要在編輯器的菜單欄中選擇執行編寫的函數,可在函數前添加MenuItem屬性,如下代碼所示:

[MenuItem("MyMenu/Do Something")]
static void DoSomething()
{
}
      
【Unity3D】Unity3D基礎小技巧

38.ContextMenu

使用ContextMenu屬性标記函數,能夠在腳本所在的上下文菜單中調用,如下代碼所示:

[ContextMenu("Do Something")]
void DoSomething()
{     
}
      
【Unity3D】Unity3D基礎小技巧

39+40. 隐藏和鎖定層

在編輯器右上角的Layers下拉清單中,點選對應層右側的眼睛按鈕,可以隐藏或顯示某個層上的對象;點選鎖按鈕,可對某個層進行鎖定或解鎖,當被鎖定後,該層上的所有對象将不能被選擇。

【Unity3D】Unity3D基礎小技巧

41.層子菜單

當建立層時,使用斜杠符進行路徑式命名可以為層添加子菜單,可以更好地組織項目。

【Unity3D】Unity3D基礎小技巧
【Unity3D】Unity3D基礎小技巧

42. 使用Scripting Define Symbols定義腳本

在不同的目标平台下添加 Scripting Define Symbols(Project Settings > Player > Scripting Define Symbols),以分号分隔,可以将這些符号像使用Unity内置标簽一樣用作#if指令的條件。

43+44.顔色

在使用Color控件的滴管工具進行顔色選擇時,可以拾取Unity編輯器之外的顔色。

【Unity3D】Unity3D基礎小技巧

在顔色屬性之間也可以使用右鍵指令進行複制粘貼。

【Unity3D】Unity3D基礎小技巧

45.最大化視窗

使用快捷鍵Shift+空格鍵,可以快速最大化滑鼠所在的視窗,而不用選擇視窗右上角的Maximize指令

46. 序列化Struct和Class

在資料類型Struct和Class聲明前使用[System.Serializable],可以将其顯示在Inspector面闆中進行指派。

47.碰撞矩陣

在 Edit > Project Settings… > Physics 中,通過設定Layer Collision Matrix 可以決定能夠互相碰撞的層。

【Unity3D】Unity3D基礎小技巧

48.Collider互相作用矩陣

當兩個對象發生碰撞時,會發送不同的碰撞事件,如OnTriggerEnter、OnCollisionEnter等等,這取決于具體的碰撞體設定,下表列出了不同類型的碰撞體發生碰撞時所能發出的事件類型。詳情可參考Unity 官方文檔:https://docs.unity3d.com/Manual/CollidersOverview.html

【Unity3D】Unity3D基礎小技巧

49. 數值輸入

在Inspector面闆中涉及到數值輸入的字段,不僅可以直接輸入資料,還可以在輸入框中輸入數學表達式,按下回車後Unity會将計算結果填充到輸入框中。

【Unity3D】Unity3D基礎小技巧

50.鎖定Inspector

點選Inspector右上角的鎖定按鈕,或在上下文菜單中選擇Lock指令,可以将目前選中遊戲對象的Inspector面闆鎖定。然後選擇Add Tab > Inspector指令,添加一個Inspector,這樣能夠友善在兩個遊戲對象之間互相拷貝元件資料。

【Unity3D】Unity3D基礎小技巧

51.Inspector調試模式

在Inspector面闆右上角的下拉菜單中,選擇Debug指令,啟動調試模式,此時将顯示元件包含的所有變量,包括私有變量,當運作編輯器時,可以實時檢視各元件所有變量的變化。

52.高亮顯示Debug.Log對應的遊戲對象

當使用Debug.Log方法輸出資訊時,可将gameObject作為此方法的第二個參數,當程式運作時,點選Console面闆中對應的輸出資訊,可在Hierarchy面闆中高亮顯示挂載了此腳本的遊戲對象。

void Start()
{
    Debug.Log("this is a message",gameObject);
}
      
【Unity3D】Unity3D基礎小技巧

53.風格化Debug.Log的輸出資訊

當Debug.Log方法的輸出消息是字元串時,可以使用富文本标記來強調内容。如下代碼所示:

Debug.Log("<color=red>Fatal error:</color> AssetBundle not found");
      

輸出效果:

【Unity3D】Unity3D基礎小技巧

54.繪制調試資料

當變量随着時間的推進而改變時,可使用AnimationCurve執行個體在程式運作時繪制此資料,如下代碼所示:

public AnimationCurve plot = new AnimationCurve();
void Update()
{
    float value = Mathf.Sin(Time.time);
    plot.AddKey(Time.realtimeSinceStartup, value);
}
      

傳回Unity編輯器,運作程式,點選plot屬性,此時會随着時間動态繪制資料的變化情況,如下圖所示:

【Unity3D】Unity3D基礎小技巧

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)。

【Unity3D】Unity3D基礎小技巧

58+59.為遊戲對象指定/自定義圖示

點選遊戲對象Inspector面闆左上角的下拉菜單,可為遊戲對象指定一個特定顔色的辨別,這對空遊戲對象的可視化也比較有用。點選Other…按鈕,可以用自己的圖檔來進行辨別。

【Unity3D】Unity3D基礎小技巧

60/61.顯示/隐藏Gizmo

點選Scene面闆右上角的Gizmo下拉清單,可以選擇顯示或隐藏某類元件的圖示和Gizmo辨別;也可點選Game面闆右上角的Gizmo按鈕,顯示或隐藏所有資源的圖示和Gizmo。

【Unity3D】Unity3D基礎小技巧

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;
}
      
【Unity3D】Unity3D基礎小技巧

64.編輯器播放時修改腳本後的處理

選擇 Edit > Preferences > General 指令,在Script Changes While Playing中,可以設定編輯器在播放狀态下如果腳本發生改變後的處理,比如停止播放重新編譯等。

【Unity3D】Unity3D基礎小技巧

65.自定義視窗

将類繼承自EditorWindow,可以添加自定義視窗,在此基礎上編寫一些指令和工具,如下代碼所示:

using UnityEngine;
using UnityEditor;
 
public class ExampleWindow : EditorWindow
{
    [MenuItem("Window/Example")]
    public static void ShowWindow()
    {
        GetWindow<ExampleWindow>("Example");
    }
}
      

執行效果:

【Unity3D】Unity3D基礎小技巧
【Unity3D】Unity3D基礎小技巧

66.自定義Inspector

也可對Inspector進行自定義,添加一些控件。如下代碼所示:

using UnityEngine;
using UnityEditor;
 
[CustomEditor(typeof(Sphere))]
public class SphereEditor : Editor
{
    public override void OnInspectorGUI()
    {
        GUILayout.Label("自定義Inspector");
        GUILayout.Button("确定");
    }
}
      
【Unity3D】Unity3D基礎小技巧

67.工具快捷鍵

使用快捷鍵Q、W、E、R、T、Y切換移動、旋轉、縮放等工具。

68.使用RectTransform工具縮放3D物體

RectTransform工具一般用于縮放2D物體,對3D物體使用該工具可以在某個二維平面對其進行縮放,這取決于物體與視口的關系。

【Unity3D】Unity3D基礎小技巧

69+70+71.吸附

按下Ctrl鍵對遊戲對象進行移動、旋轉、縮放,将以步進的形式進行操作,選擇Editor > Snap Settings…指令,可設定步進大小。

【Unity3D】Unity3D基礎小技巧

按下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;
      
【Unity3D】Unity3D基礎小技巧

兩個變量聲明之間加入[Space]可在Inspector中添加一個空行;添加Header可在Inspector面闆中加入一段文字,如下代碼所示:

public float speed = 1f;
public int size = 10;
      
【Unity3D】Unity3D基礎小技巧

在變量前加入Tooltip,當滑鼠懸停在Inspector面闆中的變量上時,可顯示關于此變量的說明,如下代碼所示:

[Tooltip("移動速度")]
public float speed = 1f;
      
【Unity3D】Unity3D基礎小技巧

81.在Unit編輯器中通路Asset Store

Asset Store可在Unity編輯器和網頁浏覽器中通路。(此條有充數嫌疑)

82.合并場景

在Project面闆中,将一個場景檔案拖到另外一個上,可将場景進行合并。

83/84.建立遊戲對象/數組元素副本快捷鍵

選擇一個遊戲對象,使用快捷鍵Ctrl+D可快速建立該遊戲對象的副本,同樣的方法可建立數組元素的副本。

85.元件預設

當完成某個元件的屬性設定後,可點選元件右上角的預設按鈕,将目前屬性設定儲存為預設,友善後續進行元件設定時使用。

【Unity3D】Unity3D基礎小技巧

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+對應的序号,即可恢複某個選擇狀态。此方法對跨節點選擇多個對象的情況非常适用,這樣将不必依次展開節點重新進行查找選擇。

【Unity3D】Unity3D基礎小技巧

89.#region 和 #endregion

使用#region 和 #endregion可以将兩者之間包含的代碼折疊,友善閱讀。

【Unity3D】Unity3D基礎小技巧

90.通過腳本暫定編輯器播放

使用EditorApplication.isPaused可通過代碼在編輯器播放時将其暫停,如下代碼所示:

void Update()
{
    if (Time.time >= 10f)
    {
        EditorApplication.isPaused = true;
    }
}
      

需要引用命名空間UnityEditor。

91.逐幀檢視程式運作

點選暫停按鈕右側的步進(Step)按鈕,可以在程式運作時逐幀檢視程式運作狀态。

【Unity3D】Unity3D基礎小技巧

92/93/94.檢視遊戲性能統計

點選Game視窗右上角的Stats按鈕可以檢視遊戲性能統計資料,如幀率、批處理等名額。

【Unity3D】Unity3D基礎小技巧

檢視更加詳細的分析資料,可使用Window > Analysis > Profiler工具;使用Profiler.BeginSample和Profiler.EndSample方法可在Profiler中檢視函數的資源使用情況,如下代碼所示:

Profiler.BeginSample("expensive");
CalculateSomething();
Profiler.EndSample();

      

需要引入UnityEngine.Profiling命名空間。

【Unity3D】Unity3D基礎小技巧

95.彈出預覽視窗

通常情況下,項目資源在Inspector面闆底部均有一個預覽視窗。滑鼠右鍵點選預覽視窗頂部,可将該視窗彈出,作為獨立視窗,放置在編輯器的任意位置。

【Unity3D】Unity3D基礎小技巧

96.測試遊戲時靜音

點選Game視窗右上角的Mute Audio按鈕,可在編輯器播放時将所有聲音關閉。

【Unity3D】Unity3D基礎小技巧

97.InvokeRepeating方法

InvokeRepeating能夠按照一定的時間間隔反複執行某個函數,若不使用CancelInvoke方法,InvokeRepeating将持續執行,即使将方法所在的腳本關閉。

98.Frame Debugger

使用Frame Debugger(Window > Analysis > Frame Debugger)可以檢視每一幀的渲染過程。

99.Physics Debugger

100.不要做MMORPG遊戲!