【Unity】【エディタ】カプセル型のGizmoを描画する

f:id:halya_11:20180810194653p:plain

カプセル型のGizmoを描画する方法です。

方針

Unityの標準ではカプセル型のGizmoが存在しません。
また半球型のGizmoもないため、きちんとカプセル型を描画しようとすると面倒です。

なので今回は若干手抜きですが、Gizmos.DrawWireSphere()とGizmos.DrawLine()を組み合わせて描きます。
若干見づらいですが、Gizmoの用途を考えれば大体のケースで十分かと思います。

ソースコード

それではソースコードです。

public void DrawCapsuleGizmo(Vector3 start, Vector3 end, float radius)
{
    var preMatrix = Gizmos.matrix;

    // カプセル空間((0, 0)からZ軸方向にカプセルが伸びる空間)からワールド座標系への変換行列
    Gizmos.matrix   = Matrix4x4.TRS(start, Quaternion.FromToRotation(Vector3.forward, end), Vector3.one);

    // 球体を描画
    var distance = (end - start).magnitude;
    var capsuleStart    = Vector3.zero;
    var capsuleEnd      = Vector3.forward * distance;
    Gizmos.DrawWireSphere(capsuleStart, radius);
    Gizmos.DrawWireSphere(capsuleEnd, radius);
            
    // ラインを描画
    var offsets = new Vector3[]{ new Vector3(-1.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f), new Vector3(1.0f, 0.0f, 0.0f), new Vector3(0.0f, -1.0f, 0.0f) };
    for (int i = 0; i < offsets.Length; i++) {
        Gizmos.DrawLine(capsuleStart + offsets[i] * radius, capsuleEnd + offsets[i] * radius);
    }

    Gizmos.matrix       = preMatrix;
}

カプセルを構成する二つの半球の中心点のワールド座標と、半球の半径を与えることでGizmoが描画されます。

結果

上のメソッドを実行した結果は次のようになります。

f:id:halya_11:20180810194653p:plain

カプセル型のGizmoが描画されました。