Files
2024-10-16 00:03:41 +08:00

65 lines
3.5 KiB
C#

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<CinemachineVirtualCamera>();
this._basicMultiChannelPerlin = this._virtualCamera.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
if (this._basicMultiChannelPerlin == null)
{
this._basicMultiChannelPerlin = this._virtualCamera.AddCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
}
this._basicMultiChannelPerlin.m_NoiseProfile = UnityEngine.Resources.Load<NoiseSettings>("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;
}
}
}