關鍵概念
- void MonoBehaviour.OnDrawGizmosSelected() : 爲選中的,當前類型的 MonoBehaviour 繪製輔助元素。
- void MonoBehaviour.OnDrawGizmos() : 爲所有的當前類型的 MonoBehaviour 繪製輔助元素。
- Gizmos : 繪製接口
- Gizmos.color : 指定繪製顏色
- Gizmos.DrawCube : 繪製立方體
- Gizmos.DrawWireCube : 繪製線框立方體
- Gizmos.DrawIcon : 繪製圖標
- Gizmos.DrawGUITexture : 繪製 UI 貼圖
- Gizmos.DrawRay : 繪製射線
- Gizmos.DrawLine : 繪製線段
- Gizmos.DrawMesh : 繪製網格
- 派生Editor,並實現 OnSceneGUI,來繪在 Scene 中繪製對象的 UI
- 註冊 SceneView.duringSceneGui,繪製全局 UI。簽名:void OGUI(SceneView sv);
- Handles.BeginGUI/EndGUI() : 開始,結束 SceneView 中的 GUI 繪製及處理
- [SelectionBase] : 如果對象掛了該腳本,選中該對象的任意子對象,都會自動變成選中該對象。
例子
using UnityEditor;
using UnityEngine;
/// <summary>
/// CustomEditor 的控制的組件類型,如果已經被聲明過了,則只能有一個起作用,派生也不行
/// </summary>
[CustomEditor(typeof(MyBehaviourScript))]
public class MySceneView : Editor
{
[InitializeOnLoadMethod]
static void InitializeOnLoadMethod()
{
SceneView.duringSceneGui += (SceneView sv) =>
{
// 繪製UI
Handles.BeginGUI();
GUI.Label(new Rect(0, 0, 50, 15), "Title");
GUI.Button(new Rect(0, 20, 50, 50),
AssetDatabase.LoadAssetAtPath<Texture>("Assets/uniyt.png")
);
Handles.EndGUI();
// 禁止在Scene中選擇對象
Event e = Event.current;
if (e != null)
{
// FocusType.Passive 表示禁止接受控制焦點
int controlID = GUIUtility.GetControlID(FocusType.Passive);
if (e.type == EventType.Layout)
{
HandleUtility.AddDefaultControl(controlID);
}
}
};
}
void OnSceneGUI()
{
MyBehaviourScript cmpt = target as MyBehaviourScript;
Handles.color = Color.red;
Handles.Label(cmpt.transform.position, cmpt.transform.position.ToString());
Handles.BeginGUI();
GUI.backgroundColor = Color.red;
if (GUILayout.Button("click", GUILayout.Width(200)))
{
Debug.Log("clicked");
}
GUILayout.Label("Label");
Handles.EndGUI();
}
// 爲所有未被選中的對象繪製
[DrawGizmo(GizmoType.NonSelected)]
static void DrawGizmosWithoutSelected(Transform obj, GizmoType type)
{
Handles.Label(obj.position, obj.name);
//Gizmos.DrawSphere(obj.position, 1);
}
}
例子2:
using UnityEngine;
//[SelectionBase] // 在Scene中選中子節點時,自動更新爲選擇該節點
public class MyBehaviourScript : MonoBehaviour
{
#if UNITY_EDITOR
/// <summary>
/// 如果自己被選擇了,在Scene窗口中進行繪製
/// </summary>
private void OnDrawGizmosSelected()
{
Gizmos.DrawWireCube(transform.position, Vector3.one);
}
/// <summary>
/// 在 Scene 窗口中進行繪製
/// </summary>
private void OnDrawGizmos()
{
Gizmos.DrawWireSphere(transform.position, 1);
}
#endif
}