SRPG游戏开发(七)第三章 绘制地图 - 四 初步完善地图编辑器(Map Graph)

本文介绍了如何在Unity中初步完善SRPG游戏的地图编辑器Map Graph,包括确定地图大小、绘制地图边框、显示地图信息、跟踪鼠标所在Cell、每帧刷新Scene面板、判断Cell是否在地图内以及创建地图的菜单选项。通过这些改进,Map Graph变得更加实用,便于开发者高效地设计和编辑游戏地图。
摘要由CSDN通过智能技术生成


返回目录

第三章 绘制地图


      初步完善地图编辑器(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()两个UnityCallback中使用,而Handles范围就广一些,而且功能更强大。我们需要在Scene中绘制CellPosition,所以使用两种混用的方法。你还需要知道,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
…


绘制边框,我们采用GizmosDrawWireCube(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;
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值