unity editor 编辑器插件制作基础:五、物体在Scene窗口中编辑状态下的辅助显示,以及控制功能扩展OnDrawGizmos GizmoType

一 说明

该功能只能在编辑状态下运行,并只能在scene窗口中显示。
脚本必须继承MonoBehaviour ,并且引入UnityEngine和UnityEditor库
可以选择相关方法,在鼠标选择父物体或子物体的范围内执行,也可以设置被选择,或不被选择才执行,可以用于显示标签、辅助线等用途

大量可直接调用的scene组件都可在这里找到 https://docs.unity3d.com/ScriptReference/Handles.html

1.1 引用库

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

1.2 脚本结构

需要在指定周期或是指定标签注明的方法中绘制才会在scene状态下显示

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; // 需引用该库
public class MapCreator : MonoBehaviour // 普通脚本,并非edtor
{
    
    
		// 普通方法运行 可以直接使用类属性
		//编辑器状态下每帧调用
        void OnDrawGizmos() {
    
    }
		// 编辑器状态下 物体被选中的时每帧调用
        void OnDrawGizmosSelected() {
    
    }

		//静态方法 需要使用静态类属性
		// 当物体active状态为可见时每帧调用
        [DrawGizmo(GizmoType.Active)]
        static void f1(Transform transform, GizmoType gizmoType) {
    
    
        }
        // 当物体或其子物体被选中时每帧调用
        [DrawGizmo(GizmoType.InSelectionHierarchy)]
        static void f2(Transform transform, GizmoType gizmoType) {
    
    
        }
        // 当前物体没被选中时每帧调用
        [DrawGizmo(GizmoType.NonSelected)]
        static void f3(Transform transform, GizmoType gizmoType) {
    
    
        }
        // 当物体或其子物体都没被选中时每帧调用
        [DrawGizmo(GizmoType.NotInSelectionHierarchy)]
        static void f4(Transform transform, GizmoType gizmoType) {
    
    
        }
        //允许gizmo在编辑器中被选中
        [DrawGizmo(GizmoType.Pickable)]
        static void f5(Transform transform, GizmoType gizmoType) {
    
    
        }
        // 当前物体被选中时每帧调用
        [DrawGizmo(GizmoType.Selected)]
        static void f6(Transform transform, GizmoType gizmoType) {
    
    
        }
}

二 实现

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; // 需引用该库
public class MapCreator : MonoBehaviour // 普通脚本,并非edtor
{
    
    
	  public MapBlockType currentMapBlockType = MapBlockType.Ground;

      //绘制图形
      void OnDrawGizmos() {
    
    
            //绘制cube边框
            Gizmos.color = Color.black;
            //当前物体必须有Renderer组件 用于绘制
            Gizmos.DrawWireCube(GetComponent<Renderer>().bounds.center, GetComponent<Renderer>().bounds.size);
            //在物体上方绘制一条直线
            Gizmos.color = Color.green;
            Gizmos.DrawLine(transform.position, transform.position + transform.up * 3);
       }
        
       // 绘制图形
       void OnDrawGizmosSelected() {
    
    
            Gizmos.color = Color.red;
            Gizmos.DrawWireCube(GetComponent<Renderer>().bounds.center, GetComponent<Renderer>().bounds.size);
        }
        // 绘制标签
        [DrawGizmo(GizmoType.NonSelected)]
        static void DrawGameObjectName(Transform transform, GizmoType gizmoType) {
    
    
            Handles.Label(transform.position, transform.gameObject.name);
        }
        // 绘制标签
        [DrawGizmo(GizmoType.Selected | GizmoType.Active)]
        static void DrawGameObjectName1(Transform transform, GizmoType gizmoType) {
    
    
            Handles.Label(transform.position, transform.gameObject.name);
        }
}

猜你喜欢

转载自blog.csdn.net/lengyoumo/article/details/113578265
今日推荐