-
Notifications
You must be signed in to change notification settings - Fork 2k
/
Copy pathCameraManager.cs
100 lines (77 loc) · 2.9 KB
/
CameraManager.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
using System;
using UnityEngine;
using Cinemachine;
using System.Collections;
public class CameraManager : MonoBehaviour
{
[SerializeField] private UnityEventBusSO eventBus;
public Camera mainCamera;
public CinemachineFreeLook freeLookVCam;
private bool _isRMBPressed;
[SerializeField, Range(.5f, 3f)]
private float _speedMultiplier = 1f; //TODO: make this modifiable in the game settings
[SerializeField] private TransformAnchor _cameraTransformAnchor = default;
[Header("Listening on channels")]
[Tooltip("The CameraManager listens to this event, fired by objects in any scene, to adapt camera position")]
[SerializeField] private TransformEventChannelSO _frameObjectChannel = default;
private bool _cameraMovementLock = false;
public void SetupProtagonistVirtualCamera(Transform target)
{
freeLookVCam.Follow = target;
freeLookVCam.LookAt = target;
freeLookVCam.OnTargetObjectWarped(target, target.position - freeLookVCam.transform.position - Vector3.forward);
}
private void OnEnable()
{
eventBus.Subscribe<CameraMoveEvent>(OnCameraMove);
eventBus.Subscribe<EnableMouseControlEvent>(OnEnableMouseControlCamera);
eventBus.Subscribe<DisableMouseControlEvent>(OnDisableMouseControlCamera);
if (_frameObjectChannel != null)
_frameObjectChannel.OnEventRaised += OnFrameObjectEvent;
_cameraTransformAnchor.Transform = mainCamera.transform;
}
private void OnDisable()
{
eventBus.Unsubscribe<CameraMoveEvent>(OnCameraMove);
eventBus.Unsubscribe<EnableMouseControlEvent>(OnEnableMouseControlCamera);
eventBus.Unsubscribe<DisableMouseControlEvent>(OnDisableMouseControlCamera);
if (_frameObjectChannel != null)
_frameObjectChannel.OnEventRaised -= OnFrameObjectEvent;
}
private void OnEnableMouseControlCamera(EnableMouseControlEvent evt)
{
_isRMBPressed = true;
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
StartCoroutine(DisableMouseControlForFrame());
}
IEnumerator DisableMouseControlForFrame()
{
_cameraMovementLock = true;
yield return new WaitForEndOfFrame();
_cameraMovementLock = false;
}
private void OnDisableMouseControlCamera(DisableMouseControlEvent evt)
{
_isRMBPressed = false;
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
// when mouse control is disabled, the input needs to be cleared
// or the last frame's input will 'stick' until the action is invoked again
freeLookVCam.m_XAxis.m_InputAxisValue = 0;
freeLookVCam.m_YAxis.m_InputAxisValue = 0;
}
private void OnCameraMove(CameraMoveEvent moveEvent)
{
if (_cameraMovementLock)
return;
if (moveEvent.IsDeviceMouse && !_isRMBPressed)
return;
freeLookVCam.m_XAxis.m_InputAxisValue = moveEvent.Movement.x * Time.deltaTime * _speedMultiplier;
freeLookVCam.m_YAxis.m_InputAxisValue = moveEvent.Movement.y * Time.deltaTime * _speedMultiplier;
}
private void OnFrameObjectEvent(Transform value)
{
SetupProtagonistVirtualCamera(value);
}
}