关键概念
- 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
}