CinemachineComposerEditor.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. using UnityEngine;
  2. using UnityEditor;
  3. using Cinemachine.Utility;
  4. namespace Cinemachine.Editor
  5. {
  6. [CustomEditor(typeof(CinemachineComposer))]
  7. [CanEditMultipleObjects]
  8. internal class CinemachineComposerEditor : BaseEditor<CinemachineComposer>
  9. {
  10. CinemachineScreenComposerGuides m_ScreenGuideEditor;
  11. GameViewEventCatcher m_GameViewEventCatcher;
  12. protected virtual void OnEnable()
  13. {
  14. m_ScreenGuideEditor = new CinemachineScreenComposerGuides();
  15. m_ScreenGuideEditor.GetHardGuide = () => { return Target.HardGuideRect; };
  16. m_ScreenGuideEditor.GetSoftGuide = () => { return Target.SoftGuideRect; };
  17. m_ScreenGuideEditor.SetHardGuide = (Rect r) => { Target.HardGuideRect = r; };
  18. m_ScreenGuideEditor.SetSoftGuide = (Rect r) => { Target.SoftGuideRect = r; };
  19. m_ScreenGuideEditor.Target = () => { return serializedObject; };
  20. m_GameViewEventCatcher = new GameViewEventCatcher();
  21. m_GameViewEventCatcher.OnEnable();
  22. CinemachineDebug.OnGUIHandlers -= OnGUI;
  23. CinemachineDebug.OnGUIHandlers += OnGUI;
  24. if (CinemachineSettings.CinemachineCoreSettings.ShowInGameGuides)
  25. InspectorUtility.RepaintGameView();
  26. #if UNITY_2021_2_OR_NEWER
  27. CinemachineSceneToolUtility.RegisterTool(typeof(TrackedObjectOffsetTool));
  28. #endif
  29. }
  30. protected virtual void OnDisable()
  31. {
  32. m_GameViewEventCatcher.OnDisable();
  33. CinemachineDebug.OnGUIHandlers -= OnGUI;
  34. if (CinemachineSettings.CinemachineCoreSettings.ShowInGameGuides)
  35. InspectorUtility.RepaintGameView();
  36. #if UNITY_2021_2_OR_NEWER
  37. CinemachineSceneToolUtility.UnregisterTool(typeof(TrackedObjectOffsetTool));
  38. #endif
  39. }
  40. public override void OnInspectorGUI()
  41. {
  42. BeginInspector();
  43. bool needWarning = false;
  44. for (int i = 0; !needWarning && i < targets.Length; ++i)
  45. needWarning = (targets[i] as CinemachineComposer).LookAtTarget == null;
  46. if (needWarning)
  47. EditorGUILayout.HelpBox(
  48. "A LookAt target is required. Change Aim to Do Nothing if you don't want a LookAt target.",
  49. MessageType.Warning);
  50. // First snapshot some settings
  51. Rect oldHard = Target.HardGuideRect;
  52. Rect oldSoft = Target.SoftGuideRect;
  53. // Draw the properties
  54. DrawRemainingPropertiesInInspector();
  55. m_ScreenGuideEditor.SetNewBounds(oldHard, oldSoft, Target.HardGuideRect, Target.SoftGuideRect);
  56. }
  57. protected virtual void OnGUI()
  58. {
  59. // Draw the camera guides
  60. if (Target == null || !CinemachineSettings.CinemachineCoreSettings.ShowInGameGuides)
  61. return;
  62. // If inspector is collapsed in the vcam editor, don't draw the guides
  63. if (!VcamStageEditor.ActiveEditorRegistry.IsActiveEditor(this))
  64. return;
  65. // Don't draw the guides if rendering to texture
  66. var vcam = Target.VirtualCamera;
  67. CinemachineBrain brain = CinemachineCore.Instance.FindPotentialTargetBrain(vcam);
  68. if (brain == null || (brain.OutputCamera.activeTexture != null && CinemachineCore.Instance.BrainCount > 1))
  69. return;
  70. // Screen guides
  71. bool isLive = targets.Length <= 1 && brain.IsLive(vcam, true);
  72. m_ScreenGuideEditor.OnGUI_DrawGuides(isLive, brain.OutputCamera, Target.VcamState.Lens, true);
  73. // Draw an on-screen gizmo for the target
  74. if (Target.LookAtTarget != null && isLive)
  75. {
  76. Vector3 targetScreenPosition = brain.OutputCamera.WorldToScreenPoint(Target.TrackedPoint);
  77. if (targetScreenPosition.z > 0)
  78. {
  79. targetScreenPosition.y = Screen.height - targetScreenPosition.y;
  80. GUI.color = CinemachineSettings.ComposerSettings.TargetColour;
  81. Rect r = new Rect(targetScreenPosition, Vector2.zero);
  82. float size = (CinemachineSettings.ComposerSettings.TargetSize
  83. + CinemachineScreenComposerGuides.kGuideBarWidthPx) / 2;
  84. GUI.DrawTexture(r.Inflated(new Vector2(size, size)), Texture2D.whiteTexture);
  85. size -= CinemachineScreenComposerGuides.kGuideBarWidthPx;
  86. if (size > 0)
  87. {
  88. Vector4 overlayOpacityScalar
  89. = new Vector4(1f, 1f, 1f, CinemachineSettings.ComposerSettings.OverlayOpacity);
  90. GUI.color = Color.black * overlayOpacityScalar;
  91. GUI.DrawTexture(r.Inflated(new Vector2(size, size)), Texture2D.whiteTexture);
  92. }
  93. }
  94. }
  95. }
  96. #if UNITY_2021_2_OR_NEWER
  97. void OnSceneGUI()
  98. {
  99. DrawSceneTools();
  100. }
  101. void DrawSceneTools()
  102. {
  103. var composer = Target;
  104. if (composer == null || !composer.IsValid)
  105. {
  106. return;
  107. }
  108. if (CinemachineSceneToolUtility.IsToolActive(typeof(TrackedObjectOffsetTool)))
  109. {
  110. CinemachineSceneToolHelpers.TrackedObjectOffsetTool(composer,
  111. new SerializedObject(composer).FindProperty(() => composer.m_TrackedObjectOffset));
  112. }
  113. }
  114. #endif
  115. #if false
  116. // debugging only
  117. [DrawGizmo(GizmoType.Active | GizmoType.Selected, typeof(CinemachineComposer))]
  118. static void DrawComposerGizmos(CinemachineComposer target, GizmoType selectionType)
  119. {
  120. // Draw lookahead path
  121. if (target.m_LookaheadTime > 0)
  122. {
  123. Color originalGizmoColour = Gizmos.color;
  124. Gizmos.color = CinemachineSettings.ComposerSettings.TargetColour;
  125. var p0 = target.m_Predictor.PredictPosition(0);
  126. int numSteps = 20;
  127. for (int i = 1; i <= numSteps; ++i)
  128. {
  129. var p1 = target.m_Predictor.PredictPosition(i * target.m_LookaheadTime / numSteps);
  130. Gizmos.DrawLine(p0, p1);
  131. p0 = p1;
  132. }
  133. Gizmos.color = originalGizmoColour;
  134. }
  135. }
  136. #endif
  137. }
  138. }