第七章 寻路与地图对象(Pathfinding and Map Object)
这一章主要进行寻路与地图对象的部分工作。
六 在地图中创建地图对象(Create Map Object in Map)
这一节我们在MapGraph
中添加创建地图对象的方法。
不过在这之前,要修复一点小bug:在寻路时发现,我们的SrpgTile
创建的Asset的属性无法保存(当退出Unity再打开时,部分属性回复成了默认值)。
1 修复 SRPG Tile 无法保存的错误(Fix Bug of SRPG Tile )
这里无法保存的原因是因为我们的属性没有被Unity序列化。
而没有被序列化的原因是我们的字段(Field)用的private
,而对外调用使用的是属性(Property)。
在Unity序列化ScriptableObject
时,只有当字段为public
或者持有[SerializeField]
属性(Attribute)的字段才会被序列化。
所以在我们的代码中添加[SerializeField]
:
[SerializeField]
private TerrainType m_TerrainType = TerrainType.Plain;
[SerializeField]
private int m_AvoidRate = 0;
这样就可以保存了,你可以改变数值,关闭Unity,再次打开Unity看是否保存正确。
2 地图对象分析(Analysis of Map Objects)
我们先来看一下每种地图对象:
MapMouseCursor
:我们要知道它是用户光标,它也有几种变化,比如选中角色和没有选中应该是不同的,但我们这里从简,只使用了一种。如果你要改变它,可以自己建立新的Prefab,控制它的状态,或者控制不同的动画。而在地图中显示这种光标,有且仅有一个。MapCursor
:它是显示范围使用的光标,这种光标在每次选择角色进行移动或攻击时都会出现,而且每次出现几个或十几个不等数量,重用量非常大,所以它最好在对象池(Object Pool)中。MapObstacle
:障碍物一般是地图中的静态物体,只需要随着场景创建与销毁就可以了。MapClass
,玩家角色一般每一个场景中是固定的,但敌人的出现就不固定了。比如在FE4中,当敌人全部被击杀至小于一定数量时,敌人小队长会返回城中再次出现同样数量的敌人;再比如,大部分游戏中都会出现击杀某个敌人或到达指定地点后触发事件,产生新的敌人。所以它最好也在对象池(Object Pool)中。
对象池ObjectPool
在第六章编写的DR.Book.SRPG_Dev.Framework
命名空间下。
基于以上分析,我们在MapGraph
先暂时添加一些相关的字段与属性:
#region Map Object Field
[Header("Map Object Setting")]
[SerializeField]
private ObjectPool m_MapObjectPool;
[SerializeField]
private MapMouseCursor m_MouseCursorPrefab;
[SerializeField]
private MapCursor m_CursorPrefab;
/// <summary>
/// 生成的MapMouseCursor
/// </summary>
private MapMouseCursor m_MouseCursor;
/// <summary>
/// 运行时,MapCursor的预制体
/// </summary>
private MapCursor m_RuntimeCursorPrefab;
/// <summary>
/// 移动范围光标集合
/// </summary>
private List<MapCursor> m_MapMoveCursors = new List<MapCursor>();
/// <summary>
/// 攻击范围光标集合
/// </summary>
private List<MapCursor> m_MapAttackCursors = new List<MapCursor>();
/// <summary>
/// 职业集合
/// </summary>
private List<MapClass> m_Classes = new List<MapClass>();
#endregion
#region Map Object Property
/// <summary>
/// MapObject父对象
/// </summary>
public ObjectPool mapObjectPool
{
get { return m_MapObjectPool; }
set { m_MapObjectPool = value; }
}
/// <summary>
/// 默认mouse cursor的prefab
/// </summary>
public MapMouseCursor mouseCursorPrefab
{
get { return m_MouseCursorPrefab; }
set { m_MouseCursorPrefab = value; }
}
/// <summary>
/// 默认cursor的prefab
/// </summary>
public MapCursor cursorPrefab
{
get { return m_CursorPrefab; }
set { m_CursorPrefab = value; }
}
/// <summary>
/// 用户光标
/// </summary>
public MapMouseCursor mouseCursor
{
get { return m_MouseCursor; }
}
/// <summary>
/// 运行时,MapCursor的预制体
///