-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCameraShaker.cs
84 lines (66 loc) · 2.96 KB
/
CameraShaker.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
using Cinemachine;
using UnityEngine;
using DG.Tweening;
using DerailedDeliveries.Framework.Train;
using DerailedDeliveries.Framework.StateMachine;
using DerailedDeliveries.Framework.StateMachine.States;
namespace DerailedDeliveries.Framework.Camera
{
/// <summary>
/// Class responsible for shaking the camera depending on the speed of the train.
/// </summary>
[RequireComponent(typeof(CinemachineVirtualCamera))]
public class CameraShaker : MonoBehaviour
{
[SerializeField]
private TrainController _trainController;
[SerializeField]
private float _badRailSplitShakeFrequencyPenalty = 0.04f;
[SerializeField]
private float _ShakeFrequencyDuration = 1f;
private CinemachineVirtualCamera _trainCamera;
private CinemachineBasicMultiChannelPerlin _multiChannelPerlin;
private float _startCameraNoiseAmplitude;
private float _startCameraNoiseFrequency;
private void OnEnable() => StateMachine.StateMachine.Instance.OnStateChanged += HandleStateChanged;
private void HandleStateChanged(State state)
{
if (state is not GameState)
return;
TrainEngine.Instance.OnSpeedChanged += HandleSpeedChanged;
_trainController.OnRailSplitChange += HandleRailSplitChanged;
}
private void OnDisable()
{
if(TrainEngine.Instance != null)
TrainEngine.Instance.OnSpeedChanged -= HandleSpeedChanged;
if(_trainController != null)
_trainController.OnRailSplitChange -= HandleRailSplitChanged;
if(StateMachine.StateMachine.Instance != null)
StateMachine.StateMachine.Instance.OnStateChanged -= HandleStateChanged;
}
private void Awake()
{
_trainCamera = GetComponent<CinemachineVirtualCamera>();
_multiChannelPerlin = _trainCamera.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
}
private void Start()
{
_startCameraNoiseAmplitude = _multiChannelPerlin.m_AmplitudeGain;
_startCameraNoiseFrequency = _multiChannelPerlin.m_FrequencyGain;
_multiChannelPerlin.m_AmplitudeGain = 0;
}
private void HandleRailSplitChanged(int trackID, bool badRailSplit)
{
float newCameraFrequency = badRailSplit ? _badRailSplitShakeFrequencyPenalty : _startCameraNoiseFrequency;
DOTween.To(() => _multiChannelPerlin.m_FrequencyGain, x
=> _multiChannelPerlin.m_FrequencyGain = x, newCameraFrequency, _ShakeFrequencyDuration);
}
private void HandleSpeedChanged(float newSpeed)
{
// Adjust Cinemachine noise amplitude gain based on current speed
float amplitudeGain = Mathf.Lerp(0f, _startCameraNoiseAmplitude, Mathf.Abs(newSpeed) / TrainEngine.Instance.MaxSpeed);
_multiChannelPerlin.m_AmplitudeGain = amplitudeGain;
}
}
}