Skip to content

导航

GetNavPath

客户端

method in mod.client.extraClientApi

  • 描述

    获取本地玩家到目标点的寻路路径,开发者可以通过该接口定制自定义的导航系统。

  • 参数

    参数名
    数据类型
    说明
    postuple(float,float,float)目标点的坐标
    maxTrimNodeint对搜索路径进行平滑时的最大尝试格数。设置的太大会影响寻路性能。默认值16
    maxIterationintA星寻路的最大迭代次数。默认值800
    isSwimmerbool目标点是否在水中。默认为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的导航系统实现,做法是在路径上生成序列帧以引导玩家通向目标点,并且当玩家偏离路径会重新进行导航。

  • 参数

    参数名
    数据类型
    说明
    postuple(float,float,float)目标点的坐标
    sfxPathstr构成导航路径的序列帧素材路径。样式可以参考指向上的箭头
    callbackfunction玩家抵达终点时会调用的回调函数。该函数需要接受一个bool参数。
    sfxIntlfloat相邻两个序列帧之间的间隔。默认值2
    sfxMaxNumint同时存在的序列帧的最大个数。默认值16
    sfxScaletuple(float,float)序列帧的宽度及高度的缩放。默认为(0.5,0.5)
    maxIterationintA星寻路的最大迭代次数。默认值800
    isSwimmerbool目标点是否在水中。默认为False
    fpsint序列帧帧率,默认为20,不建议超过30
    playIntlint一轮中相邻序列帧开始播放的间隔,默认为8帧,不得小于0,否则将使用默认值
    durationint单个序列帧持续播放帧数,默认为60帧,不小于10,否则将使用默认值
    oneTurnDurationint两轮序列帧之间的播放间隔(帧),默认值为90帧,至少为duration的1.5倍,否则将以1.5 * duration进行计算
    sfxDepthTestbool序列帧是否开启深度检测,默认为False,设为True时序列帧会被场景遮挡
  • 返回值

    数据类型
    说明
    int返回0:导航正常开始
    返回-1:本地玩家离地太远,或者被堵住无法行动
    返回1:参数错误
    返回2:玩家所在chunk未加载完毕
    返回3:终点为实心方块,无法寻路
  • 备注

    • 寻路算法迭代一定次数后(即maxIteration的数值),如果未寻到目标点,接口会返回局部最优解,即当前搜索到的点的集合中,离设置目标点最近的点的路径,但是这条路径可能是不准确或错误的(例如往终点的方向是死胡同的情况)。
      出现这种可能的情况包括:目标点无法抵达(被围住等),目标点所在chunk未加载,目标点较远(但是仍在区块加载范围内)或地形较复杂(例如与终点间有很长一面墙)。
    • 上述情况中,目标点较远或地形较复杂的情况可以通过增大maxIteration的数值避免,但是这样同时也会增加客户端的卡顿。
    • 如果终点在水里需要将isSwimmer参数设为True,但如果只是路途中会经过水域是不需要的。但需要注意在水中的寻路性能非常低下,其他参数不变时,单次寻路计算出的最大路径长度会小很多。
    • callback函数接受一个bool参数。当参数为True时,表示玩家到达目标点附近,但不代表导航结束,如果玩家又离开目标点,导航系统会再次尝试导航,开发者需要在某个时机手动调用停止导航(参考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

StopNav

客户端

method in mod.client.extraClientApi

  • 描述

    终止当前的导航

  • 参数

  • 返回值