CameraFollow.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. ------------------- Code Monkey -------------------
  3. Thank you for downloading the Code Monkey Utilities
  4. I hope you find them useful in your projects
  5. If you have any questions use the contact form
  6. Cheers!
  7. unitycodemonkey.com
  8. --------------------------------------------------
  9. */
  10. using System;
  11. using System.Collections.Generic;
  12. using UnityEngine;
  13. namespace CodeMonkey.MonoBehaviours {
  14. /*
  15. * Script to handle Camera Movement and Zoom
  16. * Place on Camera GameObject
  17. * */
  18. public class CameraFollow : MonoBehaviour {
  19. public static CameraFollow Instance { get; private set; }
  20. private Camera myCamera;
  21. private Func<Vector3> GetCameraFollowPositionFunc;
  22. private Func<float> GetCameraZoomFunc;
  23. public void Setup(Func<Vector3> GetCameraFollowPositionFunc, Func<float> GetCameraZoomFunc, bool teleportToFollowPosition, bool instantZoom) {
  24. this.GetCameraFollowPositionFunc = GetCameraFollowPositionFunc;
  25. this.GetCameraZoomFunc = GetCameraZoomFunc;
  26. if (teleportToFollowPosition) {
  27. Vector3 cameraFollowPosition = GetCameraFollowPositionFunc();
  28. cameraFollowPosition.z = transform.position.z;
  29. transform.position = cameraFollowPosition;
  30. }
  31. if (instantZoom) {
  32. myCamera.orthographicSize = GetCameraZoomFunc();
  33. }
  34. }
  35. private void Awake() {
  36. Instance = this;
  37. myCamera = transform.GetComponent<Camera>();
  38. }
  39. public void SetCameraFollowPosition(Vector3 cameraFollowPosition) {
  40. SetGetCameraFollowPositionFunc(() => cameraFollowPosition);
  41. }
  42. public void SetGetCameraFollowPositionFunc(Func<Vector3> GetCameraFollowPositionFunc) {
  43. this.GetCameraFollowPositionFunc = GetCameraFollowPositionFunc;
  44. }
  45. public void SetCameraZoom(float cameraZoom) {
  46. SetGetCameraZoomFunc(() => cameraZoom);
  47. }
  48. public void SetGetCameraZoomFunc(Func<float> GetCameraZoomFunc) {
  49. this.GetCameraZoomFunc = GetCameraZoomFunc;
  50. }
  51. private void Update() {
  52. HandleMovement();
  53. HandleZoom();
  54. }
  55. private void HandleMovement() {
  56. if (GetCameraFollowPositionFunc == null) return;
  57. Vector3 cameraFollowPosition = GetCameraFollowPositionFunc();
  58. cameraFollowPosition.z = transform.position.z;
  59. Vector3 cameraMoveDir = (cameraFollowPosition - transform.position).normalized;
  60. float distance = Vector3.Distance(cameraFollowPosition, transform.position);
  61. float cameraMoveSpeed = 3f;
  62. if (distance > 0) {
  63. Vector3 newCameraPosition = transform.position + cameraMoveDir * distance * cameraMoveSpeed * Time.deltaTime;
  64. float distanceAfterMoving = Vector3.Distance(newCameraPosition, cameraFollowPosition);
  65. if (distanceAfterMoving > distance) {
  66. // Overshot the target
  67. newCameraPosition = cameraFollowPosition;
  68. }
  69. transform.position = newCameraPosition;
  70. }
  71. }
  72. private void HandleZoom() {
  73. if (GetCameraZoomFunc == null) return;
  74. float cameraZoom = GetCameraZoomFunc();
  75. float cameraZoomDifference = cameraZoom - myCamera.orthographicSize;
  76. float cameraZoomSpeed = 1f;
  77. myCamera.orthographicSize += cameraZoomDifference * cameraZoomSpeed * Time.deltaTime;
  78. if (cameraZoomDifference > 0) {
  79. if (myCamera.orthographicSize > cameraZoom) {
  80. myCamera.orthographicSize = cameraZoom;
  81. }
  82. } else {
  83. if (myCamera.orthographicSize < cameraZoom) {
  84. myCamera.orthographicSize = cameraZoom;
  85. }
  86. }
  87. }
  88. }
  89. }