首页 > 编程语言 > 详细

UnityEditor简单介绍及案例

时间:2021-05-12 00:16:57      阅读:28      评论:0      收藏:0      [点我收藏+]

自定义Inspector窗口

自定义编辑器脚本的创建

  • 编辑器脚本需要置于Editor文件夹下方,类似资源读取的文件需要存放在Resources下方
  • 编辑器脚本的命名规则一般为:所编辑类名 + Editor,例如当我需要自定义类StateMachine的Inspector窗口时,我将在Editor目录下创建StateMachineEditor.cs
  • 添加Attribute:[CustomEditor(typeof(T))]。目的是告知编辑器类该编辑器所针对的运行时类型,此例中,需要告诉编辑器我们想要修改类StateMachine的Inspector窗口,故TStateMachine
  • 使类StateMachineEditor继承类Editor
// StateMachineEditor.cs
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(StateMachine))]
public class StateMachineEditor : Editor
{
    public override void OnEnable() {}
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
    }
}

OnEnable()函数将在每次查看对应的Inspector时被调用,故可用来初始化编辑器所需要的变量。常用的有两种类型的变量

private StateMachine selectMachine;
private SerializedProperty property1;
private SerializedProperty property2;
// ...

本例中selectMachine用于存取编辑器获得的需要编辑的类

private void OnEnable()
{
    selectMachine = target as StateMachine;
    if (selectMachine == null)
    {
        Debug.LogError("Editor Error: Can not translate selectMachine");
    }
}

target是继承的Editor类中的一个字段(get)。本身为Object类型,在拆箱后可以转换成上文Attribute:CustomEditor中的T,用来显示类中原本不会被绘制到Inspector窗口的信息,达到自定义的功能

public override void OnInspectorGUI()
{
    // 之前
    base.OnInspectorGUI();
    // 之后
}

base.OnInspectorGUI()会执行默认Inspector信息的绘制,若去除Inspector面板将空无一物。可以根据项目需求,选择将自定义代码写在”之前“或”之后“的位置,本例中将代码写在”之后“,也就是说新自定义添加的属性,将在Inspector的底部被绘制

若要完全自定义Inspector面板,通常会选择不调用基类的函数,直接重写整个面板的绘制代码

常用API

EditorGUILayout与EditorGUI

目前暂时只考虑前者,两者的区别在后续自定义Window时再介绍

EditorGUILayout用于在Inspector面板上绘制信息

EditorGUILayout.Space();

用于在面板中生成一小段间隙,功能可以类比Attribute:[Space]

EditorGUILayout.LabelField("");

用于在面板中生成一串文字

EditorGUILayout.BeginHorizontal();
// Codes...
EditorGUILayout.EndHorizontal();

在上述代码范围内开启一段水平空间,在此范围内的信息将被绘制在同一行

EditorGUILayout.BeginVertical();
// Codes...
EditorGUILayout.EndVertical();

在上述代码范围内开启一段垂直空间,在此范围内的信息将被绘制在同一列

完整效果

// StateMachineEditor.cs
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(StateMachine))]
public class StateMachineEditor : Editor
{
    public override void OnEnable()
    {
        selectMachine = target as StateMachine;
        if (selectMachine == null)
        {
            Debug.LogError("Editor Error: Can not translate selectMachine");
        }
    }
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        EditorGUILayout.Space();
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Current StateName:");
        EditorGUILayout.LabelField(selectMachine.CurrentState.StateName);
        EditorGUILayout.EndHorizontal();
    }
}

成果如下,在底部生成了一串文字标签,显示当前状态的名字(当前无状态,故为Null)

技术分享图片

自定义Window

UnityEditor简单介绍及案例

原文:https://www.cnblogs.com/tuapu/p/14757924.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!