#if CINEMACHINE_PHYSICS using UnityEngine; using UnityEditor; using UnityEngine.UIElements; namespace Unity.Cinemachine.Editor { [CustomEditor(typeof(CinemachineConfiner3D))] [CanEditMultipleObjects] class CinemachineConfiner3DEditor : UnityEditor.Editor { public override VisualElement CreateInspectorGUI() { var ux = new VisualElement(); this.AddMissingCmCameraHelpBox(ux); var boundsHelp = ux.AddChild(new HelpBox( "Bounding Volume must be a BoxCollider, SphereCollider, CapsuleCollider, or convex MeshCollider.", HelpBoxMessageType.Warning)); var confiner = target as CinemachineConfiner3D; var volumeProp = serializedObject.FindProperty(() => confiner.BoundingVolume); InspectorUtility.AddRemainingProperties(ux, volumeProp); ux.TrackPropertyWithInitialCallback(volumeProp, (p) => { var c = p.objectReferenceValue; var mesh = c as MeshCollider; var isConvexMesh = mesh != null && mesh.convex; boundsHelp.SetVisible(!(isConvexMesh || c is BoxCollider || c is SphereCollider || c is CapsuleCollider)); }); return ux; } [DrawGizmo(GizmoType.Active | GizmoType.Selected, typeof(CinemachineConfiner3D))] private static void DrawColliderGizmos(CinemachineConfiner3D confiner, GizmoType type) { CinemachineVirtualCameraBase vcam = (confiner != null) ? confiner.ComponentOwner : null; if (vcam != null && confiner.IsValid) { var oldMatrix = Gizmos.matrix; var oldColor = Gizmos.color; Gizmos.color = Color.yellow; var t = confiner.BoundingVolume.transform; Gizmos.matrix = Matrix4x4.TRS(t.position, t.rotation, t.lossyScale); var colliderType = confiner.BoundingVolume.GetType(); if (colliderType == typeof(BoxCollider)) { var c = confiner.BoundingVolume as BoxCollider; Gizmos.DrawWireCube(c.center, c.size); } else if (colliderType == typeof(SphereCollider)) { var c = confiner.BoundingVolume as SphereCollider; Gizmos.DrawWireSphere(c.center, c.radius); } else if (colliderType == typeof(CapsuleCollider)) { var c = confiner.BoundingVolume as CapsuleCollider; var size = Vector3.one * c.radius * 2; switch (c.direction) { case 0: size.x = c.height; break; case 1: size.y = c.height; break; case 2: size.z = c.height; break; } Gizmos.DrawWireCube(c.center, size); } else if (colliderType == typeof(MeshCollider)) { var c = confiner.BoundingVolume as MeshCollider; Gizmos.DrawWireMesh(c.sharedMesh); } else { // Just draw an AABB - not very nice! Gizmos.matrix = oldMatrix; var bounds = confiner.BoundingVolume.bounds; Gizmos.DrawWireCube(t.position, bounds.extents * 2); } Gizmos.color = oldColor; Gizmos.matrix = oldMatrix; } } } } #endif