Unity(十七):拓展编辑器 - 重绘脚本面板、添加并自定义预览面板

本文介绍如何使用Unity创建自定义编辑器,包括脚本面板的重绘和预览面板的自定义显示。通过实例展示了如何扩展和修改原有的脚本属性,并提供了一个具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重绘脚本面板

在这里插入图片描述

using UnityEditor;
using UnityEngine;

namespace Scripts_03
{
    #region 自定义脚本面板

    public class ExpandPlane : MonoBehaviour
    {
        public enum Sex
        {
            a = 1,
            b
        }

        public string str1;
        public string str2;
        public Vector3 v3;
        public int num1;
        public GameObject go;
        public bool isTrue;
        public Sex sex = Sex.b;
        [SerializeField] private Rigidbody rb;
    }
#if UNITY_EDITOR
    // 可对原有类的属性进行拓展和修改
    [CustomEditor(typeof(ExpandPlane))]
    public class ExpandPlaneDraw : Editor
    {
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI(); // 原始定义展示(系统默认绘制)

            // 获取脚本
            ExpandPlane script = (ExpandPlane)target;

            // 开始绘制
            script.v3 = EditorGUILayout.BeginScrollView(script.v3, true, true);

            GUILayout.Label("========== Vertical 开始绘制 ==========");
            EditorGUILayout.BeginVertical();
            GUILayout.Label($"str1: {script.str1}");
            GUILayout.Label($"str2: {script.str2}");
            GUILayout.Label("v3:");
            script.v3.x = EditorGUILayout.FloatField("X", script.v3.x);
            script.v3.y = EditorGUILayout.FloatField("Y", script.v3.y);
            script.v3.z = EditorGUILayout.FloatField("X", script.v3.z);
            GUILayout.Label("num1:");
            script.num1 = EditorGUILayout.IntField(script.num1);

            GUILayout.Label("========== Horizontal 开始绘制 ==========");
            EditorGUILayout.BeginHorizontal();
            GUILayout.Label("go:");
            script.go = (GameObject)EditorGUILayout.ObjectField(script.go, typeof(GameObject), false);
            GUILayout.Label("isTrue:");
            script.isTrue = EditorGUILayout.Toggle(script.isTrue);
            EditorGUILayout.EndHorizontal();
            GUILayout.Label("========== Horizontal 结束绘制 ==========");

            script.sex = (ExpandPlane.Sex)EditorGUILayout.EnumPopup("sex", script.sex);
            if (GUILayout.Button("a"))
                script.sex = ExpandPlane.Sex.a;
            if (GUILayout.Button("b"))
                script.sex = ExpandPlane.Sex.b;
            EditorGUILayout.EndVertical();
            GUILayout.Label("========== Vertical 结束绘制 ==========");

            EditorGUILayout.EndScrollView();
        }
    }
#endif

    #endregion
}

添加并自定义预览面板

在这里插入图片描述

[CustomPreview(typeof(GameObject))]
public class ObjPreview : ObjectPreview
{
    private GameObject _gameObject;

    private Editor _editor;

    // 是否添加预览窗口
    public override bool HasPreviewGUI()
    {
        return true;
    }

    public override void OnPreviewGUI(Rect r, GUIStyle background)
    {
        GUILayout.Label("Hello GameObject!!!");
        var gameObject = (GameObject)EditorGUILayout.ObjectField(_gameObject, typeof(GameObject), true);
        // 每次gameObject改变时都实例化_editor(gameObject != _gameObject ---> 比较当前GameObject与上一次的区别)
        if (gameObject != _gameObject)
        {
            _gameObject = gameObject;
            _editor = Editor.CreateEditor(_gameObject);
        }

        if (_gameObject != null)
            // 预览对象
            _editor.OnPreviewGUI(GUILayoutUtility.GetRect(300, 300), EditorStyles.whiteLabel);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Prosper Lee

您的赏赐将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值