blob: b52597dc786461491f4ba5633ce255babe2e4569 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
/*
------------------- 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<Vector3> GetCameraFollowPositionFunc;
private Func<float> GetCameraZoomFunc;
public void Setup(Func<Vector3> GetCameraFollowPositionFunc, Func<float> 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<Camera>();
}
public void SetCameraFollowPosition(Vector3 cameraFollowPosition) {
SetGetCameraFollowPositionFunc(() => cameraFollowPosition);
}
public void SetGetCameraFollowPositionFunc(Func<Vector3> GetCameraFollowPositionFunc) {
this.GetCameraFollowPositionFunc = GetCameraFollowPositionFunc;
}
public void SetCameraZoom(float cameraZoom) {
SetGetCameraZoomFunc(() => cameraZoom);
}
public void SetGetCameraZoomFunc(Func<float> 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;
}
}
}
}
}
|