CinemachineColliderEditor.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #if !UNITY_2019_3_OR_NEWER
  2. #define CINEMACHINE_PHYSICS
  3. #define CINEMACHINE_PHYSICS_2D
  4. #endif
  5. using UnityEngine;
  6. using UnityEditor;
  7. using System.Collections.Generic;
  8. namespace Cinemachine.Editor
  9. {
  10. #if CINEMACHINE_PHYSICS
  11. [CustomEditor(typeof(CinemachineCollider))]
  12. [CanEditMultipleObjects]
  13. internal sealed class CinemachineColliderEditor : BaseEditor<CinemachineCollider>
  14. {
  15. /// <summary>Get the property names to exclude in the inspector.</summary>
  16. /// <param name="excluded">Add the names to this list</param>
  17. protected override void GetExcludedPropertiesInInspector(List<string> excluded)
  18. {
  19. base.GetExcludedPropertiesInInspector(excluded);
  20. if (!Target.m_AvoidObstacles)
  21. {
  22. excluded.Add(FieldPath(x => x.m_DistanceLimit));
  23. excluded.Add(FieldPath(x => x.m_CameraRadius));
  24. excluded.Add(FieldPath(x => x.m_Strategy));
  25. excluded.Add(FieldPath(x => x.m_MaximumEffort));
  26. excluded.Add(FieldPath(x => x.m_Damping));
  27. excluded.Add(FieldPath(x => x.m_DampingWhenOccluded));
  28. excluded.Add(FieldPath(x => x.m_SmoothingTime));
  29. }
  30. else if (Target.m_Strategy == CinemachineCollider.ResolutionStrategy.PullCameraForward)
  31. {
  32. excluded.Add(FieldPath(x => x.m_MaximumEffort));
  33. }
  34. }
  35. public override void OnInspectorGUI()
  36. {
  37. BeginInspector();
  38. if (Target.m_AvoidObstacles && Target.VirtualCamera != null
  39. && !Target.VirtualCamera.State.HasLookAt)
  40. EditorGUILayout.HelpBox(
  41. "Avoid Obstacles requires a LookAt target.",
  42. MessageType.Warning);
  43. DrawRemainingPropertiesInInspector();
  44. }
  45. [DrawGizmo(GizmoType.Active | GizmoType.Selected, typeof(CinemachineCollider))]
  46. private static void DrawColliderGizmos(CinemachineCollider collider, GizmoType type)
  47. {
  48. CinemachineVirtualCameraBase vcam = (collider != null) ? collider.VirtualCamera : null;
  49. if (vcam != null && collider.enabled)
  50. {
  51. Color oldColor = Gizmos.color;
  52. Vector3 pos = vcam.State.FinalPosition;
  53. if (collider.m_AvoidObstacles && vcam.State.HasLookAt)
  54. {
  55. Gizmos.color = CinemachineColliderPrefs.FeelerColor;
  56. if (collider.m_CameraRadius > 0)
  57. Gizmos.DrawWireSphere(pos, collider.m_CameraRadius);
  58. Vector3 forwardFeelerVector = (vcam.State.ReferenceLookAt - pos).normalized;
  59. float distance = collider.m_DistanceLimit;
  60. Gizmos.DrawLine(pos, pos + forwardFeelerVector * distance);
  61. // Show the avoidance path, for debugging
  62. List<List<Vector3>> debugPaths = collider.DebugPaths;
  63. foreach (var path in debugPaths)
  64. {
  65. Gizmos.color = CinemachineColliderPrefs.FeelerHitColor;
  66. Vector3 p0 = vcam.State.ReferenceLookAt;
  67. foreach (var p in path)
  68. {
  69. Gizmos.DrawLine(p0, p);
  70. p0 = p;
  71. }
  72. Gizmos.DrawLine(p0, pos);
  73. }
  74. }
  75. Gizmos.color = oldColor;
  76. }
  77. }
  78. }
  79. #endif
  80. }