using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraFollow : Manager { public GameObject FollowObject; public GameObject FollowObjectGameOver; public float DampingRotationFac; public float DampingPositionFac; public float DampingRotationFacGameOver; public float DampingPositionFacGameOver; private Vector3 targetLocation; private Quaternion targetRotation; public AnimationCurve EasingPositionCurve; public AnimationCurve EasingRotationCurve; public AnimationCurve EasingPositionCurveGameOver; public AnimationCurve EasingRotationCurveGameOver; public void OnGameStateChanged(GameState newState, GameState oldState) { if(newState == GameState.Play) { updateTarget(); updateCameraLerp(1.0f, 1.0f); } if(newState == GameState.GameOver) { } } protected void Start() { GameStateManager.Instance.OnGameStateChangedEvent.AddListener(OnGameStateChanged); } protected void OnDestroy() { GameStateManager.Instance.OnGameStateChangedEvent.RemoveListener(OnGameStateChanged); } private void updateCameraLerp(float lerpRot, float lerpPos) { this.transform.rotation = Quaternion.Lerp(this.transform.rotation, targetRotation, lerpRot); this.transform.position = Vector3.Lerp(this.transform.position, targetLocation, lerpPos); } private void updateTarget() { GameObject activeFollowTarget = GameStateManager.Instance.GameState == GameState.Play ? FollowObject : FollowObjectGameOver; Quaternion lookRotation = Quaternion.identity; lookRotation.SetLookRotation(Vector3.Scale(activeFollowTarget.transform.forward, new Vector3(1.0f, 0.0f, 1.0f)).normalized, Vector3.up); targetLocation = activeFollowTarget.transform.position; targetRotation = lookRotation; } protected void OnGameOverAnimationFinished() { Debug.Log("OnGameOverAnimationFinished OKAY GO GO GO "); } protected void FixedUpdate() { updateTarget(); float activeDampingRotationFactor = GameStateManager.Instance.GameState == GameState.Play ? DampingRotationFac : DampingRotationFacGameOver; float activeDampingPositionFactor = GameStateManager.Instance.GameState == GameState.Play ? DampingPositionFac : DampingPositionFacGameOver; float tRot = Mathf.Clamp(Mathf.Abs(Quaternion.Angle(this.transform.rotation, targetRotation)) * activeDampingRotationFactor, 0.0f, 1.0f); float tPos = Mathf.Clamp((this.transform.position - targetLocation).magnitude * activeDampingPositionFactor, 0.0f, 1.0f); AnimationCurve activeRotationCurve = GameStateManager.Instance.GameState == GameState.Play ? EasingRotationCurve : EasingRotationCurveGameOver; AnimationCurve activePositionCurve = GameStateManager.Instance.GameState == GameState.Play ? EasingPositionCurve : EasingPositionCurveGameOver; tRot = activeRotationCurve.Evaluate(tRot); tPos = activePositionCurve.Evaluate(tPos); updateCameraLerp(tRot, tPos); } }