-
Notifications
You must be signed in to change notification settings - Fork 0
/
CameraFollow.cs
87 lines (72 loc) · 2.56 KB
/
CameraFollow.cs
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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraFollow : MonoBehaviour {
public float minZoom;//zoom is half of vertical distance
public float maxZoom;
//sets bounds on what can be put in frame
public Vector2 boundsX;
public Vector2 boundsY;
public float border;
public float lerpSpeed;
public float DiffBeforeChange;
public List<Transform> players;
private Camera cam;
float aspect = 0;
float minX = 0, maxX = 0, minY = 0, maxY = 0;
public bool running = false;
void Awake()
{
cam = GetComponent<Camera>();
}
void Start()
{
aspect = cam.aspect;
GameController.OnPlayersEnter += FindPlayers;
}
void FindPlayers()
{
foreach(GameObject obj in GameObject.FindGameObjectsWithTag(Tags.player))
{
players.Add(obj.transform);
}
running = true;
}
void Update()
{
if(!running) return;
minX = 0;
maxX = 0;
minY = 0;
maxY = 0;
foreach(Transform t in players)
{
if(t.position.x < minX) minX = t.position.x;
if(t.position.y < minY) minY = t.position.y;
if(t.position.x > maxX) maxX = t.position.x;
if(t.position.y > maxY) maxY = t.position.y;
}
minX = Mathf.Clamp(minX - border, boundsX.x, boundsX.y);
maxX = Mathf.Clamp(maxX + border, boundsX.x, boundsX.y);
minY = Mathf.Clamp(minY - border, boundsY.x, boundsY.y);
maxY = Mathf.Clamp(maxY + border, boundsY.x, boundsY.y);
float zoom = Mathf.Max((maxX - minX) / aspect, (maxY - minY));
zoom /= 2f;
zoom = Mathf.Clamp(zoom, minZoom, maxZoom);
Vector3 targetPos = new Vector3((minX + maxX) / 2f, (minY + maxY) / 2f, -10);
if((maxX - minX) / aspect > (maxY - minY))
{
//players are more spread out side ways
if(boundsY.x + zoom< boundsY.y - zoom)
targetPos.y = Mathf.Clamp(targetPos.y, boundsY.x + zoom, boundsY.y - zoom);
}
else
{
if(boundsX.x + zoom * aspect < boundsX.y - zoom * aspect)
targetPos.x = Mathf.Clamp(targetPos.x, boundsX.x + zoom*aspect, boundsX.y - zoom*aspect);
}
if(Vector2.Distance(cam.transform.position,targetPos) > DiffBeforeChange)
cam.transform.position = Vector3.Lerp(cam.transform.position, targetPos, lerpSpeed);
cam.orthographicSize = Mathf.Lerp(cam.orthographicSize, zoom, lerpSpeed);
}
}