第三章 绘制地图
四 初步完善地图编辑器(Map Graph)
到目前为止我们可以开心的绘制我们的地图了,但有不少小问题。一直开心忘我的绘制地图,却不知道地图已经绘制了多大,还要去看到底大小有没有超标。像其它地图编辑器都会有相关参数显示。我们也开始创建有些有助于绘制的显示参数,让它更像一个标准的地图编辑器,创建我们的MapGraph.cs。
1 地图大小(Map Rect)
第一部要做的是确认地图的大小,我们要先确定我们地图绘制大小,这就可以知道我们绘制的东西是不是已经超越边界。比如一个10x10的地图:
你可以使用确定对角线Position的方式。
public Vector3Int m_LeftDownPosition = Vector3Int.zero; public Vector3Int m_RightUpPosition = new Vector3Int(9, 9, 0); public RectInt mapRect { get { return new RectInt( m_LeftDownPosition.x, m_LeftDownPosition.y, m_RightUpPosition.x - m_LeftDownPosition.x + 1, m_RightUpPosition.y - m_LeftDownPosition.y + 1); } }
也可以直接使用矩形,我们这里直接使用整形的矩形RectInt。
public RectInt m_MapRect = new RectInt(0, 0, 10, 10); public Vector3Int leftDownPosition { get { return new Vector3Int(m_MapRect.xMin, m_MapRect.yMin, 0); } } public Vector3Int rightUpPosition { get { return new Vector3Int(m_MapRect.xMax - 1, m_MapRect.yMax - 1, 0); } }
接下来我们添加一些常用的属性(Property),地图的宽(width)与高(height)。
public int width { get { return m_MapRect.width; } } public int height { get { return m_MapRect.height; } }
2 在Scene面板中绘制地图边框(Border)
在Unity中绘制辅助线的方式有多种,比如“Gizmos”和“Handles”。其中Gizmos只能在OnDrawGizmos()与OnDrawGizmosSelected()两个Unity的Callback中使用,而Handles范围就广一些,而且功能更强大。我们需要在Scene中绘制Cell的Position,所以使用两种混用的方法。你还需要知道,Handles是在UnityEditor的命名空间中,在MonoBehaviour中需要在#if UNITY_EDITOR与#endif之间使用。
- OnDrawGizmos():无论是否被选中,都在Scene面板中渲染;
- OnDrawGizmosSelected():只有选中状态下,才在Scene面板中渲染。
我们先在MapGraph.cs中创建这一领域。
#if UNITY_EDITOR using UnityEditor; #endif … #if UNITY_EDITOR private void OnDrawGizmos() { EditorDrawBorderGizmos(); } protected void EditorDrawBorderGizmos() { } #endif …
绘制边框,我们采用Gizmos的DrawWireCube(Vector3 center, Vector3 size)方法。从中我们看出,需要中心点与大小。而计算他们主要还是靠Grid组件获取Cell的世界坐标方法(world position),所以我们添加Grid组件。
private Grid m_Grid; public Grid grid { get { if (m_Grid == null) { m_Grid = GetComponent<Grid>(); } return m_Grid; } }