Unity小知識點大全(二)

 

 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實例在程序運行時繪製此數據,以下代碼所示:ide

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;

[CreateAssetMenu(fileName = "New Item", menuName = "Item")]
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面板中加入一段文字,以下代碼所示:

[Header("Player Settings")]
public float speed = 1f;
public int size = 10;

執行效果:

 

 在變量前加入Tooltip,當鼠標懸停在Inspector面板中的變量上時,可顯示關於此變量的說明,以下代碼所示:

[Tooltip("移動速度")]
public float speed = 1f;

執行效果:

 

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)能夠查看每一幀的渲染過程。

 

99.Physics Debugger

使用Physics Debugger(Window > Analysis > Physics Debugger)能夠查看碰撞引發的異常,當開啓Collision Geometry選項後,場景中全部遊戲對象的碰撞體都將被繪製出來,而不用依次選擇遊戲對象進行檢查。以下圖所示,球體由於添加了不正確的Box Collider,在物理碰撞時必然不能達到預期的表現效果。

相關文章
相關標籤/搜索