拓展编辑器 5 - SceneView

关键概念

  • 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
}

发布了49 篇原创文章 · 获赞 2 · 访问量 2610
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章