编辑器扩展

前言:今天咱们学习编辑器扩展,你会发现原来unity是通过编辑器扩展做的,我们也可以通过今天编辑器扩展去实现制作自己的插件了,是不是很酷的体验=-=,废话不多说,开始吧~


1.创建一个脚本Test01

编辑器扩展_第1张图片

(1)设置滑条:

<1>在要修饰的变量前一行添加[Range(最小范围,最大范围)]    //取值范围左闭右开

<2>必须是public修饰的变量

(2)序列化:[SerializeField]

<1>必须是private修饰的变量

(3)在检视面板隐藏:[HideInInspector]

(4)添加组件:[RequireComponent(typeof(组件))]

<1>写在脚本的上方

<2>挂载脚本的时候组件被添加

(5)设定游戏对象参数不同情况的选择

1如果a是公有的序列化变量。

1.1如果你想要在面板中看到a,那么用:

public int a;1.2如果你不想在面板中看到a,那么用:

[HideInInspector]

public int a; // 这样a可以在程序中被代码赋值,但不会在面板中看到并手动设置赋值。

2 如果a是私有的序列化变量,你想在面板中读取并保存,那么用:

[SerializeField]

private int a;

3.如果a是私有的序列化变量,你想在面板中读取,但是不保存,那么用:

[HideInInspector]

[SerializedField]

private int a;

public int b { get{ return a; } }

然后在Editor中显示,EditorGUILayout.LabelField("value",game.B.ToString());

4如果a是私有序列化变量,你不想在面板中做任何操作(不想看到,也不想写),但是想要在程序中给它赋值,那么用。

[HideInInspector]

[SerializedField]

private int a;

public int b{ get { return a; } set { a = value; } }

由此可见,常态化都是用public 来注入一个对象,除非特殊需求用 [SerializedField],参考第2条。

参考文章:http://tieba.baidu.com/p/2815933897

2.创建一个脚本Test02

编辑器扩展_第2张图片

(1)添加菜单

<1>脚本取消继承MonoBehaviour类

<2>引用UnityEditor命名空间

<3>[MenuItem(菜单路径)]

1)菜单路径可以是自定义的

2)菜单路径必须有子菜单,如果没有子菜单会报错

3)菜单路径可以在系统的菜单路径下

编辑器扩展_第3张图片

<4>在[MenuItem(菜单路径)]的下一行必须有个静态的方法

1)当你点击了菜单路径下的菜单就会执行这个静态的方法,打印“点击”

2)注意:继承了MonoBehaviour才能用print打印;

                   没继承则使用Debug.Log打印

(2)添加窗口

<1>创建一个Rect数据(矩形数据)

<2>让脚本继承EditorWindow静态类(创建编辑窗口的类)

<3>EidtorWindow静态类

1)创建一个编辑窗口:类名.GetWindowWithRect(窗口类型,窗口位置,是否悬浮,窗口标题);

2)显示窗口:对象.Show();

3.创建脚本Test03,Test04

编辑器扩展_第4张图片
编辑器扩展_第5张图片

(1)往检视窗口中添加编辑器

<1>取消继承MonoBehaviour类

<2>引用UnityEditor命名空间

<3>继承Editor类(自定义编辑器类)

<4>自定义编辑器:[CustomEditor(typeof(组件名))]

1)CustomEditor属性告知Unity哪个组件需要表现为编辑器

<5>在编辑器下运行:[ExecuteInEditorMode]

<6>using UnityEditor:

1)Editor类

1.1)检视窗口:OnInspectorGUI()

1.1.1)表现出自定义编辑器默认设置:base.OnInspectorGUI();

默认的Test04脚本

1.2)被编辑的目标对象: 编辑的对象=traget;

1.2.1)转换类型:

方法一:类型 对象=target as 类型;

方法二:类型 对象=(类型)target;

2)EditorGUILayout类

2.1)自动排列编辑器界面类

2.2)绘制物体字段:绘制对象=类名.ObjectField(标题,绘制对象,typeof(绘制对象的类型),是否允许指定指定场景物体) as 绘制对象的类型;

2.3)绘制矩形字段:绘制的矩形对象=类名.RectField(标题,绘制的矩形对象);

编辑器扩展_第6张图片
绘制之后的Test04脚本

4.创建脚本Test05

编辑器扩展_第7张图片
编辑器扩展_第8张图片

(1)准备工作:

<1>新建一个Editor文件夹,将Test05脚本放在此文件夹下

<2>取消继承MonoBehaviour类

<3>引用UnityEditor命名空间

<4>继承Editor类

<5>自定义编辑器[CustomEditor(typeof(Test04))]

(2)using UnityEditor;

类:CustomEditor、Editor、Handles

<1>Editor类:

1)被编辑的目标:类型 编辑对象=target as 类型

2)场景窗口:OnSceneGUI()

<2>CustomEditor类:

1)自定义编辑器:[CustomEditor(typeof(组件))]

1.1)写在脚本前一行

<3>Handles类

1)开始绘制:类名.BeginGUI();

2)结束绘制:类名.EndGUI();

以上是一组绘制

(3)using UnityEngine;

类:GUILayout

<1>GUILayout类

1)开始绘制指定的区域:类名.BeginArea(Rect类型数据);

2)结束绘制指定的区域:类名.EndArea();

以上是一组绘制

3)绘制文本框:类名.Label(标题);

4)绘制按钮:类名.Button(标题);


最后:以上就是今天全部内容,如有疑问,欢迎咨询,谢谢大家~

你可能感兴趣的:(编辑器扩展)