using System.Collections; using System.Collections.Generic; using UnityEngine; public partial class PlayerManager : Singleton { // 持有的装备 public List weapons { get { return m_Weapons; } } private List m_Weapons = new List(); private Coroutine m_CoFire; public bool isFire { get; private set; } private bool m_AutoFire; public bool autoFire { get { return m_AutoFire; } set { m_AutoFire = value; EventCenter.Instance.Publish(EventMsgType.ToggleAutoFire); } } private float autoFireDuration = 0.8f; public bool lockAim { get; set; } private float m_LastAxisValue = 0; void InitWeapons() { m_Weapons.Add(new Weapon_LightSaber()); m_Weapons.Add(new Weapon_Gun()); m_Weapons.Add(new Weapon_GrenadeLauncher()); m_Weapons.Add(new Weapon_Boomerang()); m_Weapons.Add(new Weapon_TeslaCoil()); m_Weapons.Add(new Weapon_MightyGlove()); autoFire = false; m_LastAxisValue = Input.GetAxisRaw("GunTrigger"); } /// /// 装备循环 /// void UpdateWeapons() { for(int i = 0; i < m_Weapons.Count; ++i) { m_Weapons[i].Update(m_Crew.gameObject); } } /// /// 检查输入,使用装备 /// void CheckInput() { float axis = Input.GetAxisRaw("GunTrigger"); if (Input.GetButtonDown("Fire1") || (axis == 1 && m_LastAxisValue != 1)) { if(autoFire) { autoFire = false; } isFire = true; RunFireCoroutine(true); } else if(!autoFire && !Input.GetButton("Fire1") && (axis == 0 && m_LastAxisValue != 0)) { if (TinyCountDown.Instance.Get("ReleaseFire") > 0) { autoFire = true; isFire = true; RunFireCoroutine(true); } else { autoFire = false; TinyCountDown.Instance.Set("ReleaseFire", 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_Weapons.ForEach(e => e.OnStop(m_Crew.gameObject)); m_CoFire = null; } } } /// /// 自由开火 /// /// IEnumerator coFire() { while (true) { for(int i = 0; i < m_Weapons.Count; ++i) { WeaponBase weapon = m_Weapons[i]; if (weapon == null) continue; if(weapon.autoMode == WeaponBase.AutoMode.Interval) { string id = weapon.GetHashCode().ToString(); float countDown = TinyCountDown.Instance.Get(id); // 倒计时脱离fire单独计时 if(countDown <= 0) { weapon.OnTrigger(m_Crew.gameObject); TinyCountDown.Instance.Set(id, weapon.interval); } else { } } else if(weapon.autoMode == WeaponBase.AutoMode.Condition) { if(weapon.CheckCondition(m_Crew.gameObject)) { weapon.OnTrigger(m_Crew.gameObject); } } } yield return null; } } }