kingBook

导航

CinemachinePath

CinemachinePathBase:

  • public float FindClosestPoint (Vector3 p, int startSegment, int searchRadius, int stepsPerSegment);
    (en) 找到路径上距离目标点(世界坐标系)最近的点。

    • p: 目标点(世界坐标系)
    • startSegment: 在哪一路段开始搜索。路段指两个 waypoint 之间的一段路径
    • searchRadius: 参数startSegment两侧要搜索的段数-1表示没有限制,即搜索整个路径
    • stepsPerSegment: 将一路段分割成许多直线来搜索它。数字越高,结果越准确,但数字越大,性能也相应地越慢
    • 返回值: 路径上最接近目标点的位置,以 PositionUnits.PathUnits 为单位, 非 PositionUnits.Distance
  • public Vector3 EvaluatePositionAtUnit(float pos, CinemachinePathBase.PositionUnits units);
    (en) 获取路径上某点的世界坐标系位置

    • pos: 沿着路径的位置,不需要标准化
    • units: 参数pos使用的单位
  • public float FromPathNativeUnits(float pos, CinemachinePathBase.PositionUnits units);
    (en) 将路径位置从 PositionUnits.PathUnits 转换为所需单位。如果距离缓存无效,则调用此命令将触发路径距离缓存的潜在代价高昂的重新生成

    • pos: 需要转换的 PositionUnits.PathUnits
    • units: 目标单位 PositionUnits

Enum CinemachinePathBase.PositionUnits:
各单位的取值范围为:循环路径[0, path.MaxUnit(uint)]不循环路径[0, path.MaxUnit(uint))

  • Distance: 沿着路径的距离。
  • Normalized: 标准化单位,0是路径的起点,1是终点。
  • PathUnits: 0为第一个航路点,0.5为第一与第二个航路点的中间,1为第二个航路点,以此类推。

例:查找 CinemachinePath 路径上距离玩家最近的点

float playerPosUnits = path.FindClosestPoint(player.position,0,-1,0);
Debug.Log($"playerPosUnits:{playerPosUnits}");
Vector3 playerPosOnPath = smoothPath.EvaluatePosition(playerPosUnits); // 玩家在路径上的世界坐标

例:单位转换

  • 由 PathUnits 到其他单位
float pathUnitsValue;
CinemachineUtil.GetClosestPointOnPath(path, transform.position, out pathUnitsValue);

float distanceUnitsValue = path.FromPathNativeUnits(pathUnitsValue, PositionUnits.Distance);

float normalizedUnitsValue = path.FromPathNativeUnits(pathUnitsValue, PositionUnits.Normalized);
  • 由其他单位到 PathUnits
float pathUnitsValue = path.ToNativePathUnits(distance, PositionUnits.Distance);
float pathUnitsValue = path.ToNativePathUnits(normalized, PositionUnits.Normalized);

posted on 2022-02-23 17:49  kingBook  阅读(384)  评论(0编辑  收藏  举报