Unity Editor 基础篇(七):Property Attributes自定义属性

本文参自:http://mp.weixin.qq.com/s/kjoS2DaAADBUPMg1kHwnSg 
本文为本人学习上连接的笔记有改动,请点击以上链接查看原文,尊重楼主知识产权。


Property Attributes自定义属性

目标: 
1.了解一些基本的使用 
2.自定义一个Property Attributes

最终效果:

这里写图片描述


准备:

大伙们还记得《Unity Editor 基础篇(一):Build-In Attribute》里所说的东西吗?如下图所示:

这里写图片描述

这篇文章讲解自定义一个这样的属性:

创建一个新的工程或者用上一篇的工程都可以,然后在创建C#脚本:

Scripts文件夹: 
   ReadOnlyAttribute.cs 自定义的属性类(继承PropertyAttribute) 
   Test.cs:测试使用自定义了的属性的类

Editor文件夹: 
   ReadOnlyAttributeDrawer.cs自定义的属性的绘制类 
   (继承PropertyDrawer)

扫描二维码关注公众号,回复: 3722460 查看本文章

代码:

首先,打开我们得“ReadOnlyAttribute.cs”脚本,为其添加如下代码:

这里写图片描述

这段代码很简单,就是让我们的“ReadOnlyAttribute”类继承自“PropertyAttribute”类,该类的解释如下图所示:

这里写图片描述

所以呢,由上图便能知道我们接下来要做的事情了吧,那就是让我们的“ReadOnlyAttributeDrawer”类继承自PropertyDrawer类,然后重写OnGUI和GetPropertyHeight方法,如下图所示:

这里写图片描述

上图的代码在上一篇都有讲解过,因此这里不再做过多的赘述。

好的,接下来继续为我们的“ReadOnlyAttributeDrawer.cs”的OnGUI方法添加如下代码:

这里写图片描述

在上面的代码中,我们使用到了一个名为“SerializedPropertyType”的枚举,它存放的是序列化属性的类型,它包含的类型很多,但是在该篇文章中我们只使用到了这几个,感兴趣的同学看可以去尝试其它类型。

我们使用该枚举为value获取相对应类型的值,然后使用一个Label在Inspector面板中绘制出来(\t为制表符同Tap键,为了美化显示)。

好了,接下来打开我们的“Test.cs”脚本,添加如下代码:

这里写图片描述

现在,让我们回到Unity中查看一下效果:

这里写图片描述

这个。。。是不是很简单呀。


接下来让我们制作一个带有参数的。

让我们打开我们的“ReadOnlyAttribute.cs”,添加如下代码:

这里写图片描述

再让我们为“ReadOnlyAttributeDrawer.cs”的OnGUI函数添加如下方法:

这里写图片描述

上面的代码相信大伙们都能看懂,唯一有点迷惑的可能就是attribute 属性了,其实它就是我们通过 [CustomPropertyDrawer(typeof(ReadOnlyAttribute))] 传过来的ReadOnlyAttribute类,(写成this.attribute可以好理解点)

因此楼主Debug了它的类型名字,接下来让我们看看打印出来的信息:

这里写图片描述

好的,就是我们的 ReadOnlyAttribute 类。 
对了楼主打印了 myAttribute.textColor 的值,是为了测试值是否正确的传入。

好了,接下来开始测试,让我们为我们的“Test.cs”脚本添加如下代码:

这里写图片描述

从上图可知,其实[ReadOnlyAttribute(参数)] 传入的参数对应的就是我们ReadOnlyAttribute类的构造函数需要传入的参数。

好了,接下来让我们回到Unity中查看一下效果:

本人的效果:

这里写图片描述

颜色和alaph设置都正常;

但是切换到个人版unity白底就跟下面楼主的类似了都是黑字,alaph正常,颜色不对。


原著楼主的效果:

这里写图片描述

好了,大伙们可以看到,值已经完美的传入了,效果并不是完美期望的那样。但是我们的 My Int 的 Apha 值起作用了。 
楼主对于这个Bug弄了一个晚上,最后发现原来是Unity5.x出的BUG,总之楼主今晚把Unity5.x版本都试得差不多了,还是一个鸟样,最后Unity4.6版本妥妥得实现了我们想要得效果,下面有两张图,一张是楼主试过得版本,一张是Unity4.6实现得效果图:

试过的版本

Unity4.6版本的效果

不知道大伙们的Unity5.x能否实现,其实楼主只是想用这个案例告诉大伙们 [xxxx(参数)] 里的参数是这样弄的,仅此而已哟。

猜你喜欢

转载自blog.csdn.net/dengshunhao/article/details/83001356
今日推荐