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

在Unity 5中如何控制检视面板上的属性是否显示?

2016-12-15 23:57 501 查看
当脚本中有大量属性或字段需要在检视面板中调整时,检视面板会变得杂乱无章。有没有什么办法可以自己来管理这些属性是否显示呢?本文就为大家介绍无需自定义检视面板来管理属性显示的方法。



首先介绍HeaderAttributes的用法,让大家对控制检视面板属性有个概念。然后介绍如何通过脚本中的一个bool变量来控制检视面板上属性的显示和隐藏。

改善可读性

让我们看一下下面的检视面板示例:



即便是这样一个简单的脚本在检视面板上看起来已经不太好理解了。

我们想做的是对属性进行分组,这样可以方便设计师们理解脚本的作用,设计师们也能清楚区分脚本中不同函数的不同变量。这可以通过 HeaderAttributes来实现。

只需在字段前添加HeaderAttribute属性声明,即可大大增强脚本代码在检视面板上的可读性。


HeaderAttribute示例:





Unity提供了一系列的属性来帮助管理脚本在检视面板上的显示以及用户交互,并不需要为各脚本单独自定义检视面板。

一些实用且常用的属性都位于SpaceAttribute、TooltipAttribute、RangeAttribute内。

根据用户输入控制字段显隐

有了分组,下面就来实现用变量控制变量显隐。这里Auto Anim分类下的属性只有在EnableAutoAim被设为True时才会显示。

首先当EnableAutoAim被设为False时,将所有与EnableAutoAim关联的属性禁用。



实现这一步需要自定义属性并使用PropertyDrawer。具体细节可查看教程:https://unity3d.com/learn/tutorials/modules/intermediate/live-training-archive/property-drawers-custom-inspectors。

下面来介绍实现逻辑以及对PropertyDrawer和属性的设置。

第一步:创建脚本

首先创建两个脚本ConditionalHideAttribute和ConditionalHidePropertyDrawer。注意要将ConditionalHidePropertyDrawer脚本放在Editor文件夹下,否则会无法访问需要的属性。ConditionalHideAttribute脚本则放在外面。



第二步:ConditionalHideAttribute

首先创建属性,然后定义bool字段来控制检视面板上属性的显示或隐藏,并且可以进行切换。

ConditionalHideAttribute继承自PropertyAttribute类,只包含构造函数和一些数据。该类的主要目的是提供在PropertyDrawer内使用的额外数据。如果想添加另外的选项或参数也可在此添加。

ConditionalHideAttribute类最上方的AttributeUsage属性用于控制是否可以使用ConditionalHideAttribute属性。



第三步:ConditionalHidePropertyDrawer对于PropertyDrawer

还有些事要做。如果想让Unity在检视面板上绘制字段,需要:

检查自定义属性中的参数

隐藏或禁用基于属性参数绘制的字段



调用GetConditionalHideAttributeResult函数来检查字段是否应该显示。



如果是需要隐藏的字段,计算字段高度让后面的字段不会被重叠绘制。



完整的ConditionalHidePropertyDrawer脚本代码可点击[阅读原文]查看。

第四步:使用使用属性

ConditionalHideAttribute就像使用HeaderAttribute一样简单方便。

ConditionalHideAttribute隐藏属性的用法:



将第二个参数留空或设为False即可使用Enable或Disable方法来绘制属性。

ConditionalHideAttribute禁用属性的用法:



注意事项

在有些情况下该属性会失效。

第一种是列表和数组。这种情况下属性绘制器(Property Drawer)将应用于列表的内容而非列表本身。此时仍然可以设置列表元素个数。但如果该列表位于可序列化类中,就不会存在这个问题。





另一种会导致属性失效的情况是混合使用了其它属性绘制器(Property Drawer)例如TextAreaAttribute时,会改变属性本身的绘制方式。

这是因为类似TextAreaAttribute这样的属性会调用自己的OnGUI进行绘制,计算高度也是调用自己的GetPropertyHeight函数。这种情况下最后被调用的属性会决定最终绘制的内容。

扩展

还可以支持两个bool参数,只需加入另一个ConditionalSourceField作为参数即可。

ConditionalHideAttribute使用两个条件的用法:



另外还能支持将对象引用作为判断条件。你也可以自己扩展代码添加一些条件判断如整数、浮点数或字符串等等。

本文来源于:brechtos.com  原作者:Brecht Lecluyse
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: