--- sidebarDepth: 1 --- # 导航 ## GetNavPath 客户端 method in mod.client.extraClientApi - 描述 获取本地玩家到目标点的寻路路径,开发者可以通过该接口定制自定义的导航系统。 - 参数 | 参数名 |
数据类型
| 说明 | | :--- | :--- | :--- | | pos | tuple(float,float,float) | 目标点的坐标 | | maxTrimNode | int | 对搜索路径进行平滑时的最大尝试格数。设置的太大会影响寻路性能。默认值16 | | maxIteration | int | A星寻路的最大迭代次数。默认值800 | | isSwimmer | bool | 目标点是否在水中。默认为False | - 返回值 |
数据类型
| 说明 | | :--- | :--- | | int或list(tuple(float,float,float)) | 返回1:参数错误
返回2:玩家所在chunk未加载完毕
返回3:终点为实心方块,无法寻路
返回list(tuple(float,float,float),):从起点到终点的坐标点列表。注意该list可能为空,表示本地玩家离地太远,或者被堵住无法行动。 | - 备注 - 寻路算法迭代一定次数后(即maxIteration的数值),如果未寻到目标点,接口会返回**局部最优解**,即当前搜索到的点的集合中,离设置目标点最近的点的路径,但是这条路径可能是不准确或错误的(例如往终点的方向是死胡同的情况)。
出现这种可能的情况包括:目标点无法抵达(被围住等),目标点所在chunk未加载,目标点较远(但是仍在区块加载范围内)或地形较复杂(例如与终点间有很长一面墙)。 - 上述情况中,目标点较远或地形较复杂的情况可以通过增大maxIteration的数值避免,但是这样同时也会增加客户端的卡顿。 - 如果终点在水里需要将isSwimmer参数设为True,但如果只是路途中会经过水域是不需要的。但需要注意在水中的寻路性能非常低下,其他参数不变时,单次寻路计算出的最大路径长度会小很多。 ## StartNavTo 客户端 method in mod.client.extraClientApi - 描述 我们提供了一个基于GetNavPath的导航系统实现,做法是在路径上生成序列帧以引导玩家通向目标点,并且当玩家偏离路径会重新进行导航。 - 参数 | 参数名 |
数据类型
| 说明 | | :--- | :--- | :--- | | pos | tuple(float,float,float) | 目标点的坐标 | | sfxPath | str | 构成导航路径的序列帧素材路径。样式可以参考指向上的箭头 | | callback | function | 玩家抵达终点时会调用的**回调函数**。该函数需要接受一个bool参数。 | | sfxIntl | float | 相邻两个序列帧之间的间隔。默认值2 | | sfxMaxNum | int | 同时存在的序列帧的最大个数。默认值16 | | sfxScale | tuple(float,float) | 序列帧的宽度及高度的缩放。默认为(0.5,0.5) | | maxIteration | int | A星寻路的最大迭代次数。默认值800 | | isSwimmer | bool | 目标点是否在水中。默认为False | | fps | int | 序列帧帧率,默认为20,不建议超过30 | | playIntl | int | 一轮中相邻序列帧开始播放的间隔,默认为8帧,不得小于0,否则将使用默认值 | | duration | int | 单个序列帧持续播放帧数,默认为60帧,不小于10,否则将使用默认值 | | oneTurnDuration | int | 两轮序列帧之间的播放间隔(帧),默认值为90帧,至少为duration的1.5倍,否则将以1.5 * duration进行计算 | | sfxDepthTest | bool | 序列帧是否开启深度检测,默认为False,设为True时序列帧会被场景遮挡 | - 返回值 |
数据类型
| 说明 | | :--- | :--- | | int | 返回0:导航正常开始
返回-1:本地玩家离地太远,或者被堵住无法行动
返回1:参数错误
返回2:玩家所在chunk未加载完毕
返回3:终点为实心方块,无法寻路 | - 备注 - 寻路算法迭代一定次数后(即maxIteration的数值),如果未寻到目标点,接口会返回**局部最优解**,即当前搜索到的点的集合中,离设置目标点最近的点的路径,但是这条路径可能是不准确或错误的(例如往终点的方向是死胡同的情况)。
出现这种可能的情况包括:目标点无法抵达(被围住等),目标点所在chunk未加载,目标点较远(但是仍在区块加载范围内)或地形较复杂(例如与终点间有很长一面墙)。 - 上述情况中,目标点较远或地形较复杂的情况可以通过增大maxIteration的数值避免,但是这样同时也会增加客户端的卡顿。 - 如果终点在水里需要将isSwimmer参数设为True,但如果只是路途中会经过水域是不需要的。但需要注意在水中的寻路性能非常低下,其他参数不变时,单次寻路计算出的最大路径长度会小很多。 - callback函数接受一个bool参数。当参数为True时,表示玩家到达目标点附近,但不代表导航结束,如果玩家又离开目标点,导航系统会再次尝试导航,开发者需要在某个时机手动调用停止导航(参考[StopNav接口](导航.md#StopNav))。当参数为False时,表示玩家偏离航线并到了某个无法到达目标点的状态(即返回值不为0的那些情况),这种情况导航会自动终止。 ```python # 一个到达终点时停止导航的callback函数示例 from mod_log import logger as logger def myCallback(result): if result: extraClientApi.StopNav() else: logger.info('something happened in navigation') # 若目标点很远,需要进行分段导航的callback函数示例 def myCallback2(result): if result: if GetDistence(localplayerPos, destinationPos) < sfxIntl*2: extraClientApi.StopNav() else: extraClientApi.StartNavTo(destinationPos, ...) else: logger.info('something happened in navigation') ``` - 如果上一次导航没结束时再次调用会覆盖之前的导航 - 使用默认参数的导航效果示例:
![avatar](../../picture/startNavTo.png) ## StopNav 客户端 method in mod.client.extraClientApi - 描述 终止当前的导航 - 参数 无 - 返回值 无