CinemachinePathBase.PositionUnits.PathUnits がイマイチわかりにくくて忘れるのでメモ
パス上の座標取得
パス上のポイント座標を取得する方法として
cinemachinePath.EvaluatePositionAtUnit(float pos, PositionUnits units);
がある
// posはパス上の距離を指定する cinemachinePath.EvaluatePositionAtUnit(pos, PositionUnits.Distance); // posはパス上のNormalizedされた値を指定する。0であれば始点、1であれば終点、0.5であれば中間点 cinemachinePath.EvaluatePositionAtUnit(pos, PositionUnits.Normalized); // posはパス上のPathUnitsを指定する。 cinemachinePath.EvaluatePositionAtUnit(pos, PositionUnits.PathUnits);
PositionUnits.PathUnits
PositionUnits.PathUnitsは、パスを設定したWaypointsと関係する。
Waypointsが3つの時、
- 0番目と1番目の位置の中間は0.5
- 1番目と2番目の位置の中間は1.5
- 終点は3.0
となる。
任意の座標に最も近いパス上の位置取得
ワールド座標から最も近いパス上の位置を取得する方法として
float v = cinemachinePath.FindClosestPoint(Vector3 p, int startSegment, int searchRadius, int stepsPerSegment);
がある。(searchRadius: -1 でパス全体から捜査)
この関数は PositionUnits.PathUnits を返す。
これを利用し
// pos に最も近いパス上の座標取得 public Vector3 CalcClosestPointFrom(Vector3 pos) { float v = cinemachinePath.FindClosestPoint(pos, 0, -1, 20); return cinemachinePath.EvaluatePositionAtUnit(v, CinemachinePathBase.PositionUnits.PathUnits); } // pos に最も近いパス上のNormalizeされた値(パス全体の進捗)取得 public float CalcClosestProgressFrom(Vector3 pos) { float v = cinemachinePath.FindClosestPoint(pos, 0, -1, 20); return cinemachinePath.FromPathNativeUnits(v, CinemachinePathBase.PositionUnits.Normalized); }
ができる。