拓展編輯器 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章