diff options
Diffstat (limited to 'SurvivalTest/Assets/Scripts/Managers/PlayerManager_Weapons.cs')
-rw-r--r-- | SurvivalTest/Assets/Scripts/Managers/PlayerManager_Weapons.cs | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/SurvivalTest/Assets/Scripts/Managers/PlayerManager_Weapons.cs b/SurvivalTest/Assets/Scripts/Managers/PlayerManager_Weapons.cs new file mode 100644 index 0000000..381beb8 --- /dev/null +++ b/SurvivalTest/Assets/Scripts/Managers/PlayerManager_Weapons.cs @@ -0,0 +1,140 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public partial class PlayerManager : Singleton<PlayerManager> +{ + // 持有的装备 + public List<WeaponBase> weapons { get { return m_Weapons; } } + private List<WeaponBase> m_Weapons = new List<WeaponBase>(); + + 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 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()); + + m_AutoFire = false; + + m_LastAxisValue = Input.GetAxisRaw("GunTrigger"); + } + + /// <summary> + /// 装备循环 + /// </summary> + void UpdateWeapons() + { + for(int i = 0; i < m_Weapons.Count; ++i) + { + m_Weapons[i].Update(m_Crew.gameObject); + } + } + + /// <summary> + /// 检查输入,使用装备 + /// </summary> + 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_Weapons.ForEach(e => e.OnStop(m_Crew.gameObject)); + m_CoFire = null; + } + } + } + + /// <summary> + /// 自由开火 + /// </summary> + /// <returns></returns> + 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; + } + } + +}
\ No newline at end of file |