-
Notifications
You must be signed in to change notification settings - Fork 1
/
cameraFollow.cs
129 lines (94 loc) · 3.67 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
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
/*----------------------------------------------------------------
------------------------- alejandrodlsp --------------------------
-------------------- alejandrodlsp@hotmail.es --------------------
-----------------------------------------------------------------*/
/*
In Order for the script to work, your camera should be in this arrangement:
*EmptyGameObject (With cameraFollow script attatched)
-EmptyGameObject (Move this object for repositioning or rotationg the camera)
-Camera object;
*/
using UnityEngine;
public class cameraFollow : MonoBehaviour {
[SerializeField]
private Transform target; // The target to follow
[SerializeField]
private bool followPlayerDefault = true; // Follows gameObject with 'Player' tag instead of target transform
[Range(0f, 10f)]
[SerializeField]
private float turnSpeed = 1.5f; // The speed in which the camera will rotate
[SerializeField]
private float followSpeed = 1f; // The speed in which the camera will follow the player
[SerializeField]
private float rotationSmooting = 0.0f; // Makes the camera smooth its rotation
[SerializeField]
private bool cursorLocked = false; // Lock cursor
[SerializeField]
private bool forceStartRotation = false; // Rotate the camera to start rotation when not moving it
[SerializeField]
private float forceStartRotationSpeed;
private float yOffset;
private float lookAngle;
private Quaternion targetRot;
private Quaternion startRotation;
void Awake()
{
yOffset = transform.localPosition.y;
startRotation = transform.localRotation;
if(followPlayerDefault) // If folow player by default
target = GameObject.FindGameObjectWithTag("Player").transform; // Gets player with "Player" tag
Cursor.lockState = cursorLocked ? CursorLockMode.Locked : CursorLockMode.None; // Sets cursor lockmode
Cursor.visible = !cursorLocked; // Sets cursor visible
targetRot = transform.localRotation; // Gets local rotation
}
void Update()
{
if (forceStartRotation && !Input.GetMouseButton(1) && transform.localRotation != startRotation) // Force start rotation
{
goToStartRotation();
}
if (Input.GetMouseButton(1))
rotate(); // Rotate
if (cursorLocked && Input.GetMouseButtonUp(0)) //Checks for cursor locked mode updates
{
Cursor.lockState = cursorLocked ? CursorLockMode.Locked : CursorLockMode.None;
Cursor.visible = !cursorLocked;
}
}
private void OnDisable()
{
Cursor.lockState = CursorLockMode.None; // Disables cursor lock
Cursor.visible = true; // Sets cursor visible
}
void FixedUpdate() // Follow the target
{
if (target == null) // If we dont have a target
{
Debug.LogError("ameraFollow: NO TARGET FOUND");
return;
}
// If we do have a target
Vector3 tPos = new Vector3(target.position.x, target.position.y + yOffset, target.position.z);
transform.position = Vector3.Lerp(transform.position, tPos, followSpeed / 100); // Follow it
}
private void rotate()
{
if (Time.timeScale < float.Epsilon) // If we're on the right time scale
return;
var x = Input.GetAxis("Mouse X"); // Gets X mouse position
lookAngle += x * turnSpeed; // Multiplies mouse position by turning speed
targetRot = Quaternion.Euler(0f, lookAngle, 0f); // Creates a quaternion
if (rotationSmooting > 0)
{
transform.localRotation = Quaternion.Slerp(transform.localRotation, targetRot, rotationSmooting * Time.deltaTime); // Slerp between rotation
}
else
{
transform.localRotation = targetRot; // Sets rotation
}
}
private void goToStartRotation() // moves to start rotation
{
transform.localRotation = Quaternion.Slerp(transform.localRotation, startRotation, forceStartRotationSpeed* Time.deltaTime); // Slerp between rotation
}
}