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);