/// <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);
            }
        }
示例#2
0
        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());
            }
        }
示例#7
0
        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;
            }
        }
示例#8
0
        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());
            }
        }