using System.Collections; using System.Collections.Generic; using UnityEngine; public partial class PlayerManager : Singleton { // 持有的装备 public List equips { get { return m_Equips; } } private List m_Equips = new List(); private Coroutine m_CoFire; public bool isFire { get; private set; } private bool m_AutoFire; private float m_AutoFireDuration = 0.8f; private float m_LastAxisValue = 0; void InitEquips() { m_Equips.Add(new Equip_LightSaber()); m_Equips.Add(new Equip_Gun()); m_Equips.Add(new Equip_GrenadeLauncher()); m_Equips.Add(new Equip_Boomerang()); m_Equips.Add(new Equip_TeslaCoil()); m_Equips.Add(new Equip_MightyGlove()); m_AutoFire = false; m_LastAxisValue = Input.GetAxisRaw("GunTrigger"); } /// /// 装备循环 /// void UpdateEquips() { for(int i = 0; i < m_Equips.Count; ++i) { m_Equips[i].Update(m_Crew.gameObject); } } /// /// 检查输入,使用装备 /// void CheckInput() { float axis = Input.GetAxisRaw("GunTrigger"); if (Input.GetButtonDown("Fire1") || (axis == 1 && m_LastAxisValue != 1)) { if(m_AutoFire) { m_AutoFire = false; } isFire = true; RunFireCoroutine(true); } if (!m_AutoFire && !Input.GetButton("Fire1") && (axis == 0 && m_LastAxisValue != 0)) { if (TinyCountDown.Instance.Get("ReleaseFire") > 0) { m_AutoFire = true; isFire = true; RunFireCoroutine(true); } else { TinyCountDown.Instance.Set("ReleaseFire", m_AutoFireDuration); isFire = false; RunFireCoroutine(false); } } m_LastAxisValue = axis; } void RunFireCoroutine(bool start) { if (start) { if (m_CoFire == null) { m_CoFire = GameApp.Instance.StartCoroutine(coFire()); } } else { if (m_CoFire != null) { GameApp.Instance.StopCoroutine(m_CoFire); m_Equips.ForEach(e => e.OnStop(m_Crew.gameObject)); m_CoFire = null; } } } /// /// 自由开火 /// /// IEnumerator coFire() { while (true) { for(int i = 0; i < m_Equips.Count; ++i) { EquipBase equip = m_Equips[i]; if (equip == null) continue; if(equip.autoMode == EquipBase.AutoMode.Interval) { string id = equip.GetHashCode().ToString(); float countDown = TinyCountDown.Instance.Get(id); // 倒计时脱离fire单独计时 if(countDown <= 0) { equip.OnTrigger(m_Crew.gameObject); TinyCountDown.Instance.Set(id, equip.interval); } else { } } else if(equip.autoMode == EquipBase.AutoMode.Condition) { if(equip.CheckCondition(m_Crew.gameObject)) { equip.OnTrigger(m_Crew.gameObject); } } } yield return null; } } }