#if (UNITY_EDITOR) using UnityEngine; using UnityEditor; using System.Collections.Generic; namespace ECE { public static class EasyColliderDraw { /// /// Draws a box /// /// Transform of the box /// Center of the box in local space /// Half the size of the box /// Color of lines used to draw the box private static void DrawBox(Transform transform, Vector3 center, Vector3 halfSize, Color color) { Vector3 p1 = transform.TransformPoint(center + halfSize); Vector3 p2 = transform.TransformPoint(center - halfSize); Vector3 p3 = transform.TransformPoint(center + new Vector3(halfSize.x, halfSize.y, -halfSize.z)); Vector3 p4 = transform.TransformPoint(center + new Vector3(halfSize.x, -halfSize.y, halfSize.z)); Vector3 p5 = transform.TransformPoint(center + new Vector3(halfSize.x, -halfSize.y, -halfSize.z)); Vector3 p6 = transform.TransformPoint(center + new Vector3(-halfSize.x, halfSize.y, halfSize.z)); Vector3 p7 = transform.TransformPoint(center + new Vector3(-halfSize.x, -halfSize.y, halfSize.z)); Vector3 p8 = transform.TransformPoint(center + new Vector3(-halfSize.x, halfSize.y, -halfSize.z)); Handles.color = color; Handles.DrawLine(p1, p3); Handles.DrawLine(p1, p4); Handles.DrawLine(p1, p6); Handles.DrawLine(p8, p3); Handles.DrawLine(p8, p6); Handles.DrawLine(p8, p2); Handles.DrawLine(p7, p6); Handles.DrawLine(p7, p2); Handles.DrawLine(p7, p4); Handles.DrawLine(p5, p4); Handles.DrawLine(p5, p2); Handles.DrawLine(p5, p3); } /// /// Draws a box collider /// /// Box collider to draw /// Color of lines used to draw private static void DrawBoxCollider(BoxCollider boxCollider, Color color) { DrawBox(boxCollider.transform, boxCollider.center, boxCollider.size / 2, color); } private static EasyColliderPreviewer previewer; public static EasyColliderPreviewer Previewer { get { if (previewer == null) { previewer = ScriptableObject.CreateInstance(); } return previewer; } } /// /// Draws a capsule collider /// /// Capsule collider to draw /// Color of lines to draw private static void DrawCapsuleCollider(CapsuleCollider capsuleCollider, Color color) { CapsuleColliderData data = new CapsuleColliderData(); data.ColliderType = CREATE_COLLIDER_TYPE.CAPSULE; data.Height = capsuleCollider.height; data.Radius = capsuleCollider.radius; data.Center = capsuleCollider.center; data.Direction = capsuleCollider.direction; data.Matrix = capsuleCollider.transform.localToWorldMatrix; Previewer.DrawCapsuleCollider(data, color); return; } /// /// Draws a primitive collider (box, sphere, capsule) using lines. /// /// Collider to draw /// Color of lines to draw with public static void DrawCollider(Collider collider, Color color) { if (collider == null) return; if (collider is BoxCollider) { DrawBoxCollider(collider as BoxCollider, color); } else if (collider is SphereCollider) { DrawSphereCollider(collider as SphereCollider, color); } else if (collider is CapsuleCollider) { DrawCapsuleCollider(collider as CapsuleCollider, color); } else if (collider is MeshCollider) { DrawMeshCollider(collider as MeshCollider, color); } } /// /// Shader used to draw mesh colliders. /// static Shader MeshColliderShader; /// /// Draws a mesh collider by drawing lines connecting it's meshs vertices. /// /// Mesh Collider /// Color to draw lines with private static void DrawMeshCollider(MeshCollider collider, Color color) { // try to find mesh collider. if (MeshColliderShader == null) { MeshColliderShader = Shader.Find("Custom/EasyColliderMeshColliderPreview"); } // if we have the shader, draw it using the wireframe and the color if (MeshColliderShader != null) { Material wireMat = new Material(MeshColliderShader); wireMat.SetColor("_Color", color); wireMat.SetPass(0); GL.wireframe = true; Graphics.DrawMeshNow(collider.sharedMesh, collider.transform.localToWorldMatrix); GL.wireframe = false; } else { // no shader? fall back to old draw box method. DrawBox(collider.transform, collider.transform.InverseTransformPoint(collider.bounds.center), collider.transform.InverseTransformVector(collider.bounds.extents), color); } } // Draws a sphere collider, taken from previous version /// /// Draws a sphere collider. /// /// Sphere collider to draw /// Color of lines used to draw private static void DrawSphereCollider(SphereCollider sphereCollider, Color color) { SphereColliderData data = new SphereColliderData(); data.ColliderType = CREATE_COLLIDER_TYPE.SPHERE; data.Center = sphereCollider.center; data.Radius = sphereCollider.radius; data.Matrix = sphereCollider.transform.localToWorldMatrix; Previewer.DrawSphereCollider(data, color); } } } #endif