/* ------------------- Code Monkey ------------------- Thank you for downloading the Code Monkey Utilities I hope you find them useful in your projects If you have any questions use the contact form Cheers! unitycodemonkey.com -------------------------------------------------- */ using System; using System.Collections.Generic; using UnityEngine; namespace CodeMonkey.MonoBehaviours { /* * Script to handle Camera Movement and Zoom * Place on Camera GameObject * */ public class CameraFollow : MonoBehaviour { public static CameraFollow Instance { get; private set; } private Camera myCamera; private Func GetCameraFollowPositionFunc; private Func GetCameraZoomFunc; public void Setup(Func GetCameraFollowPositionFunc, Func GetCameraZoomFunc, bool teleportToFollowPosition, bool instantZoom) { this.GetCameraFollowPositionFunc = GetCameraFollowPositionFunc; this.GetCameraZoomFunc = GetCameraZoomFunc; if (teleportToFollowPosition) { Vector3 cameraFollowPosition = GetCameraFollowPositionFunc(); cameraFollowPosition.z = transform.position.z; transform.position = cameraFollowPosition; } if (instantZoom) { myCamera.orthographicSize = GetCameraZoomFunc(); } } private void Awake() { Instance = this; myCamera = transform.GetComponent(); } public void SetCameraFollowPosition(Vector3 cameraFollowPosition) { SetGetCameraFollowPositionFunc(() => cameraFollowPosition); } public void SetGetCameraFollowPositionFunc(Func GetCameraFollowPositionFunc) { this.GetCameraFollowPositionFunc = GetCameraFollowPositionFunc; } public void SetCameraZoom(float cameraZoom) { SetGetCameraZoomFunc(() => cameraZoom); } public void SetGetCameraZoomFunc(Func GetCameraZoomFunc) { this.GetCameraZoomFunc = GetCameraZoomFunc; } private void Update() { HandleMovement(); HandleZoom(); } private void HandleMovement() { if (GetCameraFollowPositionFunc == null) return; Vector3 cameraFollowPosition = GetCameraFollowPositionFunc(); cameraFollowPosition.z = transform.position.z; Vector3 cameraMoveDir = (cameraFollowPosition - transform.position).normalized; float distance = Vector3.Distance(cameraFollowPosition, transform.position); float cameraMoveSpeed = 3f; if (distance > 0) { Vector3 newCameraPosition = transform.position + cameraMoveDir * distance * cameraMoveSpeed * Time.deltaTime; float distanceAfterMoving = Vector3.Distance(newCameraPosition, cameraFollowPosition); if (distanceAfterMoving > distance) { // Overshot the target newCameraPosition = cameraFollowPosition; } transform.position = newCameraPosition; } } private void HandleZoom() { if (GetCameraZoomFunc == null) return; float cameraZoom = GetCameraZoomFunc(); float cameraZoomDifference = cameraZoom - myCamera.orthographicSize; float cameraZoomSpeed = 1f; myCamera.orthographicSize += cameraZoomDifference * cameraZoomSpeed * Time.deltaTime; if (cameraZoomDifference > 0) { if (myCamera.orthographicSize > cameraZoom) { myCamera.orthographicSize = cameraZoom; } } else { if (myCamera.orthographicSize < cameraZoom) { myCamera.orthographicSize = cameraZoom; } } } } }