/* ------------------- 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 { private Camera myCamera; private Func GetCameraFollowPositionFunc; private Func GetCameraZoomFunc; public void Setup(Func GetCameraFollowPositionFunc, Func GetCameraZoomFunc) { this.GetCameraFollowPositionFunc = GetCameraFollowPositionFunc; this.GetCameraZoomFunc = GetCameraZoomFunc; } private void Start() { 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; } // Update is called once per frame void Update() { HandleMovement(); HandleZoom(); } private void HandleMovement() { 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() { 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; } } } } }