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
|
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEngine;
namespace DS
{
public class CameraHandler : MonoBehaviour
{
public Transform cameraTransform;
public Transform targetTransform;
public Transform cameraPivotTransform;
private Transform _myTransform;
private Vector3 _cameraTransformPosition;
private LayerMask _ignoreLayers;
private Vector3 cameraFollowVelocity = Vector3.zero;
private bool _cursorLocked = false;
public static CameraHandler singleton;
public float lookSpeed = 0.1f;
public float followSpeed = 0.1f;
public float pivotSpeed = 0.03f;
private float _targetPosition;
private float _defaultPosition;
private float _lookAngle;
private float _pivotAngle;
public float minimumPivot = -35;
public float maximumPivot = 35;
public float cameraSphereRadius = 0.2f;
public float cameraCollisionOffSet = 0.2f;
public float minimumCollisionOffSet = 0.2f;
private void Awake()
{
singleton = this;
_myTransform = transform;
_defaultPosition = cameraTransform.localPosition.z;
_ignoreLayers = ~(1 << 8 | 1 << 9 | 1 << 10);
}
private void Update()
{
UpdateCursorLock();
}
private void UpdateCursorLock()
{
if (Input.GetMouseButtonDown(0))
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
_cursorLocked = true;
}
if (Input.GetKeyDown(KeyCode.Escape))
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
_cursorLocked = false;
}
}
public void FollowTarget(float delta)
{
Vector3 targetPosition = Vector3.SmoothDamp(_myTransform.position, targetTransform.position,
ref cameraFollowVelocity, delta / followSpeed);
_myTransform.position = targetPosition;
HandleCameraCollisions(delta);
}
public void HandleCameraRotation(float delta, float mouseInputX, float mouseInputY)
{
if (!_cursorLocked)
return;
_lookAngle += (mouseInputX * lookSpeed) / delta;
_pivotAngle -= (mouseInputY * pivotSpeed) / delta;
_pivotAngle = Mathf.Clamp(_pivotAngle, minimumPivot, maximumPivot);
Vector3 rotation = Vector3.zero;
rotation.y = _lookAngle;
Quaternion targetRotation = Quaternion.Euler(rotation);
_myTransform.rotation = targetRotation;
rotation = Vector3.zero;
rotation.x = _pivotAngle;
targetRotation = Quaternion.Euler(rotation);
cameraPivotTransform.localRotation = targetRotation;
}
public void HandleCameraCollisions(float delta)
{
_targetPosition = _defaultPosition;
RaycastHit hit;
Vector3 direction = cameraTransform.position - cameraPivotTransform.position;
direction.Normalize();
if (Physics.SphereCast(cameraPivotTransform.position,cameraSphereRadius,direction,out hit,Mathf.Abs(_targetPosition)))
{
float dis = Vector3.Distance(cameraPivotTransform.position, hit.point);
_targetPosition = -(dis - cameraCollisionOffSet);
}
if (Mathf.Abs(_targetPosition) < minimumCollisionOffSet)
{
_targetPosition = -minimumCollisionOffSet;
}
_cameraTransformPosition.z = Mathf.Lerp(cameraTransform.localPosition.z, _targetPosition, delta / 0.2f);
cameraTransform.localPosition = _cameraTransformPosition;
}
}
}
|