您的位置:首页 > 移动开发 > Unity3D

Unity3D研究院之在开始学习拓展编辑器(一)

2016-11-13 16:58 190 查看
http://www.xuanyusong.com/archives/2202


Unity拥有非常丰富的拓展编辑器接口,如果是在网上下载过别人写的插件,你会发现为什么它的监测面板视图和普通的不一样?其实是他通过代码自己绘制的监测面板,这篇博文MOMO带大家来学习编辑器。如下图所示,这是我通过代码拓展的面板视图。





 

 下一条简单的脚本,绑定挂在摄像机上。

C#

1

2

3

4

5

6

7

8

using
UnityEngine;

using
System.Collections;

 

public
class
Test
:
MonoBehaviour

{

    public
Rect
mRectValue
;

public
Texture
texture;

}

 

如图所示,在监测面板视图中它是一个很普通的结构。





 

下面我们需要在代码中动态的编辑它。请在你的Project视图中创建一个Editor文件夹,如果有的话就不用创建。把脚本MyEditor放进Editor文件夹中。

MyEditor.cs

C#

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

using
UnityEditor;

using
UnityEngine;

 

//自定义Tset脚本

[CustomEditor(typeof(Test))]

//在编辑模式下执行脚本,这里用处不大可以删除。

[ExecuteInEditMode]

//请继承Editor

public
class
MyEditor
:
Editor

{

//在这里方法中就可以绘制面板。

    public
override
void
OnInspectorGUI()

{

//得到Test对象

        Test
test
=
(Test)
target;

//绘制一个窗口

test.mRectValue
=
EditorGUILayout.RectField("窗口坐标",

test.mRectValue);

//绘制一个贴图槽

test.texture
=  EditorGUILayout.ObjectField("增加一个贴图",test.texture,typeof(Texture),true)
as
Texture;

 

}

}

 编辑器的用法非常简单,OnInspectorGUI()方法中可以绘制控件,EditorGUI和EditorGUILayout可创建编辑器控件,和GUI的用法非常相像。如图所示,在回到Test的面板中,新的面板已经映入眼帘。对于其它控件的使用,大家可以自行去API中查阅,。原理都差不多。

 





 

值得一提的是C#语言提供了一个非常赞的方法,它可以让你的数据更加的安全,并且可以在Get Set方法中监听到你获取与赋值的操作,推荐使用这种方法。简单的改一下Test.cs

C#

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

using
UnityEngine;

using
System.Collections;

 

public
class
Test
:
MonoBehaviour

{

 

[HideInInspector][SerializeField]
Rect
pRectValue
;

    public
Rect
mRectValue

{

        get

{

return
pRectValue;

}

        set

{

            pRectValue
=
value;

        }

    }

 

[HideInInspector][SerializeField]
Texture
pTexture
;

    public
Texture
texture

{

        get

{

return
pTexture;

}

        set

{

            pTexture
=
value;

        }

    }

 

}

 

举例说明一下 [HideInInspector][SerializeField] 隐藏数据在面板,并且序列化。它可以帮我们永久保存数据,如果不加的话数值就会重置。就好比我先添加了一个贴图,一运行游戏刚刚添加的贴图就变成null了。

还是以texture为例,当我们使用texture对象的时候,它会进入get板块快获取私有变量pTexture的值。当编辑器更改texture的时候,会进入set版块,将数值保存在pTexture中。这样你的数据会更加安全,因为这里操作的是当前类中的一个私有变量。也可以在get/set版块中加入一些特殊的代码。

最后在update()或者OnGUI中就可以直接用texture 对象了。当然也可以是你定义的任意对象。

最后是本文的下载 http://vdisk.weibo.com/s/xbzrt
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: