/// <summary>Goes to the next cinematic target</summary> /// <param name="targetTransform">The Transform component of the target</param> /// <param name="easeInDuration">The time it takes for the camera to reach the target</param> /// <param name="holdDuration">The time the camera follows the target. If below 0, you’ll have to manually move to the next target by using the GoToNextTarget method</param> /// <param name="zoom">The zoom the camera should make while following the target. Use 1 for no zoom</param> /// <param name="easeType">The animation type of the camera movement to reach the target</param> /// <param name="sendMessageName">The method name that will be called when the target is reached</param> /// <param name="sendMessageParam">The parameter that will be sent when the above method is called</param> /// <param name="index">The position in the targets list. Use -1 to put in last and 0 for first</param> public void AddCinematicTarget(Transform targetTransform, float easeInDuration = 1f, float holdDuration = 1f, float zoom = 1f, EaseType easeType = EaseType.EaseOut, string sendMessageName = "", string sendMessageParam = "", int index = -1) { var newCinematicTarget = new CinematicTarget() { TargetTransform = targetTransform, EaseInDuration = easeInDuration, HoldDuration = holdDuration, Zoom = zoom, EaseType = easeType, SendMessageName = sendMessageName, SendMessageParam = sendMessageParam }; if (index == -1 || index > CinematicTargets.Count) { CinematicTargets.Add(newCinematicTarget); } else { CinematicTargets.Insert(index, newCinematicTarget); } }
public override void OnInspectorGUI() { if (target == null) { return; } var proCamera2DCinematics = (ProCamera2DCinematics)target; if (proCamera2DCinematics.ProCamera2D == null) { EditorGUILayout.HelpBox("ProCamera2D is not set.", MessageType.Error, true); return; } serializedObject.Update(); // Show script link GUI.enabled = false; _script = EditorGUILayout.ObjectField("Script", _script, typeof(MonoScript), false) as MonoScript; GUI.enabled = true; // ProCamera2D _tooltip = new GUIContent("Pro Camera 2D", ""); EditorGUILayout.PropertyField(serializedObject.FindProperty("_pc2D"), _tooltip); EditorGUILayout.PropertyField(serializedObject.FindProperty("cinematicName")); // Targets Drop Area EditorGUILayout.Space(); Event evt = Event.current; Rect drop_area = GUILayoutUtility.GetRect(0.0f, 50.0f, GUILayout.ExpandWidth(true)); var style = new GUIStyle("box"); if (EditorGUIUtility.isProSkin) { style.normal.textColor = Color.white; } GUI.Box(drop_area, "\nDROP CINEMATC TARGETS HERE", style); switch (evt.type) { case EventType.DragUpdated: case EventType.DragPerform: if (drop_area.Contains(evt.mousePosition)) { DragAndDrop.visualMode = DragAndDropVisualMode.Copy; if (evt.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); foreach (Object dragged_object in DragAndDrop.objectReferences) { var newCinematicTarget = new CinematicTarget { TargetTransform = ((GameObject)dragged_object).transform, EaseInDuration = 1f, HoldDuration = 1f, EaseType = EaseType.EaseOut }; proCamera2DCinematics.CinematicTargets.Add(newCinematicTarget); EditorUtility.SetDirty(proCamera2DCinematics); } } } break; } EditorGUILayout.Space(); // Remove empty targets for (int i = 0; i < proCamera2DCinematics.CinematicTargets.Count; i++) { if (proCamera2DCinematics.CinematicTargets[i].TargetTransform == null) { proCamera2DCinematics.CinematicTargets.RemoveAt(i); } } // Camera targets list _cinematicTargetsList.DoLayoutList(); EditorGUILayout.Space(); // End duration _tooltip = new GUIContent("End Duration", "How long it takes for the camera to get back to its regular targets"); EditorGUILayout.PropertyField(serializedObject.FindProperty("EndDuration"), _tooltip); // End ease type _tooltip = new GUIContent("End Ease Type", "The ease type of the end animation"); EditorGUILayout.PropertyField(serializedObject.FindProperty("EndEaseType"), _tooltip); // Use numeric boundaries _tooltip = new GUIContent("Use Numeric Boundaries", "If existent, the camera movement will be limited by the numeric boundaries"); EditorGUILayout.PropertyField(serializedObject.FindProperty("UseNumericBoundaries"), _tooltip); // Letterbox _tooltip = new GUIContent("Use Letterbox", "If checked, the camera will show black bars on top and bottom during the cinematic sequence"); EditorGUILayout.PropertyField(serializedObject.FindProperty("UseLetterbox"), _tooltip); if (proCamera2DCinematics.UseLetterbox) { // Letterbox amount _tooltip = new GUIContent("Letterbox Amount", ""); EditorGUILayout.PropertyField(serializedObject.FindProperty("LetterboxAmount"), _tooltip); // Letterbox animation duration _tooltip = new GUIContent("Letterbox Anim Duration", ""); EditorGUILayout.PropertyField(serializedObject.FindProperty("LetterboxAnimDuration"), _tooltip); // Letterbox color _tooltip = new GUIContent("Letterbox Color", ""); EditorGUILayout.PropertyField(serializedObject.FindProperty("LetterboxColor"), _tooltip); } EditorGUILayout.Space(); // Events // Cinematic started event _tooltip = new GUIContent("OnCinematicStarted", ""); EditorGUILayout.PropertyField(serializedObject.FindProperty("OnCinematicStarted"), _tooltip); // Cinematic target reached event _tooltip = new GUIContent("OnCinematicTargetReached", ""); EditorGUILayout.PropertyField(serializedObject.FindProperty("OnCinematicTargetReached"), _tooltip); // Cinematic finished event _tooltip = new GUIContent("OnCinematicFinished", ""); EditorGUILayout.PropertyField(serializedObject.FindProperty("OnCinematicFinished"), _tooltip); EditorGUILayout.Space(); EditorGUILayout.Space(); // Test buttons GUI.enabled = Application.isPlaying && proCamera2DCinematics.CinematicTargets.Count > 0; if (GUILayout.Button((proCamera2DCinematics.IsPlaying ? "Stop" : "Start") + " Cinematic")) { if (proCamera2DCinematics.IsPlaying) { proCamera2DCinematics.Stop(); } else { proCamera2DCinematics.Play(); } } GUI.enabled = true; serializedObject.ApplyModifiedProperties(); }
public override void OnInspectorGUI() { var proCamera2DCinematics = (ProCamera2DCinematics)target; if (proCamera2DCinematics.ProCamera2D == null) { EditorGUILayout.HelpBox("ProCamera2D is not set.", MessageType.Error, true); return; } serializedObject.Update(); // Show script link GUI.enabled = false; _script = EditorGUILayout.ObjectField("Script", _script, typeof(MonoScript), false) as MonoScript; GUI.enabled = true; // ProCamera2D _tooltip = new GUIContent("Pro Camera 2D", ""); EditorGUILayout.PropertyField(serializedObject.FindProperty("ProCamera2D"), _tooltip); // Targets Drop Area EditorGUILayout.Space(); Event evt = Event.current; Rect drop_area = GUILayoutUtility.GetRect(0.0f, 50.0f, GUILayout.ExpandWidth(true)); var style = new GUIStyle("box"); if (EditorGUIUtility.isProSkin) style.normal.textColor = Color.white; GUI.Box(drop_area, "\nDROP CINEMATC TARGETS HERE", style); switch (evt.type) { case EventType.DragUpdated: case EventType.DragPerform: if (!drop_area.Contains(evt.mousePosition)) return; DragAndDrop.visualMode = DragAndDropVisualMode.Copy; if (evt.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); foreach (Object dragged_object in DragAndDrop.objectReferences) { var newCinematicTarget = new CinematicTarget { TargetTransform = ((GameObject)dragged_object).transform, EaseInDuration = 1f, HoldDuration = 1f, EaseType = EaseType.EaseOut }; proCamera2DCinematics.CinematicTargets.Add(newCinematicTarget); EditorUtility.SetDirty(proCamera2DCinematics); } } break; } EditorGUILayout.Space(); // Remove empty targets for (int i = 0; i < proCamera2DCinematics.CinematicTargets.Count; i++) { if (proCamera2DCinematics.CinematicTargets[i].TargetTransform == null) { proCamera2DCinematics.CinematicTargets.RemoveAt(i); } } // Camera targets list _cinematicTargetsList.DoLayoutList(); EditorGUILayout.Space(); // End duration _tooltip = new GUIContent("End Duration", "How long it takes for the camera to get back to its regular targets"); EditorGUILayout.PropertyField(serializedObject.FindProperty("EndDuration"), _tooltip); // End ease type _tooltip = new GUIContent("End Ease Type", "The ease type of the end animation"); EditorGUILayout.PropertyField(serializedObject.FindProperty("EndEaseType"), _tooltip); // Use numeric boundaries _tooltip = new GUIContent("Use Numeric Boundaries", "If existent, the camera movement will be limited by the numeric boundaries"); EditorGUILayout.PropertyField(serializedObject.FindProperty("UseNumericBoundaries"), _tooltip); // Letterbox _tooltip = new GUIContent("Use Letterbox", "If checked, the camera will show black bars on top and bottom during the cinematic sequence"); EditorGUILayout.PropertyField(serializedObject.FindProperty("UseLetterbox"), _tooltip); if (proCamera2DCinematics.UseLetterbox) { // Letterbox amount _tooltip = new GUIContent("Letterbox Amount", ""); EditorGUILayout.PropertyField(serializedObject.FindProperty("LetterboxAmount"), _tooltip); // Letterbox animation duration _tooltip = new GUIContent("Letterbox Anim Duration", ""); EditorGUILayout.PropertyField(serializedObject.FindProperty("LetterboxAnimDuration"), _tooltip); // Letterbox color _tooltip = new GUIContent("Letterbox Color", ""); EditorGUILayout.PropertyField(serializedObject.FindProperty("LetterboxColor"), _tooltip); } // Test buttons EditorGUILayout.Space(); EditorGUILayout.Space(); GUI.enabled = Application.isPlaying && proCamera2DCinematics.CinematicTargets.Count > 0; if (GUILayout.Button((proCamera2DCinematics.IsActive ? "Stop" : "Start") + " Cinematic")) { if (proCamera2DCinematics.IsActive) proCamera2DCinematics.Stop(); else proCamera2DCinematics.Play(); } GUI.enabled = true; serializedObject.ApplyModifiedProperties(); }
IEnumerator GoToCinematicTargetRoutine(CinematicTarget cinematicTarget, int targetIndex) { if (cinematicTarget.TargetTransform == null) yield break; var initialPosH = Vector3H(ProCamera2D.CameraPosition); var initialPosV = Vector3V(ProCamera2D.CameraPosition); var currentCameraSize = ProCamera2D.GameCameraSize; // Ease in var t = 0f; while (t <= 1.0f) { t += ProCamera2D.DeltaTime / cinematicTarget.EaseInDuration; _overridePosition.Enabled = true; _overridePosition.OverridePosition = VectorHVD( Utils.EaseFromTo(initialPosH, Vector3H(cinematicTarget.TargetTransform.position), t, cinematicTarget.EaseType), Utils.EaseFromTo(initialPosV, Vector3V(cinematicTarget.TargetTransform.position), t, cinematicTarget.EaseType), Vector3D(ProCamera2D.CameraPosition)); _overridePosition.OverrideSize = Utils.EaseFromTo(currentCameraSize, _initialCameraSize / cinematicTarget.Zoom, t, cinematicTarget.EaseType); if (_skipTarget) yield break; yield return ProCamera2D.GetYield(); } // Dispatch target reached event if (CinematicReachedTarget != null) CinematicReachedTarget(targetIndex); // Send target reached message if (!string.IsNullOrEmpty(cinematicTarget.SendMessageName)) { cinematicTarget.TargetTransform.SendMessage(cinematicTarget.SendMessageName, cinematicTarget.SendMessageParam, SendMessageOptions.DontRequireReceiver); } // Hold t = 0f; while (cinematicTarget.HoldDuration < 0 || t <= cinematicTarget.HoldDuration) { t += ProCamera2D.DeltaTime; _overridePosition.OverridePosition = VectorHVD( Vector3H(cinematicTarget.TargetTransform.position), Vector3V(cinematicTarget.TargetTransform.position), Vector3D(ProCamera2D.CameraPosition)); if (_skipTarget) yield break; yield return ProCamera2D.GetYield(); } }
/// <summary>Goes to the next cinematic target</summary> /// <param name="targetTransform">The Transform component of the target</param> /// <param name="easeInDuration">The time it takes for the camera to reach the target</param> /// <param name="holdDuration">The time the camera follows the target. If below 0, you’ll have to manually move to the next target by using the GoToNextTarget method</param> /// <param name="zoom">The zoom the camera should make while following the target. Use 1 for no zoom</param> /// <param name="easeType">The animation type of the camera movement to reach the target</param> /// <param name="sendMessageName">The method name that will be called when the target is reached</param> /// <param name="sendMessageParam">The parameter that will be sent when the above method is called</param> /// <param name="index">The position in the targets list. Use -1 to put in last and 0 for first</param> public void AddCinematicTarget(Transform targetTransform, float easeInDuration = 1f, float holdDuration = 1f, float zoom = 1f, EaseType easeType = EaseType.EaseOut, string sendMessageName = "", string sendMessageParam = "", int index = -1) { var newCinematicTarget = new CinematicTarget() { TargetTransform = targetTransform, EaseInDuration = easeInDuration, HoldDuration = holdDuration, Zoom = zoom, EaseType = easeType, SendMessageName = sendMessageName, SendMessageParam = sendMessageParam }; if (index == -1 || index > CinematicTargets.Count) CinematicTargets.Add(newCinematicTarget); else CinematicTargets.Insert(index, newCinematicTarget); }
IEnumerator GoToCinematicTargetRoutine(CinematicTarget cinematicTarget, int targetIndex) { if (cinematicTarget.TargetTransform == null) { yield break; } var initialPosH = Vector3H(ProCamera2D.LocalPosition); var initialPosV = Vector3V(ProCamera2D.LocalPosition); var currentCameraSize = ProCamera2D.ScreenSizeInWorldCoordinates.y * .5f; // _TurnRateEase in var t = 0f; if (cinematicTarget.EaseInDuration > 0) { while (t <= 1.0f) { if (!_paused) { t += ProCamera2D.DeltaTime / cinematicTarget.EaseInDuration; var newPosH = Utils.EaseFromTo(initialPosH, Vector3H(cinematicTarget.TargetTransform.position) - Vector3H(ProCamera2D.ParentPosition), t, cinematicTarget.EaseType); var newPosV = Utils.EaseFromTo(initialPosV, Vector3V(cinematicTarget.TargetTransform.position) - Vector3V(ProCamera2D.ParentPosition), t, cinematicTarget.EaseType); if (UseNumericBoundaries) { LimitToNumericBoundaries(ref newPosH, ref newPosV); } _newPos = VectorHVD(newPosH, newPosV, 0); _newSize = Utils.EaseFromTo(currentCameraSize, _initialCameraSize / cinematicTarget.Zoom, t, cinematicTarget.EaseType); if (_skipTarget) { yield break; } } yield return(ProCamera2D.GetYield()); } } else { var newPosH = Vector3H(cinematicTarget.TargetTransform.position) - Vector3H(ProCamera2D.ParentPosition); var newPosV = Vector3V(cinematicTarget.TargetTransform.position) - Vector3V(ProCamera2D.ParentPosition); _newPos = VectorHVD(newPosH, newPosV, 0); _newSize = _initialCameraSize / cinematicTarget.Zoom; } // Dispatch target reached event if (OnCinematicTargetReached != null) { OnCinematicTargetReached.Invoke(targetIndex); } // Send target reached message if (!string.IsNullOrEmpty(cinematicTarget.SendMessageName)) { cinematicTarget.TargetTransform.SendMessage(cinematicTarget.SendMessageName, cinematicTarget.SendMessageParam, SendMessageOptions.DontRequireReceiver); } // Hold t = 0f; while (cinematicTarget.HoldDuration < 0 || t <= cinematicTarget.HoldDuration) { if (!_paused) { t += ProCamera2D.DeltaTime; var newPosH = Vector3H(cinematicTarget.TargetTransform.position) - Vector3H(ProCamera2D.ParentPosition); var newPosV = Vector3V(cinematicTarget.TargetTransform.position) - Vector3V(ProCamera2D.ParentPosition); if (UseNumericBoundaries) { LimitToNumericBoundaries(ref newPosH, ref newPosV); } _newPos = VectorHVD(newPosH, newPosV, 0); if (_skipTarget) { yield break; } } yield return(ProCamera2D.GetYield()); } }
IEnumerator GoToCinematicTargetRoutine(CinematicTarget cinematicTarget, int targetIndex) { if (cinematicTarget.TargetTransform == null) yield break; var initialPosH = Vector3H(ProCamera2D.CameraPosition); var initialPosV = Vector3V(ProCamera2D.CameraPosition); var currentCameraSize = ProCamera2D.GameCameraSize; // Ease in var waitForFixedUpdate = new WaitForFixedUpdate(); var t = 0f; while (t <= 1.0f) { t += (ProCamera2D.UpdateType == UpdateType.LateUpdate ? Time.deltaTime : Time.fixedDeltaTime) / cinematicTarget.EaseInDuration; _overridePosition.OverridePosition = VectorHVD( Utils.EaseFromTo(initialPosH, Vector3H(cinematicTarget.TargetTransform.position), t, cinematicTarget.EaseType), Utils.EaseFromTo(initialPosV, Vector3V(cinematicTarget.TargetTransform.position), t, cinematicTarget.EaseType), Vector3D(ProCamera2D.CameraPosition)); _overridePosition.OverrideSize = Utils.EaseFromTo(currentCameraSize, _initialCameraSize / cinematicTarget.Zoom, t, cinematicTarget.EaseType); yield return (ProCamera2D.UpdateType == UpdateType.FixedUpdate) ? waitForFixedUpdate : null; } // Dispatch target reached event if (CinematicReachedTarget != null) CinematicReachedTarget(targetIndex); // Send target reached message if (!string.IsNullOrEmpty(cinematicTarget.SendMessageName)) { cinematicTarget.TargetTransform.SendMessage(cinematicTarget.SendMessageName, cinematicTarget.SendMessageParam, SendMessageOptions.DontRequireReceiver); } // Hold t = 0f; while (t <= cinematicTarget.HoldDuration) { t += ProCamera2D.UpdateType == UpdateType.LateUpdate ? Time.deltaTime : Time.fixedDeltaTime; _overridePosition.OverridePosition = VectorHVD( Vector3H(cinematicTarget.TargetTransform.position), Vector3V(cinematicTarget.TargetTransform.position), Vector3D(ProCamera2D.CameraPosition)); yield return (ProCamera2D.UpdateType == UpdateType.FixedUpdate) ? waitForFixedUpdate : null; } }
IEnumerator GoToCinematicTargetRoutine(CinematicTarget cinematicTarget, int targetIndex) { if (cinematicTarget.TargetTransform == null) { yield break; } var initialPosH = Vector3H(ProCamera2D.CameraPosition); var initialPosV = Vector3V(ProCamera2D.CameraPosition); var currentCameraSize = ProCamera2D.GameCameraSize; // Ease in var t = 0f; while (t <= 1.0f) { t += ProCamera2D.DeltaTime / cinematicTarget.EaseInDuration; _overridePosition.Enabled = true; _overridePosition.OverridePosition = VectorHVD( Utils.EaseFromTo(initialPosH, Vector3H(cinematicTarget.TargetTransform.position), t, cinematicTarget.EaseType), Utils.EaseFromTo(initialPosV, Vector3V(cinematicTarget.TargetTransform.position), t, cinematicTarget.EaseType), Vector3D(ProCamera2D.CameraPosition)); _overridePosition.OverrideSize = Utils.EaseFromTo(currentCameraSize, _initialCameraSize / cinematicTarget.Zoom, t, cinematicTarget.EaseType); if (_skipTarget) { yield break; } yield return(ProCamera2D.GetYield()); } // Dispatch target reached event if (CinematicReachedTarget != null) { CinematicReachedTarget(targetIndex); } // Send target reached message if (!string.IsNullOrEmpty(cinematicTarget.SendMessageName)) { cinematicTarget.TargetTransform.SendMessage(cinematicTarget.SendMessageName, cinematicTarget.SendMessageParam, SendMessageOptions.DontRequireReceiver); } // Hold t = 0f; while (cinematicTarget.HoldDuration < 0 || t <= cinematicTarget.HoldDuration) { t += ProCamera2D.DeltaTime; _overridePosition.OverridePosition = VectorHVD( Vector3H(cinematicTarget.TargetTransform.position), Vector3V(cinematicTarget.TargetTransform.position), Vector3D(ProCamera2D.CameraPosition)); if (_skipTarget) { yield break; } yield return(ProCamera2D.GetYield()); } }