1-7 将坐标值显示在Inspector上

  在上一章中,我们重新排列了每个地图单元的坐标值,并且添加了Y维度的坐标轴。随着项目不断复杂。在Unity runtime下,选中一个地图单元后,在Inspector门面板只能看到coordinates这个变量的名称,而不是显示这个地图单元的坐标值。如下图所示:

  虽然我们选中一个地图单元后,可以通过观察Scene窗口中它的坐标值,来确定这个地图单元的位置。但是在Inspector中增加坐标值显示,会更加方便美观。接下来我们实现这个功能。代码如下:

HexCoordinates.cs
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
34
35
36
37
//用来显示在Inspector上cell坐标
[SerializeField]
private int x, z;

//存储重新计算后的X坐标值
//public int X { get; private set; }
public int X
{
get
{
return x;
}
}

//存储重新计算后的Z坐标值
//public int Z { get; private set; }
public int Z
{
get
{
return z;
}
}

/// <summary>
/// 重载默认的构造函数
/// </summary>
/// <param name="x">为转换后的X坐标赋初始值</param>
/// <param name="z">为转换后的Z坐标赋初始值</param>
public HexCoordinates(int x, int z)
{
//X = x;
//Z = z;

this.x = x;
this.z = z;
}

  如下图所示,我们利用[SerializeField]将X和Y的坐标值显示在了Inspector面板上。但是这两个坐标值是可编辑状态,这并不是我们希望达到的效果。因为坐标值应该是固定不变的,而且这样竖向排列也不美观。

  为了解决这个问题,我们为HexCoordinates创建一个自定义特性来改变它的显示方式。

  在项目中创建Editor文件夹,并且在该文件夹内创建HexCoordinatesDrawer.cs脚本。这是一个只用于编辑器的脚本,扩展自UnityEditor.PropertyDrawer,并且需要UnityEditor.CustomPropertyDrawer特性来让其正确关联起来。代码如下:

HexCoordinatesDrawer.cs
1
2
3
4
5
6
7
using UnityEngine;
using UnityEditor;

[CustomPropertyDrawer(typeof(HexCoordinates))]
public class HexCoordinatesDrawer : PropertyDrawer
{
}

  HexCoordinatesDrawer继承了PropertyDrawerPropertyDrawers通过OnGUI()方法显示其内容,该方法提供了要在其中绘制的屏幕矩形、序列化的属性数据以及它所属的字段的标签。这里添加OnGUI()方法,在此方法中重新绘制X和Z的坐标。代码如下:

HexCoordinatesDrawer.cs
1
2
3
4
public override void OnGUI(
Rect position, SerializedProperty property, GUIContent label)
{
}

  接下来,只需要提取出X和Z的坐标,使用HexCoordinates中重载的ToString()方法在指定的位置重新绘制GUI即可。代码如下:

HexCoordinatesDrawer.cs
1
2
3
4
5
6
7
//将X和Z的坐标从HexCoordinates中提取出来
HexCoordinates coordinates = new HexCoordinates(
property.FindPropertyRelative("x").intValue,
property.FindPropertyRelative("z").intValue);

//利用HexCoordinates中重载的ToString方法,显示坐标
GUI.Label(position, coordinates.ToString());

  现在,坐标可以正确的显示出来了。但是这里只显示了数字,丢失了类型名。这里使用EditorGUI.PrefoxLabel()方法来或能重新绘制类型名。这个方法还有一个往外的好处,它可以返回一个经过吊证的矩形,该矩形与右侧的做标数值显示区域大小刚好匹配。代码如下:

HexCoordinatesDrawer.cs
1
2
3
4
//绘制坐标的类型名称
position = EditorGUI.PrefixLabel(position, label);
//利用HexCoordinates中重载的ToString方法,显示坐标
GUI.Label(position, coordinates.ToString());

  最终效果如下图所示:

  现在,我们在Unity中进行调试的时候,选中了某一个地图单元,Inspector面板中变回显示这个单元格的X Y Z坐标了。下一步,我们将添加一些简单的交互,当出表点击地图单元的时候,嚷被点击的地图单元改变颜色。