这里用master版本的寻路来学习一下ET的服务端,ET的寻路部分是放在服务端计算的,然后将路径的点集发送到客户端,有客户端具体执行移动命令。
在此之前,先来看看ET客户端的关于寻路部分的demo。
-
UnitPathComponent组件
该组件是执行寻路移动的核心组件之一。 该组件没有接通事件系统。StartMove(M2C_PathfindingResult message)方法会从message消息中获取到移动路径点集和一个ServerPos变量(寻路移动的起点)。然后调用StartMove(CancellationToken cancellationToken)方法,该方法会根据ServerPos和客户端角色的移动起始位置进行移动速度矫正,该矫正速度仅用于移动到第一个位点。在移动的过程中,调用TurnComponent组件的Turn方法用于转弯,MoveComponent组件的MoveToAsync方法用于实施移动。
-
TurnComponent组件
该组件用于转向,接通了Update事件, 在Update方法中,利用Quaternion.Slerp方法对方向进行调整
-
MoveComponent组件
该组件也接通了Update事件。 在Update方法中,利用Vector3.Lerp方法对位置进行调整。
UnitPathComponent组件的是通过事件系统调用的,如图所示:
对于该事件的具体讲解可以参考文章《ET框架学习——OpcodeTypeComponent组件和MessageDispatherComponent组件》。可以看到,该类继承了AMHandler抽象类,进而实现了IMHandler接口。MessageDispatcherComponent组件会收集持有MessageHandler特性的类,然后按照泛型Message(消息的类型)的类型进行分类存放。最后在收到相应的消息的时候,就可以通过消息类型追溯到指定的类,执行Run方法。
到这里,客户端的寻路部分就结束了。
服务端的寻路组件是PathfindingComponent
-
PathfindingComponent组件
PathfindingComponent组件接通了Awake事件,在Awake方法中做了一些初始化的操作,包括读取配置,读取地图等操作。
AStarConfig组件用于保存一些寻路配置相关的数据。地图数据解析完成后也是存放在AStarConfig组件中的。解析地图使用的是A*插件自带的解析器AstarSerializer,读取数据后会返回NavGraph数据,该数组用于保存地图数据。组件内部有一个Search方法,应该是搜索附近节点的办法。
public bool Search(ABPathWrap path)
{
this.PathProcessor.queue.Push(path.Path);
while (this.PathProcessor.CalculatePaths().MoveNext())
{
if (path.Path.CompleteState != PathCompleteState.NotCalculated)
{
break;
}
}
if (path.Path.CompleteState != PathCompleteState.Complete)
{
return false;
}
PathModifyHelper.StartEndModify(path.Path);
PathModifyHelper.FunnelModify(path.Path);
return true;
}
参数ABPathWrap组件用于保存寻路路径。ABPath.Construct方法接受起止点两个参数,创建一个ABPath对象,并设置路径的起
止点。CalculatePaths()方法应该是寻路的核心方法之一。
汗。。。。。并没有找到什么实质性的关于寻路的代码。。。