位置: 编程技术 - 正文

Custom List in inspector, displaying data your way[Unity]

编辑:rootadmin

推荐整理分享Custom List in inspector, displaying data your way[Unity],希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

原文地址: this Unity C# tutorial you will create a custom visualization for arrays and lists in the editor.You will learn tocreate a custom editoruse SerializedObjectmanipulate a SerializedProperty that represents an array or listuse an enumeration for option flagsuse GUI buttons

This tutorial comes after the Custom Data tutorial.

This tutorial is for Unity version 4.3 and above. The older version can still be found here.

inShare1Customized lists.Creating Test DataUnity's default way to show lists is serviceable, but it's possible to find yourself wanting for an alternative. The specifics can vary from case to case. So it would be useful if we could use a mix of different visualizations. It is possible to do this by adding attributes to variables that specify how the editor should show them.

We start with the finished Custom Data tutorial project, or by creating a new empty project and importing custom-data.unitypackage.

Then we create a new test script named ListTester with some test arrays, and make a new prefab and prefab instance with it, so we can see it all works as expected.

New test object, with wide inspector.Creating a Custom InspectorOur first step to customizing our lists is to create a custom inspector for our test component. Create a new C# script named ListTesterInspector in the Editor folder, make it extendUnityEditor.Editor, and apply the UnityEditor.CustomEditor attribute to tell Unity that we want it to do the drawing for our component.Custom inspector script.To actually change the inspector we need to override the OnInspectorGUI method of the Editorclass. Leaving the method empty will result in an empty inspector as well.Empty inspector.There are three important differences between a property drawer and an editor. Firstly, in the editor we work with an entire SerializedObject instead of a single SerializedProperty. Secondly, an instance of the editor exists as long as the object stays selected, keeping a reference to its data instead of getting it via a method parameter. Finally, we can useEditorGUILayout, which takes care of positioning for us.Custom List in inspector, displaying data your way[Unity]

We can get to the serialized object via the serializedObject property. To prepare it for editing, we must first synchronize it with the component it represents, by calling its Update method. Then we can show the properties. And after we are done, we have to commit any changes via itsApplyModifiedProperties method. This also takes care of Unity's undo history. In between these two is where we'll draw our properties.

Inspector with empty properties.The fields are visible again, but they're empty. This is because PropertyField doesn't show any children – like array elements – unless we tell it to do so.Inspector with children.Creating an Editor ListTo use a customized list in our inspector, we'll create an alternative for the PropertyFieldmethod. We will name this method Show and put it in its own static utility class, so we can use it wherever we want. We'll name this class EditorList and place it in the Editor folder.EditorList script.This method doesn't do anything yet, but we can already use it in our custom editor, resulting once again in an empty inspector.Showing a list consists of three parts, its foldout, its size, and its elements. We can show the foldout by using EditorGUILayout.PropertyField without having it show the children of the list. Then we can show the list elements ourselves with help of the arraySize property and theGetArrayElementAtIndex method of SerializedProperty. We'll leave the size for later.Lists without indented elements.Properly IndentingWe have our lists again, but their elements aren't indented. We can solve this by increasing the indent level before showing the elements, and decreasing it again afterwards.Messed up indenting.Now indentation works again, except for our color point list, which goes wrong after the first element. This is because we set the indent level to zero in our custom property drawer. There are two ways to fix this. Either our custom list should set the indent level to the correct value again after each element, or the property drawer should make sure it leaves the indent level unchanged. Let's make sure that ColorPointDrawer behaves well.Correct indenting, but no collapsing.Collapsing ListsNow that indenting works, we can take care of the next problem. Toggling the foldouts should collapse and expand the lists, but it currently doesn't work. This is easy to fix by checking theisExpanded property of our list.Correctly collapsing.Showing the SizeTo show the list's size, we can use the special relative property named Array.size. We'll simply show it in between the foldout and the elements.Why not use arraySize here?Complete lists.Customizing the ListNow that we have replicated the default list, it's time to add customizations. An easy start is to make the size that we just added optional. We add a boolean parameter to control this and turn it on by default.How does showListSize work?Using this new option, we can switch of the size for some of our lists.Hiding some of the list sizes.As a second option, let's make the list's label optional as well. If we don't show the label, we won't indent either and we will always show the elements, regardless whether the list is expanded.Now we can remove the label from some of our lists.Hiding some of the list labels.Using FlagsWhile we can keep adding options this way, our method calls will become increasingly obscure. We could add wrapper methods with more descriptive names, but that would bloat our script and isn't flexible. An alternative is the use of option flags.

The first thing we need to do is create an enumeration of all our options. We name itEditorListOption and give it the System.Flags attribute. We place it in its own script file or in the same script as EditorList, but outside of the class.

Is the Flags attribute required?Now we add entries for the two options that we already have. We also add an option for when we want nothing and for when we want the default. The default is to show both the list's label and its size. We specify this by combining both options with the bitwise OR operator |.How do bitwise flags work?The boolean parameters of the Show method can now be replaced with a single options parameter. Then we'll extract the individual options with the help of the bitwise AND operator &and store them in local variables to keep things clear.Then we can modify our custom inspector to use the new options approach.Hiding the Element LabelsAnother useful feature is the ability to hide the labels of the elements. So let's add an option for element labels and include it in the default. We can also add a convenient entry for the default without the element labels.Now all we have to do in our Show method is extract this option and perform a simple check. Let's also move the element loop to its own private method, for clarity. Hiding some of the element labels, wide and narrow.Our element labels can now be hidden, but something is wrong when we use a narrower inspector. It turns out that our color point drawer still decides to use an additional line, but without a label this is no longer useful. The solution is simply to make sure ColorPointDrawer does not claim an extra line when it does not receive a label.No longer needlessly claiming extra lines.Adding ButtonsInstead of removing parts, we can also add thing to our list. We could add a set of buttons for manipulating list elements. They can provide an alternative way to delete and duplicate elements, and we can add a means to reorder the elements as well.

First we'll add an option for buttons, and also a convenient option to activate everything.

For the button labels we'll use a simple "&#;" for duplicate, a "-" for delete, and a "↴" (rightwards arrow with corner downwards) for move. You can directly insert the arrow unicode character, but I use its escape code just to be sure everyone can copy it correctly.

We predefine static GUIContent for these buttons and include handy tooltips as well. We also add a separate method for showing the buttons and call it after each element, if desired.

Why static instead of const?Let's add these buttons to the lists for our color points and objects.Quite huge buttons.These buttons are way too large, because each claims an entire line. We want everything to stay together on a single line instead. We can instruct the automatic layout to do this by putting our content in between calls to EditorGUILayout.BeginHorizontal andEditorGUILayout.EndHorizontal.Pretty large buttons.That is a lot better, but the buttons are still too large. We'll change two things to make them behave. First, we'll apply some mini button styles to them. Second, we'll give them a fixed width of pixels each.Mini buttons.Now the buttons look fine, but they don't do anything yet.

Fortunately, adding functionality to the buttons is very simple, as we can directly use the methods for array manipulation provided by SerializedProperty. We need the list and the current element index for this to work, so we add them as parameters to our ShowButtons method and pass them along inside the loop of ShowElements.

How does Button work?What happens when we move the bottom element?What are the contents of a new item?Our buttons now work as expected. Or do they? Try deleting an element from the objects list. If it references no component, it works. But if it does reference something, it will clear the reference, but not remove the element from the list.

While this is how Unity handles deletion in this case, it is weird. Instead, we want the element to always be removed, not sometimes cleared. We can enforce this by checking whether the list's size has remained the same after deleting the element. If so, it has only been cleared and we should delete it again, for real this time.

An additional button we could include is one to add an element when the list is empty. This is useful when we're not showing the list size, because in that case you could neither duplicate an element nor manipulate the list size directly. So let's add such a button.A big add button.Only Allowing ListsWhat would happen if we would try to use our editor list with something that isn't a list at all? Let's find out by adding something to ListTester that is not a list.Now also try to show it in ListTestInspector.Not a list shown.It actually works for our integer. But it's not guaranteed to work for any arbitrary type and it will also result in errors for some options. It is a better idea to flatly refuse to show anything that isn't a list. So let's check whether the property is an array. If it isn't, we display a nicely formatted warning and nothing else.Only lists allowed.Multi-object EditingAnother interesting point is multi-object editing. You can test this by duplicating our list tester object, make them a little different, and selecting both at the same time.No multi-object editing yet.By default custom editors do not support multi-object editing, though that is easily fixed by adding the CanEditMultipleObjects attribute to our ListTesterInspector.Multi-object editing.While this can be useful, it gets weird when you're editing multiple objects that have lists of different sizes. In general it is not very useful and might even be drawn wrong. So let's not show the list's elements when we have multiple different sizes.Divergent lists will not be shown.We now have a generic list drawer with four customization options that you can use instead of the default list representation. Quite handy!

Unity NGUI添加事件监听(转摘) usingUnityEngine;usingSystem.Collections;usingUnityEngine.UI;usingUnityEngine.EventSystems;usingUnityEngine.Events;publicclassUIMain:MonoBehaviour{Buttonbutton;Imageimage;voidStart(){button=transform.

Unity光照烘焙后,在PC上曝光,发布移动平台正常的解决方法 Unity在Windows下默认使用的是DX,使用OpenGL就能解决过曝的问题,添加Unity的启动参数force-opengl,例如下面:在unity.exe的快捷方式中写上exe路径-force-opengl安

CustomPropertyDrawer-Change the height of Property field Thelastblogpostdidn'tcoveracertainniftymethodinPropertyDrawer,whichistheGetPropertyHeight.GetPropertyHeight:Determinestheheightinpixelofthepropertyfield.OverridingGetPropertyHeightthereforeallowsyouto

标签: Custom List in inspector, displaying data your way[Unity]

本文链接地址:https://www.jiuchutong.com/biancheng/377322.html 转载请保留说明!

上一篇:numix-cicle圆形图标(圆形图表分析怎么做)

下一篇:Unity NGUI添加事件监听(转摘)

  • 杭天金税财务软件多少钱
  • 应纳税所得额是利润总额吗
  • 个人转让著作权免税吗
  • 母子公司换股协议
  • 建筑工程发票来自哪里
  • 计算消费税时运费计入计税依据么
  • 调试费含税吗
  • 经营性项目应收减少额怎么算
  • 已贴花的凭证凡修改后所载金额增加的部分应补贴印花
  • 会计中制造费用是什么意思
  • 应付股东款可以结转实收资本吗
  • 税率调整后之前签的合同用变更吗
  • 地质灾害评估费收费标准
  • 贸易利益怎么计算
  • 损失性费用的会计科目有
  • 工资薪金支出税收额是什么意思
  • 物流车辆挂靠账务怎么处理?
  • 小规模纳税人缴纳增值税的会计科目
  • linux 使用u盘
  • win10安全中心通知关闭
  • 笔记本电脑怎么重装系统
  • linux 匹配字符
  • 应交所得税和所得税费用的区别计算公式
  • linux常见的文本编辑工具有哪些
  • 申请开立临时存款账户
  • thinkphp i方法
  • 苹果手机最贵的软件是哪个
  • 控股公司的账务处理
  • 消费税的会计分录怎么写
  • 今日七夕祝福语
  • php连接mysql数据库步骤正确的是
  • 所得税季报本月数是指
  • ai安装教程2020
  • 利润表中本期金额栏各项目应根据损益类账户的什么填列
  • 公司对公账户没有流水怎么办
  • 金税盘抵免增值税怎么做账
  • 物流公司账务处理特点
  • 人力资源公司财务工作心得与感悟
  • 深入理解linux内核
  • 酒店电费 水费需要另外算吗
  • 工程施工与工程结算对冲分录
  • 一次还本付息债券定价公式
  • 未开发票如何确认收入并进行申报?
  • 企业进项是什么意思
  • 电商收服务费合法吗
  • 建筑安装增值税税率变更过程
  • 企业年金个人和公司缴费比例
  • 出差发生的招待费计入差旅费吗
  • 如果收到现金做账了还叫坐支
  • 计提印花税会计分录
  • 销售佣金的三大特点是什么?
  • 怎样贴发票之类的报销单据
  • 固定资产转让开票大类是什么
  • 五险 会计
  • 企业的未分配利润属于什么科目
  • 领用材料属于什么会计分录
  • 超出工资总额
  • sql分几类
  • delete from 表名 where
  • mysql常见报错
  • 懒癌患者如何自救
  • win7清理系统垃圾的方法
  • Ubuntu 14.04系统怎么安装Nvidia 私有显卡驱动?
  • macos high sierra深色模式
  • 用iTunes更新iPhone结果盘容量一直减少
  • linux安全性从何而来
  • P2PNetworking3.exe - P2PNetworking3是什么进程 有什么用
  • mobile window
  • 如何删除win7系统自带游戏软件
  • win8怎么删除所有东西
  • javascript中的document.write
  • jQuery与Ajax以及序列化
  • jquery和dom对象之间怎么转换
  • [置顶] 安卓手机连接IP100蓝牙打印机实现打印功能
  • 喜大普奔含义
  • 小规模开票限额最新规定2022
  • 宁波地税如何网上缴费
  • 外贸企业出口退税流程及账务处理
  • 电子税务局怎么添加开票员
  • 公司自有房产出租缴税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设