-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTopDownCamera.cs
More file actions
137 lines (103 loc) · 2.91 KB
/
TopDownCamera.cs
File metadata and controls
137 lines (103 loc) · 2.91 KB
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
using UnityEngine;
public class TopDownCamera : MonoBehaviour {
private struct SafeZone
{
public Vector3 center;
public SafeZone(Bounds bounds, Vector3 size)
{
center = Vector3.zero;
}
public void Update(Bounds bounds)
{
}
}
[Header("References")]
[Tooltip("A target for the camera to follow.")]
[SerializeField]
private Transform target;
[Tooltip("Target top collider. Used to calculate distance between collider top point and camera.")]
[SerializeField]
private Collider topCollider;
private Vector3 currentVelocity;
[Header("Settings")]
[SerializeField]
[Range(0.0f, 1.0f)]
private float smoothTime = 0.1f;
[SerializeField]
[Range(0.0f, 20.0f)]
private float height = 8f;
[SerializeField]
[Range(45f, 90f)]
private float angle = 90f;
[SerializeField]
[Range(0.1f, 10f)]
private float angleFactor = 90f;
[Header("Look Ahead")]
[SerializeField]
[Range(0.0f, 20.0f)]
private float horizontalLookAhead = 5f;
[SerializeField]
[Range(0.0f, 20.0f)]
private float verticalLookAhead = 5f;
[Header("Safe Zone")]
[Tooltip("Safe Zone Size")]
[SerializeField]
private Vector3 safeZoneSize;
[Tooltip("Enable/Disable Safe Zone")]
[SerializeField]
private bool enableSafeZone;
[Tooltip("Color of Safe Zone")]
[SerializeField]
private Color colorSafeZone = Color.blue;
// Private fields
private SafeZone safe;
private Camera cam;
private void Awake() {
// Try to find default target and top collider
if (target == null) {
target = FindObjectOfType<TopDownPlayer>().transform;
}
if (topCollider == null) {
topCollider = target.Find("Head").GetComponent<Collider>();
}
cam = GetComponent<Camera>();
safe = new SafeZone(topCollider.bounds, safeZoneSize);
}
private void OnDrawGizmos() {
Gizmos.color = colorSafeZone;
Gizmos.DrawCube(safe.center, safeZoneSize);
}
private void LateUpdate() {
if(target != null && topCollider != null) {
safe.Update(topCollider.bounds);
Vector3 dir = target.position - transform.position;
Debug.DrawRay(transform.position, dir, Color.red);
// Use law of sines to calculate Z distance based in camera angle.
var zRelativeToAngle = height/Mathf.Sin(angle * Mathf.Deg2Rad) * Mathf.Sin((90 - angle) * Mathf.Deg2Rad);
var dx = (Input.mousePosition.x - Screen.width * 0.5f) / Screen.width;;
var dz = (Input.mousePosition.y - Screen.height * 0.5f) / Screen.height;
// Set Target Position
Vector3 targetPosition = new Vector3(
target.position.x + dx * horizontalLookAhead,
height,
target.position.z - zRelativeToAngle + dz * verticalLookAhead
);
// Set Current Position
transform.position = Vector3.SmoothDamp(
transform.position,
targetPosition,
ref currentVelocity,
smoothTime
);
// Set Rotation
transform.eulerAngles = new Vector3(
angle - dz * angleFactor,
0,
0
);
}
else {
Debug.LogWarning("Target or Top Collider not found!");
}
}
}