UnityのHandlesクラスの拡張

Unityで幾何学アルゴリズムを実装するときに、イメージがしやすいようにHanldesクラスを拡張してデバッグ描画できるようにしました。
以下のようなコードを書くと追加されたDrawerの順に描画されていきます。

var drawer = new Drawer();
var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
var mesh = cube.GetComponent<MeshFilter>().sharedMesh;

for (int i = 0; i < mesh.triangles.Length;)
{
    var a = mesh.vertices[mesh.triangles[i++]];
    var b = mesh.vertices[mesh.triangles[i++]];
    var c = mesh.vertices[mesh.triangles[i++]];

    var triangleProp = new TriangleDrawProperty()
    {
        VertexA = a,
        VertexB = b,
        VertexC = c,
        VertexAColor = Color.cyan,
        VertexBColor = Color.cyan,
        VertexCColor = Color.cyan,
        EdgeABColor = Color.green,
        EdgeBCColor = Color.green,
        EdgeCAColor = Color.green,
    };

    var triangleDrawer = new TriangleDrawer(triangleProp);

    drawer.Drawers.Add(triangleDrawer);
}

DrawerManager.Instance.AddDrawer("cube", drawer);
GameObject.DestroyImmediate(cube);



特定の箇所だけ一気に描画できるようにしました。

triangleDrawer.BatchDraw = true;

とるすと一個の三角形を一気に描画します。


drawer.BatchDraw = true;

とするとすべての三角形を一気に描画します。



動画の円を描いている部分は以下のコードです。

var circlesDrawer = new Drawer();
for (int i = 0; i <= 36; i++)
{
    var circleDrawerProp = new CircleDrawProperty();
    circleDrawerProp.Center = UnityEngine.Vector3.zero;
    circleDrawerProp.Angle = 10 * i;
    circleDrawerProp.Color = Color.yellow;
    var d = i / 70f;
    circleDrawerProp.From = new Vector3(0.1f + d, 0.1f + d, 0.1f + d);
    circleDrawerProp.Radius = Vector3.Distance(circleDrawerProp.Center, circleDrawerProp.From);
    var vec1 = circleDrawerProp.From - circleDrawerProp.Center;
    var vec2 = new Vector3(-0.1f - d, -0.1f - d, 0.0f) - circleDrawerProp.Center;
    var normal = Vector3.Cross(vec1, vec2).normalized;
    circleDrawerProp.Normal = normal;
    var circleDrawer = new CircleDrawer(circleDrawerProp);
    circlesDrawer.Drawers.Add(circleDrawer);
}

DrawerManager.Instance.AddDrawer("circle", circlesDrawer);


unity debug draw



もうすこし機能を追加して公開したいと思います。