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个参数:
- 第一个参数表示该window的标号,用来标识这个window。
- 第二个参数表示我们需要使用的Rect,用来划定window的区域。
- 第三个参数表面上是一个字符串,其实是我们这个window的主函数的名称,即我们要在这个window里需要做的事情,都可以放在这个函数里实现,需要注意的是,这种调用方法实际上是一种回调,并且不接受参数。而在后面的DoRect1()的函数中实现具体功能
- 第四个参数很容易理解,就是我们窗口的名称。
最后可以看到实现效果如下:
以上大概就是创建一个窗口的主要流程,仿照上面的写法,我们就可以把我们的界面划分成许多小的窗口模块,并在里面实现相应的功能,这样一个插件的界面框架就完成了。
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界面的插件就可以实现了。当然,至于怎么实现你所需要的功能,这个就得看你自己怎么去实现了。
- XLT的unity3D学习笔记(三)
- XLT的unity3D学习笔记(一)
- XLT的unity3D学习笔记(二)
- XLT的unity3D学习笔记(四)
- unity3d 学习笔记(三)
- Unity3D学习笔记(三)Unity的C#基础
- Unity3D学习入门笔记(三)
- Unity3D学习笔记之三Prefab组件的使用
- Unity3D 学习笔记(三) 输入与输出
- Unity3D学习笔记(三)为地形添加花草树木
- Unity3D学习笔记(三)为地形添加花草树木
- 【Unity3D游戏开发学习笔记】(三)移山倒海—Terrain的建造
- Unity3D学习笔记《Space Shooter》三
- unity3D学习笔记之三:全局光照
- Unity3D笔记(三)牧师和魔鬼的游戏
- Unity3D学习 愤怒的小鸟之Play界面(三)
- Unity3D 学习笔记(一)
- unity3d 学习笔记(一)
- MTK 开发流程和开发环境
- jaxen作用
- git lfs 用于二进制文件等非代码文件的版本控制
- 多态
- Python基础-dict字典
- XLT的unity3D学习笔记(三)
- Django下静态模板的继承
- 4774. 【GDOI2017模拟9.10】子串
- UVa - 10082 - WERTYU (常量数组的使用)
- RSA加密算法
- 腾讯优测优分享 | Android适配中的一些特殊情况小结
- 【BZOJ3226】【codevs2297】校门外的区间,线段树
- 产品定位,什么是产品?什么是产品定位?
- HDU1175-连连看