鳩の溜まり場

猫か鳩になりたい

Cinemachineで引いたパスを道路のように(無理やり)可視化する【Unity】

2021年6月9日追記

mokapants.hatenablog.com

上位互換のものを作って公開しました〜

こんなことやります

SmoothPathで引いたパスに、こんな感じで自動的にオブジェクトを配置して無理やり道っぽく見せます。

若干無理やりな手法なため、推奨はしません。
無理やりでええから実装せねばならん時に使ってみてください。

環境

  • Unity - 2019.3.0f6
  • Cinemachine - 2.6.1

コード

using UnityEngine;
using Cinemachine;

public class DrawingRoute : MonoBehaviour
{
    [SerializeField] CinemachineSmoothPath smoothPath;
    [SerializeField] CinemachinePath.PositionUnits units;
    [SerializeField] GameObject cube;
    [SerializeField] uint amount;

    void Start()
    {
        // 例: 3の時にこんな感じに o------o------o 両端になるようにamount-1

        float interval = smoothPath.PathLength / (amount - 1);

        Vector3 position;
        Quaternion rotation;
        for (float pos = 0; pos <= smoothPath.PathLength; pos += interval)
        {
            position = smoothPath.EvaluatePositionAtUnit(pos, units);
            rotation = smoothPath.EvaluateOrientationAtUnit(pos, units);
            Instantiate(cube, position, rotation, transform);
        }
    }
}

SmoothPath.EvaluatePositionAtUnit

作成したパスからワールド座標を取得します。

public Vector3 EvaluatePositionAtUnit(float pos, CinemachinePathBase.PositionUnits units)
  • pos - パスの位置。ノーマライズ化はせず、0 ~ SmoothPath.PathLengthの範囲
  • units - SmoothPathの距離単位

SmoothPath.EvaluateOrientationAtUnit

作成したパスからワールドスペースのrotationを取得します。

public Quaternion EvaluateOrientationAtUnit(float pos, CinemachinePathBase.PositionUnits units)
  • pos - パスの位置。ノーマライズ化はせず、0 ~ SmoothPath.PathLengthの範囲
  • units - SmoothPathの距離単位

注意点

最初にも述べたとおり、無理やりな手法ですので、あまり推奨はしません。

こんな感じの状態になるので、重なっている部分はギラギラします。
単色ならまだしも、テクスチャとかをはっつけてあると汚くなります。

docs.unity3d.com