using System.Collections; using System.Collections.Generic; using UnityEngine; using Cinemachine; using Sirenix.OdinInspector; using UnityEngine.InputSystem; using DG.Tweening; /// /// 震动管理员,管理相机和手柄的震动,外部调用静态方法 /// public class VibrationManager : MonoBehaviour { public enum PadShakeitem{ 移动, 跳跃, 锤子击中, 被击中, 发射镰刀, 挥动锤子, 木马移动, 反弹炸弹, 撞钟攻击, 伸手拿钱 } /// /// 不会停下的震动的编号 /// public List doNotStopShakeNum; /// /// 还接待新的震动吗? /// private bool tradeable = true; public PadShakeitem itemNow; /// /// 是否处于特洛伊Boss关 /// public bool inHorseStage; void Start(){ doNotStopShakeNum = new List(); doNotStopShakeNum.Add(PadShakeitem.撞钟攻击); doNotStopShakeNum.Add(PadShakeitem.伸手拿钱); } /// /// 震动相机,仅对于一些微小短小震动使用 /// /// 震动方向 /// 震动力度 public void ShakeScream(Vector2 dir,float force){ GetComponent(). GenerateImpulse(dir * force); } /// /// 震动手柄 /// /// 左马达力度(低频) /// 右马达力度(高频) /// 震动时间 /// 震动原因 public IEnumerator ShakePad(float left, float right, float time, PadShakeitem item){ if(Gamepad.current != null){ //只有处于可接待状态时,才接待震动 if(tradeable){ //记录震动项目并开始震动 itemNow = item; Gamepad.current.SetMotorSpeeds(left,right); } //如果该项目是不可被打断列表中记录着的 if(doNotStopShakeNum.Contains(item)){ //标记自身不再接待新的震动 tradeable = false; } //Debug.Log("正在开始"+item+"的震动"); yield return new WaitForSeconds(time); //只有震动项目和震动原因相同的时候,才会触发停止震动 //用来解决震动的覆盖问题 if(itemNow == item){ //Debug.Log("正在结束"+item+"的震动"); Gamepad.current.SetMotorSpeeds(0,0); if(inHorseStage)HorseShakePad(); tradeable = true; } } } /// /// 木马震动,屏幕轻微快速上下震动 /// public void HorseShakeScream(){ transform.Find("木马震动源"). GetComponent().m_ImpulseDefinition.m_AmplitudeGain = 0.1f; transform.Find("木马震动源"). GetComponent(). GenerateImpulse(); } /// /// 木马别他妈震了 /// [ContextMenu("Stop")] public void StopHorseShakeScream(){ try{ transform.Find("木马震动源"). GetComponent().m_ImpulseDefinition.m_AmplitudeGain = 0f; } catch (System.Exception){ Debug.Log("没有木马"); } } /// /// 撞钟攻击调用,屏幕中幅度震动 /// public void BellShakeScream(){ transform.Find("撞钟震动源"). GetComponent(). GenerateImpulse(); } public void HorseShakePad(){ StartCoroutine(ShakePad(0f,0.1f,20f,PadShakeitem.木马移动)); } /// /// 想要触发一个短时间的子弹时间,Call这个.时空震动也是震动,操你妈 /// public void TimeSlow(){ Time.timeScale = 0.3f; StartCoroutine(TimeRecover()); } public IEnumerator TimeRecover(){ yield return new WaitForSeconds(0f); DOTween.To( () => Time.timeScale, x => Time.timeScale = x, 1f, 0.2f ); } }