CinemachineNewVirtualCameraEditor.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #if CINEMACHINE_EXPERIMENTAL_VCAM
  2. using UnityEngine;
  3. using UnityEditor;
  4. using Cinemachine.Editor;
  5. using System.Linq;
  6. namespace Cinemachine
  7. {
  8. [CustomEditor(typeof(CinemachineNewVirtualCamera))]
  9. [CanEditMultipleObjects]
  10. internal sealed class CinemachineNewVirtualCameraEditor
  11. : CinemachineVirtualCameraBaseEditor<CinemachineNewVirtualCamera>
  12. {
  13. VcamStageEditorPipeline m_PipelineSet = new VcamStageEditorPipeline();
  14. protected override void OnEnable()
  15. {
  16. base.OnEnable();
  17. Undo.undoRedoPerformed += ResetTargetOnUndo;
  18. m_PipelineSet.Initialize(
  19. // GetComponent
  20. (stage, result) =>
  21. {
  22. int numNullComponents = 0;
  23. foreach (var obj in targets)
  24. {
  25. var vcam = obj as CinemachineNewVirtualCamera;
  26. if (vcam != null)
  27. {
  28. var c = vcam.GetCinemachineComponent(stage);
  29. if (c != null)
  30. result.Add(c);
  31. else
  32. ++numNullComponents;
  33. }
  34. }
  35. return numNullComponents;
  36. },
  37. // SetComponent
  38. (stage, type) =>
  39. {
  40. Undo.SetCurrentGroupName("Cinemachine pipeline change");
  41. foreach (var obj in targets)
  42. {
  43. var vcam = obj as CinemachineNewVirtualCamera;
  44. if (vcam != null)
  45. {
  46. Component c = vcam.GetCinemachineComponent(stage);
  47. if (c != null && c.GetType() == type)
  48. continue;
  49. if (c != null)
  50. {
  51. Undo.DestroyObjectImmediate(c);
  52. vcam.InvalidateComponentCache();
  53. }
  54. if (type != null)
  55. {
  56. Undo.AddComponent(vcam.gameObject, type);
  57. vcam.InvalidateComponentCache();
  58. }
  59. }
  60. }
  61. });
  62. #if UNITY_2021_2_OR_NEWER
  63. CinemachineSceneToolUtility.RegisterTool(typeof(FoVTool));
  64. CinemachineSceneToolUtility.RegisterTool(typeof(FarNearClipTool));
  65. #endif
  66. }
  67. protected override void OnDisable()
  68. {
  69. Undo.undoRedoPerformed -= ResetTargetOnUndo;
  70. m_PipelineSet.Shutdown();
  71. base.OnDisable();
  72. #if UNITY_2021_2_OR_NEWER
  73. CinemachineSceneToolUtility.UnregisterTool(typeof(FoVTool));
  74. CinemachineSceneToolUtility.UnregisterTool(typeof(FarNearClipTool));
  75. #endif
  76. }
  77. void ResetTargetOnUndo()
  78. {
  79. ResetTarget();
  80. }
  81. public override void OnInspectorGUI()
  82. {
  83. BeginInspector();
  84. DrawHeaderInInspector();
  85. DrawPropertyInInspector(FindProperty(x => x.m_Priority));
  86. DrawTargetsInInspector(FindProperty(x => x.m_Follow), FindProperty(x => x.m_LookAt));
  87. DrawPropertyInInspector(FindProperty(x => x.m_StandbyUpdate));
  88. DrawLensSettingsInInspector(FindProperty(x => x.m_Lens));
  89. DrawRemainingPropertiesInInspector();
  90. m_PipelineSet.OnInspectorGUI(true);
  91. DrawExtensionsWidgetInInspector();
  92. }
  93. void OnSceneGUI()
  94. {
  95. m_PipelineSet.OnSceneGUI(); // call hidden editors
  96. #if UNITY_2021_2_OR_NEWER
  97. DrawSceneTools();
  98. #endif
  99. }
  100. #if UNITY_2021_2_OR_NEWER
  101. void DrawSceneTools()
  102. {
  103. var vcam = Target;
  104. if (vcam == null || !vcam.IsValid || vcam.m_ExcludedPropertiesInInspector.Contains("m_Lens"))
  105. {
  106. return;
  107. }
  108. var originalColor = Handles.color;
  109. Handles.color = Handles.preselectionColor;
  110. if (CinemachineSceneToolUtility.IsToolActive(typeof(FoVTool)))
  111. {
  112. CinemachineSceneToolHelpers.FovToolHandle(vcam,
  113. new SerializedObject(vcam).FindProperty(() => vcam.m_Lens),
  114. vcam.m_Lens, IsHorizontalFOVUsed());
  115. }
  116. else if (CinemachineSceneToolUtility.IsToolActive(typeof(FarNearClipTool)))
  117. {
  118. CinemachineSceneToolHelpers.NearFarClipHandle(vcam,
  119. new SerializedObject(vcam).FindProperty(() => vcam.m_Lens));
  120. }
  121. Handles.color = originalColor;
  122. }
  123. #endif
  124. }
  125. }
  126. #endif