Files
taptap2024_GJ_chidouren/Assets/Scripts/System/CameraImpulseUtils.cs
2024-10-22 19:10:15 +08:00

106 lines
5.2 KiB
C#

using Cinemachine;
using Framework.Utils;
using Framework.Utils.SingletonTemplate;
using UnityEngine;
using CameraType = Framework.Utils.CameraType;
namespace System
{
public class CameraImpulseUtils : MgrBase<CameraImpulseUtils>
{
protected override void OnCreateMge()
{
var camera = CameraGroup.Instance.GetCamera(CameraType.Base);
// if (camera.GetComponent<CinemachineImpulseSource>() == null)
// {
// this._cineMachineNormalImpulseSource = camera.gameObject.AddComponent<CinemachineImpulseSource>();
// }
// else
// {
// this._cineMachineNormalImpulseSource = camera.GetComponent<CinemachineImpulseSource>();
// }
this._cineMachineLegacyImpulseSource = camera.transform.Find("ImpulsLegacy").GetComponent<CinemachineImpulseSource>();
this._cineMachineNormalImpulseSource = camera.transform.Find("ImpulsNormal").GetComponent<CinemachineImpulseSource>();
}
private CinemachineImpulseSource _cineMachineLegacyImpulseSource;
private CinemachineImpulseSource _cineMachineNormalImpulseSource;
/// <summary>
/// 设置默认震动方向
/// </summary>
/// <param name="vector"></param>
public void SetDefaultImpulseVector(Vector3 vector)
{
this._cineMachineNormalImpulseSource.m_DefaultVelocity = vector;
}
/// <summary>
/// 简易自定义震动
/// </summary>
/// <param name="time"></param>
/// <param name="vector"></param>
/// <param name="scale"></param>
/// <param name="impulseTypes"></param>
/// <param name="impulseShapes"></param>
public void SampleImpulseCamera(float time, Vector3 vector, float scale, CinemachineImpulseDefinition.ImpulseTypes impulseTypes, CinemachineImpulseDefinition.ImpulseShapes impulseShapes)
{
this._cineMachineNormalImpulseSource.m_ImpulseDefinition.m_ImpulseDuration = time;
this._cineMachineNormalImpulseSource.m_ImpulseDefinition.m_ImpulseType = impulseTypes;
this._cineMachineNormalImpulseSource.m_ImpulseDefinition.m_ImpulseShape = impulseShapes;
this._cineMachineNormalImpulseSource.GenerateImpulse(vector.normalized * scale);
}
public void SampleImpulseCamera (float time, Vector3 vector, float scale)
{
this._cineMachineNormalImpulseSource.m_ImpulseDefinition.m_ImpulseDuration = time;
this._cineMachineNormalImpulseSource.m_ImpulseDefinition.m_ImpulseType = CinemachineImpulseDefinition.ImpulseTypes.Legacy;
this._cineMachineNormalImpulseSource.m_ImpulseDefinition.m_ImpulseShape = CinemachineImpulseDefinition.ImpulseShapes.Bump;
this._cineMachineNormalImpulseSource.GenerateImpulse(vector.normalized * scale);
}
/// <summary>
/// 持续震动
/// </summary>
/// <param name="time"></param>
/// <param name="scale"></param>
public void UniformImpulseCamera(float time, float scale = 1, float inTime = 0, float outTime = 0 )
{
if (time <= 0 || scale == 0)
{
CinemachineImpulseManager.Instance.Clear();
return;
}
this._cineMachineLegacyImpulseSource.m_ImpulseDefinition.m_ImpulseDuration = time;
// this._cineMachineLegacyImpulseSource.m_ImpulseDefinition.m_ImpulseType = CinemachineImpulseDefinition.ImpulseTypes.Legacy;
this._cineMachineLegacyImpulseSource.m_ImpulseDefinition.m_DissipationMode = CinemachineImpulseManager.ImpulseEvent.DissipationMode.SoftDecay;
this._cineMachineLegacyImpulseSource.m_ImpulseDefinition.m_TimeEnvelope = new CinemachineImpulseManager.EnvelopeDefinition()
{
m_AttackTime = inTime,
m_DecayTime = outTime,
m_SustainTime = time,
};
this._cineMachineLegacyImpulseSource.GenerateImpulse(scale);
}
/// <summary>
/// 爆炸性震动
/// </summary>
/// <param name="time"></param>
/// <param name="scale"></param>
public void ExplosionImpulseCamera(float time, float scale = 1, float inTime = 0, float outTime = 0 )
{
this._cineMachineLegacyImpulseSource.m_ImpulseDefinition.m_ImpulseDuration = time;
// this._cineMachineLegacyImpulseSource.m_ImpulseDefinition.m_ImpulseType = CinemachineImpulseDefinition.ImpulseTypes.Legacy;
this._cineMachineLegacyImpulseSource.m_ImpulseDefinition.m_DissipationMode = CinemachineImpulseManager.ImpulseEvent.DissipationMode.ExponentialDecay;
// this._cineMachineLegacyImpulseSource.m_ImpulseDefinition.m_RawSignal = ;
this._cineMachineLegacyImpulseSource.m_ImpulseDefinition.m_TimeEnvelope = new CinemachineImpulseManager.EnvelopeDefinition()
{
m_AttackTime = inTime,
m_DecayTime = outTime,
m_SustainTime = time,
};
this._cineMachineLegacyImpulseSource.GenerateImpulse(scale);
}
}
}