using Cinemachine; using Framework.Timer; using UnityEngine; namespace System.Game { [RequireComponent(typeof(CinemachineVirtualCamera))] public class CameraNode : ChooseEntity { public CameraType CameraType; private CinemachineVirtualCamera _virtualCamera; public CinemachineVirtualCamera VirtualCamera => this._virtualCamera; private CinemachineBasicMultiChannelPerlin _basicMultiChannelPerlin; private TimeHandler _timeHandler; protected override void OnInit() { this._virtualCamera = GetComponent(); this._basicMultiChannelPerlin = this._virtualCamera.GetCinemachineComponent(); if (this._basicMultiChannelPerlin == null) { this._basicMultiChannelPerlin = this._virtualCamera.AddCinemachineComponent(); } this._basicMultiChannelPerlin.m_NoiseProfile = UnityEngine.Resources.Load("Config/Shake"); this._basicMultiChannelPerlin.m_FrequencyGain = 0.85f; UpdateShake(0); } protected override void OnChangeState(bool isOn) { this._virtualCamera.Priority = isOn ? 20 : 10; base.OnChangeState(isOn); } public void SetShake(float inTime = 0, float time = 0, float outTime = 0, float scale = 0) { this._timeHandler?.Kill(); this._timeHandler = GameUpdateMgr.Instance.CreateTimer(inTime , () => { UpdateShake(scale); this._timeHandler = GameUpdateMgr.Instance.CreateTimer(time , () => { this._timeHandler = GameUpdateMgr.Instance.CreateTimer(outTime , () => { UpdateShake(0); } , f => { UpdateShake((1 - f) * scale); }); }); } , f => { UpdateShake(scale * f); }); } private void UpdateShake(float scale) { this._basicMultiChannelPerlin.m_AmplitudeGain = scale; } } }