第七章 寻路与地图对象(Pathfinding and Map Object)
这一章主要进行寻路与地图对象的部分工作。
四 地图对象(Map Object)
这一节我们来写地图对象。
首先应先明确,我们这里的地图上的元素包括:
标注移动范围或攻击范围的光标(MapCursor):单独一层
Tilemap
或者使用GameObject
(我们使用GameObject);职业等(MapClass);
不可毁坏的障碍物(MapObstacle);
用户光标(MouseCursor):显示鼠标所在位置或者类似主机游戏的光标位置;
其它自定义内容。
我们之前已经建立了一个空的地图对象,这里来进行填充。
不过在这之前,我们先在MapGraph.cs
中填充一个辅助函数:
/// <summary>
/// 获取Cell的位置
/// </summary>
/// <param name="cellPosition">网格坐标</param>
/// <param name="center">是否是中心位置</param>
/// <param name="world">是否是世界坐标</param>
/// <returns></returns>
public Vector3 GetCellPosition(Vector3Int cellPosition, bool world = true, bool center = false)
{
Vector3 pos;
if (world)
{
pos = grid.GetCellCenterWorld(cellPosition);
}
else
{
pos = grid.GetCellCenterLocal(cellPosition);
}
if (!center)
{
pos.y -= halfCellSize.y;
}
return pos;
}
然后,根据地图对象的类型建立Enum
:
namespace DR.Book.SRPG_Dev.Maps
{
public enum MapObjectType
{
MouseCursor,
Cursor,
Obstacle,
Class
}
}
1 抽象地图对象(MapObject.cs)
关于抽象类,我们至少应该知道:
地图对象的坐标;
在动态生成时,需要刷新它的位置;
它最好还是一个可重复使用的对象。
基于以上理由填充类:
using UnityEngine;
namespace DR.Book.SRPG_Dev.Maps
{
using DR.Book.SRPG_Dev.Framework;
[DisallowMultipleComponent]
public abstract class MapObject : MonoBehaviour, IReusableComponent
{
#region Field
[SerializeField]
private SpriteRenderer m_Renderer;
private MapGraph m_Map;
private Vector3Int m_CellPosition;
#endregion
#region Property
public new SpriteRenderer renderer
{
get { return m_Renderer; }
set { m_Renderer = value; }
}
/// <summary>
/// 地图网格中的位置
/// </summary>
public Vector3Int cellPosition
{
get { return m_CellPosition; }
}
/// <summary>
/// 所属地图
/// </summary>
public MapGraph map
{
get { return m_Map; }
internal set { m_Map = value; }
}
/// <summary>
/// 地图对象类型
/// </summary>
public abstract MapObjectType mapObjectType { get; }
#endregion
#region Method
public void InitMapObject(MapGraph map)
{
m_Map = map;
}
/// <summary>
/// 更新位置
/// </summary>
/// <param name="cellPosition"></param>
/// <param name="center"></param>
/// <param name="world"></param>