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);
浙公网安备 33010602011771号