119 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| #if CINEMACHINE_EXPERIMENTAL_VCAM
 | |
| using UnityEngine;
 | |
| using UnityEditor;
 | |
| using Cinemachine.Editor;
 | |
| using Cinemachine.Utility;
 | |
| 
 | |
| namespace Cinemachine
 | |
| {
 | |
|     [CustomEditor(typeof(CinemachineNewVirtualCamera))]
 | |
|     [CanEditMultipleObjects]
 | |
|     internal sealed class CinemachineNewVirtualCameraEditor
 | |
|         : CinemachineVirtualCameraBaseEditor<CinemachineNewVirtualCamera>
 | |
|     {
 | |
|         VcamStageEditorPipeline m_PipelineSet = new VcamStageEditorPipeline();
 | |
| 
 | |
|         protected override void OnEnable()
 | |
|         {
 | |
|             base.OnEnable();
 | |
|             Undo.undoRedoPerformed += ResetTargetOnUndo;
 | |
|             m_PipelineSet.Initialize(
 | |
|                 // GetComponent
 | |
|                 (stage, result) =>
 | |
|                 {
 | |
|                     int numNullComponents = 0;
 | |
|                     foreach (var obj in targets)
 | |
|                     {
 | |
|                         var vcam = obj as CinemachineNewVirtualCamera;
 | |
|                         if (vcam != null)
 | |
|                         {
 | |
|                             var c = vcam.GetCinemachineComponent(stage);
 | |
|                             if (c != null)
 | |
|                                 result.Add(c);
 | |
|                             else
 | |
|                                 ++numNullComponents;
 | |
|                         }
 | |
|                     }
 | |
|                     return numNullComponents;
 | |
|                 },
 | |
|                 // SetComponent
 | |
|                 (stage, type) => 
 | |
|                 {
 | |
|                     Undo.SetCurrentGroupName("Cinemachine pipeline change");
 | |
|                     foreach (var obj in targets)
 | |
|                     {
 | |
|                         var vcam = obj as CinemachineNewVirtualCamera;
 | |
|                         if (vcam != null)
 | |
|                         {
 | |
|                             Component c = vcam.GetCinemachineComponent(stage);
 | |
|                             if (c != null && c.GetType() == type)
 | |
|                                 continue;
 | |
|                             if (c != null)
 | |
|                             {
 | |
|                                 Undo.DestroyObjectImmediate(c);
 | |
|                                 vcam.InvalidateComponentCache();
 | |
|                             }
 | |
|                             if (type != null)
 | |
|                             {
 | |
|                                 Undo.AddComponent(vcam.gameObject, type);
 | |
|                                 vcam.InvalidateComponentCache();
 | |
|                             }
 | |
|                         }
 | |
|                     }
 | |
|                 });
 | |
|         }
 | |
| 
 | |
|         protected override void OnDisable()
 | |
|         {
 | |
|             Undo.undoRedoPerformed -= ResetTargetOnUndo;
 | |
|             m_PipelineSet.Shutdown();
 | |
|             base.OnDisable();
 | |
|         }
 | |
| 
 | |
|         void ResetTargetOnUndo() 
 | |
|         {
 | |
|             ResetTarget();
 | |
|         }
 | |
| 
 | |
|         public override void OnInspectorGUI()
 | |
|         {
 | |
|             BeginInspector();
 | |
|             DrawHeaderInInspector();
 | |
|             DrawPropertyInInspector(FindProperty(x => x.m_Priority));
 | |
|             DrawTargetsInInspector(FindProperty(x => x.m_Follow), FindProperty(x => x.m_LookAt));
 | |
|             DrawPropertyInInspector(FindProperty(x => x.m_StandbyUpdate));
 | |
|             DrawLensSettingsInInspector(FindProperty(x => x.m_Lens));
 | |
|             DrawRemainingPropertiesInInspector();
 | |
|             m_PipelineSet.OnInspectorGUI(true);
 | |
|             DrawExtensionsWidgetInInspector();
 | |
|         }
 | |
| 
 | |
|         Vector3 m_PreviousPosition; // for position dragging
 | |
|         private void OnSceneGUI()
 | |
|         {
 | |
|             if (!Target.UserIsDragging)
 | |
|                 m_PreviousPosition = Target.transform.position;
 | |
|             if (Selection.Contains(Target.gameObject) && Tools.current == Tool.Move
 | |
|                 && Event.current.type == EventType.MouseDrag)
 | |
|             {
 | |
|                 // User might be dragging our position handle
 | |
|                 Target.UserIsDragging = true;
 | |
|                 Vector3 delta = Target.transform.position - m_PreviousPosition;
 | |
|                 if (!delta.AlmostZero())
 | |
|                 {
 | |
|                     m_PipelineSet.OnPositionDragged(delta);
 | |
|                     m_PreviousPosition = Target.transform.position;
 | |
|                 }
 | |
|             }
 | |
|             else if (GUIUtility.hotControl == 0 && Target.UserIsDragging)
 | |
|             {
 | |
|                 // We're not dragging anything now, but we were
 | |
|                 InspectorUtility.RepaintGameView();
 | |
|                 Target.UserIsDragging = false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|     }
 | |
| }
 | |
| #endif
 | 
