SW 중심대학 OSS GIT 서버 박건태, 이승준, 고기완, 이준호 새로운 배포
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
3.3 KiB

4 years ago
  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. private Camera myCamera;
  20. private Func<Vector3> GetCameraFollowPositionFunc;
  21. private Func<float> GetCameraZoomFunc;
  22. public void Setup(Func<Vector3> GetCameraFollowPositionFunc, Func<float> GetCameraZoomFunc) {
  23. this.GetCameraFollowPositionFunc = GetCameraFollowPositionFunc;
  24. this.GetCameraZoomFunc = GetCameraZoomFunc;
  25. }
  26. private void Start() {
  27. myCamera = transform.GetComponent<Camera>();
  28. }
  29. public void SetCameraFollowPosition(Vector3 cameraFollowPosition) {
  30. SetGetCameraFollowPositionFunc(() => cameraFollowPosition);
  31. }
  32. public void SetGetCameraFollowPositionFunc(Func<Vector3> GetCameraFollowPositionFunc) {
  33. this.GetCameraFollowPositionFunc = GetCameraFollowPositionFunc;
  34. }
  35. public void SetCameraZoom(float cameraZoom) {
  36. SetGetCameraZoomFunc(() => cameraZoom);
  37. }
  38. public void SetGetCameraZoomFunc(Func<float> GetCameraZoomFunc) {
  39. this.GetCameraZoomFunc = GetCameraZoomFunc;
  40. }
  41. // Update is called once per frame
  42. void Update() {
  43. HandleMovement();
  44. HandleZoom();
  45. }
  46. private void HandleMovement() {
  47. Vector3 cameraFollowPosition = GetCameraFollowPositionFunc();
  48. cameraFollowPosition.z = transform.position.z;
  49. Vector3 cameraMoveDir = (cameraFollowPosition - transform.position).normalized;
  50. float distance = Vector3.Distance(cameraFollowPosition, transform.position);
  51. float cameraMoveSpeed = 3f;
  52. if (distance > 0) {
  53. Vector3 newCameraPosition = transform.position + cameraMoveDir * distance * cameraMoveSpeed * Time.deltaTime;
  54. float distanceAfterMoving = Vector3.Distance(newCameraPosition, cameraFollowPosition);
  55. if (distanceAfterMoving > distance) {
  56. // Overshot the target
  57. newCameraPosition = cameraFollowPosition;
  58. }
  59. transform.position = newCameraPosition;
  60. }
  61. }
  62. private void HandleZoom() {
  63. float cameraZoom = GetCameraZoomFunc();
  64. float cameraZoomDifference = cameraZoom - myCamera.orthographicSize;
  65. float cameraZoomSpeed = 1f;
  66. myCamera.orthographicSize += cameraZoomDifference * cameraZoomSpeed * Time.deltaTime;
  67. if (cameraZoomDifference > 0) {
  68. if (myCamera.orthographicSize > cameraZoom) {
  69. myCamera.orthographicSize = cameraZoom;
  70. }
  71. } else {
  72. if (myCamera.orthographicSize < cameraZoom) {
  73. myCamera.orthographicSize = cameraZoom;
  74. }
  75. }
  76. }
  77. }
  78. }