1-7 将坐标值显示在Inspector上
在上一章中,我们重新排列了每个地图单元的坐标值,并且添加了Y维度的坐标轴。随着项目不断复杂。在Unity runtime下,选中一个地图单元后,在Inspector门面板只能看到coordinates
这个变量的名称,而不是显示这个地图单元的坐标值。如下图所示:
虽然我们选中一个地图单元后,可以通过观察Scene窗口中它的坐标值,来确定这个地图单元的位置。但是在Inspector中增加坐标值显示,会更加方便美观。接下来我们实现这个功能。代码如下:
1 | //用来显示在Inspector上cell坐标 |
如下图所示,我们利用[SerializeField]
将X和Y的坐标值显示在了Inspector面板上。但是这两个坐标值是可编辑状态,这并不是我们希望达到的效果。因为坐标值应该是固定不变的,而且这样竖向排列也不美观。
为了解决这个问题,我们为HexCoordinates创建一个自定义特性来改变它的显示方式。
在项目中创建Editor文件夹,并且在该文件夹内创建HexCoordinatesDrawer.cs
脚本。这是一个只用于编辑器的脚本,扩展自UnityEditor.PropertyDrawer
,并且需要UnityEditor.CustomPropertyDrawer
特性来让其正确关联起来。代码如下:
1 | using UnityEngine; |
HexCoordinatesDrawer
继承了PropertyDrawer
,PropertyDrawers
通过OnGUI()
方法显示其内容,该方法提供了要在其中绘制的屏幕矩形、序列化的属性数据以及它所属的字段的标签。这里添加OnGUI()方法,在此方法中重新绘制X和Z的坐标。代码如下:
1 | public override void OnGUI( |
接下来,只需要提取出X和Z的坐标,使用HexCoordinates中重载的ToString()方法在指定的位置重新绘制GUI即可。代码如下:
1 | //将X和Z的坐标从HexCoordinates中提取出来 |
现在,坐标可以正确的显示出来了。但是这里只显示了数字,丢失了类型名。这里使用EditorGUI.PrefoxLabel()方法来或能重新绘制类型名。这个方法还有一个往外的好处,它可以返回一个经过吊证的矩形,该矩形与右侧的做标数值显示区域大小刚好匹配。代码如下:
1 | //绘制坐标的类型名称 |
最终效果如下图所示:
现在,我们在Unity中进行调试的时候,选中了某一个地图单元,Inspector面板中变回显示这个单元格的X Y Z坐标了。下一步,我们将添加一些简单的交互,当出表点击地图单元的时候,嚷被点击的地图单元改变颜色。