XLT的unity3D学习笔记(三)

来源:互联网 发布:知微科技 上市了吗 编辑:程序博客网 时间:2024/05/18 03:52
**写在前面**:最近在开发一款unity的插件,主要用途是更方便的使用Animator Controller,更快捷的编写stateMachine之间的transition。特地好好学习了一下EditorWindow这个类以及各种窗口的控件的使用,故在此对开发过程中学习到的东西做一个总结。

1.从EditorWindow开始。

关于EditorWindow类的定义就不在此赘述,有兴趣的童鞋可以自行翻阅unity的官方文档,我们所需要知道的就是这个类它可以帮助我们绘制一个窗口,用来作为我们开发插件等功能的基础。一个最简单的EditorWindow实现如下:
using UnityEngine;using UnityEditor;using System.Collections;public class TestWindow : EditorWindow {    static TestWindow window;    [MenuItem("Window/TestWindow")]    static void Init()    {        window = (TestWindow)GetWindow(typeof(TestWindow), false, "TestWindow", false);    }   }
从代码上可以看出,我先是定义了一个窗口名叫window,然后写了init()函数用来初始化,在init()之前还加了关键字**[MenuItem("Window/TestWindow")]**用来标记我们所建的窗口在工具栏的位置。保存一下,果不其然,我们在window一栏下面找到了我们的窗口选项,点击一下会发现弹出来一个默认的空窗口。而这个窗口,将是我们以后所有工作的基础。效果图如下:

工具栏上显示位置 打开后效果

2.用Rect划分一下模块吧

**
当我们创建好窗口后,需要给我们的窗口进行一下规划,分配一下窗口的空间给各个模块。这时候就可以使用我们的rect接口来创建一个矩形区域,并在这个区域内做你想做的事情。
首先我们先尝试在窗口的左边创建一个小的模块,代码如下:

void OnGUI()    {        BeginWindows ();        Rect windowRect1 = new Rect(5, 5, window.position.width / 6, window.position.height - 10);        windowRect1 = GUI.Window(0, windowRect1, DoRect1, "Rect1");        EndWindows ();    }    void DoRect1(int unusedWindowID)    {    }

可以看到在OnGUI函数里,我首先创建了一个Rect,其左上角的顶点为(5,5),长为大窗口的height-10,宽为大窗口的length/6。(需要解释一下的是,在GUI里我们使用坐标系是以屏幕左上角顶点为原点,屏幕上水平向右为x轴正方向,垂直向下为y轴正方向)那么,我们怎么把这个Rect附着在GUI界面里呢?这时候就可以使用一个名为GUI.Window()的接口来实现。
从代码GUI.Window(0, windowRect1, DoRect1, “Rect1”)中可以看出,这个接口一共需要调用4个参数:

  1. 第一个参数表示该window的标号,用来标识这个window。
  2. 第二个参数表示我们需要使用的Rect,用来划定window的区域。
  3. 第三个参数表面上是一个字符串,其实是我们这个window的主函数的名称,即我们要在这个window里需要做的事情,都可以放在这个函数里实现,需要注意的是,这种调用方法实际上是一种回调,并且不接受参数。而在后面的DoRect1()的函数中实现具体功能
  4. 第四个参数很容易理解,就是我们窗口的名称。
    最后可以看到实现效果如下:
    这里写图片描述
    以上大概就是创建一个窗口的主要流程,仿照上面的写法,我们就可以把我们的界面划分成许多小的窗口模块,并在里面实现相应的功能,这样一个插件的界面框架就完成了。

3. 用几种常用的GUI控件来填补我们的模块

回顾一下我们在Unity中常用的面板,比如这种
这里写图片描述

先来看第一种控件:
这里写图片描述
首先左侧的Clear Flags是通过EditorGUILayout.LabelField(“Clear Flags”)实现的,LabelField这一控件可以接受一个字符串并显示出来。
其次是右侧的一个多选框体,它可以通过EditorGUILayout.Popup(int, string[])来实现,其中接受的参数string[]表示我们点开该控件候弹出的选项上要显示的字符串,而前一个参数int则表示我们可选择的选项的序号。

然后我们再看一种控件:
这里写图片描述
同样的,左侧仍是一个LabelField,右侧却是一个FloatField,可以给用户输入相应的值,同时我们还可以使用IntFiled,StringField等等,效果都类似。

这里写图片描述
EditorGUILayout.IntSlider

这里写图片描述
EditorGUIlayout.Toggle

这里写图片描述
EditorGUILayout.Foldout

当然,这里把所有的控件都列举出来是不可能的,不过你可以在EditorGUIlayout以及EditorGUI中查找到你想要使用的任何控件。(PS:以上的代码都可以直接在DoRect1()中实现。)

**

4.小结

小小的总结一下我们的实现思路,先构建窗口,再把窗口划分成一个个独立的模块,最后在模块里填补上各种我们需要的功能。这样下来,一个带GUI界面的插件就可以实现了。当然,至于怎么实现你所需要的功能,这个就得看你自己怎么去实现了。

0 0
原创粉丝点击