第七章 寻路与地图对象(Pathfinding and Map Object)
这一章主要进行寻路与地图对象的部分工作。
七 遮挡与绘制地图对象(Occlusion and Draw MapObject)
1 遮挡问题(Occlusion)
最初要明确的是,我们之前设置的格子的Pivot与Sprite的Pivot全部都是最下方(Bottom)。一般超出一个格子的素材都是上部分超出(比如我们的角色)。
在同一层的地图对象可能会造成遮挡:
人物被地图障碍物(蓝色小方块,它是一个
MapObstacle
)人物与障碍物位于同一层(
MapObject
层)
造成遮挡的原因是渲染顺序。这就不是我们想要的了,我们希望下方格子的对象能够遮挡上方格子的对象,类似的在水平方向上希望右边的对象能够遮挡左边的对象。
解决这个方法是设置渲染组件的sortingOrder
属性 (从小向大渲染) 。
而计算它推荐的方式为,将最左下角格子表示为(0,0)(相对零点坐标),然后sortingOrder
从右到左,从下到上逐渐降低。
在MapObject
类中进行添加与修改:
/// <summary>
/// 计算sortingOrder
/// </summary>
/// <returns></returns>
public static int CalcSortingOrder(MapGraph map, Vector3Int cellPosition)
{
if (map == null)
{
return 0;
}
// 相对零点坐标
Vector3Int relative = cellPosition - map.leftDownPosition;
// 计算从右到左,从下到上渲染顺序(sortingOrder越大越后渲染)
// 前y行的格子总数 = map.width * relative.y
// 当前行(第y+1行)从右向左的格子数 = map.width - relative.x
// 这样计算后是递增,范围 [1, map.width * map.height]
// 加上负号后是递减,范围 [-(map.width * map.height), -1]
// 举例:地图尺寸20x10
// 右下角相对坐标,第20列第1行:
// cellPosition = (19, 0, 0),sortingOrder = -(20 * 0 + (20 - 19)) = -1
// 左上角相对坐标,第1列第10行:
// cellPosition = (0, 9, 0),sortingOrder = -(20 * 9 + (20 - 0)) = -200
// 测试相对坐标,第12列第6行:
// cellPosition = (11, 5, 0),sortingOrder = -(20 * 5 + (20 - 11)) = -109
return -(map.width * relative.y + (map.width - relative.x));
}
有了方法之后,我们来修改设置坐标的属性:
/// <summary>
/// 地图网格中的位置
/// </summary>
public Vector3Int cellPosition
{
get { return m_CellPosition; }
set
{
m_CellPosition = value;
if (renderer != null)
{
renderer.sortingOrder = MapObject.CalcSortingOrder(map, value);
}
}
}