memomem

備忘録・メモ置き場

Unity CinemachinePathBase.PositionUnits.PathUnits について

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

ができる。

参考

docs.unity3d.com