summaryrefslogtreecommitdiff
path: root/SurvivalTest/Assets/Scripts/Managers/PlayerManager_Weapons.cs
diff options
context:
space:
mode:
Diffstat (limited to 'SurvivalTest/Assets/Scripts/Managers/PlayerManager_Weapons.cs')
-rw-r--r--SurvivalTest/Assets/Scripts/Managers/PlayerManager_Weapons.cs140
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