(转)Unity笔记之编辑器(UnityEditor)

在使用unity3d的过程中,时常会需要从场景中寻找或者调用一个对象,而Unity就提供了一个贴心的功能——拖拽。用鼠标拖一下中比写堆代码直观的多吧!但是Unity提供的远远不止这一丢丢,下面我们来简单了解下UnityEditor部分的内容。

编辑器最最基本的用法呢就是编辑Inspector。

而Inspector中最最基本的就是把字段显示出来。给几个例子:

[code]csharpcode:

using UnityEngine;
using System.Collections; // 这里没有添加其他引用

public class Editor0 : MonoBehaviour
{
    // 很简单的,仅仅是用public关键字来修饰而已,然后把脚本放到某个物体上
    public int IntValue;
    public float FloatValue;
    public GameObject GameObjectValue;
    public GameObject[] GameObjectValueList;
    public Vector3 Vector3Value;
    public enum EnumValue
    {
        Value0 = 0,
        Value1 = 1,
        Value2 = 2
    };
    // ......
}

                          然后就出现了这些东西,各种类型自己去对应。

这是最最基础的编辑器应用,接下去我们使用其他的方法。看下代码:

[code]csharpcode:

using UnityEngine;
using System.Collections; // 这里没有添加其他引用

public class Editor1 : MonoBehaviour
{
    [SerializeField] // 这是强制序列化,就是它让私有变量也显示在了Inspector中
    private int IntValue; // 下面的字段都是私有的
    [SerializeField]
    private float FloatValue;
    [SerializeField]
    private GameObject GameObjectValue;
    [SerializeField]
    private GameObject[] GameObjectValueList;
    [SerializeField]
    private Vector3 Vector3Value;
    private enum EnumValue
    {
        Value0 = 0,
        Value1 = 1,
        Value2 = 2
    };
    [SerializeField]
    private EnumValue Ev = EnumValue.Value0;
    // ......
}

 这里我们发现,即便是私有的字段,也被显示出来了,就是因为[SerializeField]的存在。像[SerializeField]这样的还有[NonSerialized]、[HideInInspector]、[AddComponentMenu("XXX/XX/XXX")] 等等,今天讲的不是这个话题,就不多做解释了。下面我们更深入了解一下。

1. 写一个自定义的编辑器窗口

[code]csharpcode:

using UnityEngine;
using System.Collections;
using UnityEditor; // 编辑器命名空间的引用

public class Editor2 : EditorWindow // 编辑器类
{
    [MenuItem("EditorDemo/CreateWindow")] // 在编辑器中添加一个菜单
    static void CreateWindow() // 下面这个函数必须是***静态的***
    {
        // 在这里面创建窗口
    }
}

上面是创建一个自定义窗口的基本框架,这里要注意的是MenuItem中的菜单名,可以在现有的菜单中添加,也可以新建一个菜单,但必须至少有一个子菜单。继续添加内容:

[code]csharpcode:

using UnityEngine;
using System.Collections;
using UnityEditor; // 编辑器命名空间的引用

public class Editor2 : EditorWindow // 编辑器类
{
    [MenuItem("EditorDemo/CreateWindow")] // 在编辑器中添加一个菜单
    static void CreateWindow() // 下面这个函数必须是***静态的***
    {
        // 在这里面创建窗口
        EditorWindow.GetWindow(typeof(Editor2), false, "EditorWindow", true);
    }
}

我们添加了一句EditorWindow.GetWindow()来创建一个窗口,其中的参数(1)t:窗口类型;(2)utility:标准窗口(true)/内嵌窗口(false);(3)title:窗口的名称;(4)focus:焦点。标准窗口和内嵌窗口的区别我的理解是是否嵌入Unity的窗口中。

这样的话,点击EditorDemo那个菜单里的CreateWindow,就会出现一个空白窗口了。之后就应该要往窗口中添加内容。在编辑器类中也包括像MonoBehavior类里Start,Awake,Update之类的函数,其中OnGUI就用来绘制编辑器内容,看一段代码:

[code]csharpcode:

using UnityEngine;
using System.Collections;
using UnityEditor; // 编辑器命名空间的引用

public class Editor2 : EditorWindow // 编辑器类
{
    bool toggle;
    Color color;
    AnimationCurve animationCurve = new AnimationCurve();
   float floatValue = 0f;
    bool foldOut;
    enum EnumList
    {
        enum0 = 0,
        enum1 = 1,
        enum2 = 2
    };
    EnumList enumValue = EnumList.enum0;

    [MenuItem("EditorDemo/CreateWindow")] // 在编辑器中添加一个菜单
    static void CreateWindow() // 下面这个函数必须是***静态的***
    {
        // 在这里面创建窗口
        EditorWindow.GetWindow(typeof(Editor2), false, "EditorWindow", true);
    }

    void OnGUI()
    {
        toggle = EditorGUILayout.Toggle("Toggle", toggle);
        EditorGUILayout.LabelField("This is a labelField");
        color = EditorGUILayout.ColorField("Color", color);
        animationCurve = EditorGUILayout.CurveField("AnimationCurve", animationCurve);
        floatValue = EditorGUILayout.FloatField("FloatField", floatValue);
        foldOut = EditorGUILayout.Foldout(foldOut, "FoldOut");
        enumValue = (EnumList)EditorGUILayout.EnumPopup("EnumPopup", enumValue);
        // ...... 功能还有很多,在之后的文章中,小贱会分多次讲解每个的具体用法,现在了解就可以了
    }
}

Unity中自带的编辑器功能真的有很多,滑块,字符串输入,密码框,下拉框等等,制作简单的插件用于工程项目中已经是绰绰有余了。当然了,今天因为时间有限,Unity编辑器方面的内容也是大有讲究,所以我们只是做了简单的了解。之后的文章中,我会单个功能详细的去讲解。

时间: 2024-11-08 22:10:16

(转)Unity笔记之编辑器(UnityEditor)的相关文章

(转)Unity笔记之编辑器(CurveField、DoubleField、EnumMaskField、EnumPopup) ... ...

1. CurveField创建的是一个类型为AnimationCurve的曲线变量,看代码: [code]csharpcode: using UnityEngine; using System.Collections; using UnityEditor; // 编辑器命名空间的引用 public class Editor2 : EditorWindow // 编辑器类 { private AnimationCurve _animationCurve = new AnimationCurve()

(转)Unity笔记之编辑器(BeginToggleGroup、BoundsField、ColorField) ...

1. BeginToggleGroup() BeginToggleGroup函数是定义了一个控制范围,可以控制该范围中的GUI是否启用,看下演示代码: [code]csharpcode: using UnityEngine; using System.Collections; using UnityEditor; // 编辑器命名空间的引用 public class Editor2 : EditorWindow // 编辑器类 { bool _toggle; Color _color; stri

(转)Unity笔记之编辑器(BeginFadeGroup、BeginHorizontal、BeginScrollView) ... ...

1. BeginFadeGroup(float value) 这是EditorGUILayout中的一个函数,用来隐藏/显示在它包含的组中的内容.value则是显示内容的量,范围是0-1 . 比较下未使用/使用BeginFadeGroup的窗口: [code]csharpcode: using UnityEngine; using System.Collections; using UnityEditor; // 编辑器命名空间的引用 public class Editor2 : EditorW

[cb]Unity Editor Toolbar 编辑器扩展

1.Apply to Prefab [把改动应用到Prefab] if (GUILayout.Button("Apply Collider To Prefab")) { PrefabUtility.ReplacePrefab(simActor.Preview, PrefabUtility.GetPrefabParent(simActor.Preview), ReplacePrefabOptions.ConnectToPrefab); }     2.Current SceneView

[Unity 笔记] Unity3D中水面的优化思路

(Unity 学习笔记) Unity自带的Water系统,分两种Simple和Pro Water Simple 的反射是依靠反射贴图Cubemap,通过水面的入射和反射和法线等信息,计算得到反射贴图的某一点的color. 而Water Pro的反射 是 依靠 实时生成反射贴图,来得到反射效果. Water Simple的运行损耗小,但是效果差. Water Pro的效果好,但是运行损耗很大. 思考了如何优化水面效果. 1.可以中和两种方式,采用多个预设的cubemap(不同位置得到.可通过cam

Linux学习笔记——Vim编辑器(三)

++++++++++++++++++++++++++++++文件编辑器Vim+++++++++++++++++++++++++++++++ 文件编辑器Vim: 插入命令: 定位命令: 删除命令: 复制和剪切命令: 搜索和搜索替换命令: 保存和退出命令: 导入命令执行结果:r !命令 定义快捷方式 map ^p I#<ESC> 替换命令:ab mymail [email protected] Vim配置文件:/home/username/.vimrc     /root/.vimrc +++++

【Unity笔记】常用插件

记录一些常见插件,随时补充. A星寻路 Dijstra迪杰斯特拉 iTween动画插件 原理:插值法,给出初始值和终点值,自动算出中间值. DoTween Tween动画 Playmaker $45 Playmaker由第三方软件商Hutong Games开发完成.它的Logo是一个中文的"玩"字,独特.有创意. 既是一个可视化脚本工具,又是一个分层逻辑框架.设计师.程序员使用Playmaker能够很快地完成游戏原型制作,既适合独立开发者,又适用于团队协作.Playmaker能够大大提

linux 笔记--vim编辑器,组合条件,文件查找,SUID特殊权限

vim:全屏编辑器,模式化编辑器 vim模式:编辑模式(命令模式)   输入模式   末行模式 模式转换: 编辑--输入:i 在当前光标所在字符的前面转为输入模式.  a 在当前光标所在字符的后面转为输入模式.  o 在当前光标所在行的下方,新建一行并转为输入模式.  I 在当前光标所在行的行首转为输入模式.  A 在当前光标所在行的行尾转为输入模式.  O 在当前光标所在行的上方,新建一行并转为输入模式. 输入--编辑:ESC 编辑--末行:(只能从编辑模式转换到末行模式) :冒号 末行--编

【Unity笔记】Terrain地形制作坍塌/深坑

Unity的Terrain组件在[set the terrain height]分页下,height高度为0时,可理解为该地形的海平面高度,此时就不能地形下榻.把height调到100,点击[flatten],然后就能做地形下榻,深坑的深度最多即可达到100. 学习资料: http://www.maiziedu.com/course/540-7397/