using DG.Tweening; using UnityEngine; /// /// 技能状态 /// public enum E_SkillType { /// /// 初始状态 /// Init, /// /// 释放中 /// Releaseing, /// /// 释放结束 /// Over, } /// /// 技能 /// public class Skill : MonoBehaviour { /// /// 技能id /// public string skillId; /// /// 玩家 /// public Player player; /// /// 技能车 /// private SkillCar skillCar; /// /// 持续时间 /// private float timeOfDuration; /// /// 额外速度 /// private float extraSpeed; /// /// 是否是随机技能 /// private bool isRandomSkill; /// /// 技能状态 /// public E_SkillType e_SkillType = E_SkillType.Init; /// /// 清除 /// public void Clear() { isRandomSkill = false; e_SkillType = E_SkillType.Init; SkillInit(); player.skinCar.gameObject.SetActive(true); player.skinCar.StopFlashing(); extraSpeed = 0; timeOfDuration = 0; if (skillCar != null) { skillCar.StopFlashing(); CachePoolManager.Instance.Put(skillCar.gameObject); } } /// /// 释放技能 /// public void ReleaseSkills(string skillId) { if (e_SkillType != E_SkillType.Init) return; Scenes.Instance.gameScene.useSkillNumber++; isRandomSkill = true; UIManager.Instance.GetUI().SetRandomSkillBtn(false); e_SkillType = E_SkillType.Releaseing; this.skillId = skillId; switch (skillId) { case "Skill_1": MudTanker(); player.SetGameCamear(true); break; case "Skill_2": Ambulance(); break; case "Skill_3": Invincible(); break; case "Skill_4": BloodReturn(); break; } SetState(); } /// /// 释放技能 /// public void ReleaseSkills() { if (e_SkillType != E_SkillType.Init) return; Scenes.Instance.gameScene.useSkillNumber++; if (player.skillEnergy >= UserDataManager.Instance.GetEnergesis()) { UIManager.Instance.GetUI().SetRandomSkillBtn(false); GuidanceManger.Instance.UseSkillguidanceOver(); player.SetEnergy(); e_SkillType = E_SkillType.Releaseing; skillId = UserDataManager.Instance.userData.skillId; switch (UserDataManager.Instance.userData.skillId) { case "Skill_1": MudTanker(); player.SetGameCamear(true); break; case "Skill_2": Ambulance(); break; case "Skill_3": Invincible(); break; case "Skill_4": BloodReturn(); break; } if (!UserDataManager.Instance.userData.skillData.ContainsKey(UserDataManager.Instance.userData.skillId)) { UserDataManager.Instance.AddTryOutSlill(UserDataManager.Instance.userData.skillId); } SetState(); } } /// /// 设置状态 /// private void SetState() { switch (e_SkillType) { case E_SkillType.Init: SkillInit(); if (skillCar != null) { CachePoolManager.Instance.Put(skillCar.gameObject); skillCar = null; GenerateMorph(); } break; case E_SkillType.Releaseing: if (skillId == "Skill_4") { timeOfDuration = 0.5f; } else { timeOfDuration = UserDataManager.Instance.GetAlreadyHaveTimeOfDuration(skillId); } CountDown(); break; case E_SkillType.Over: if (player.isBloodReturn) { e_SkillType = E_SkillType.Init; SetState(); UIManager.Instance.GetUI().SetRandomSkillBtn(true); } else { if (skillCar != null) { skillCar.Flashing(() => { e_SkillType = E_SkillType.Init; SetState(); UIManager.Instance.GetUI().SetRandomSkillBtn(true); GuidanceManger.Instance.SkillOver(); }); } else { player.skinCar.Flashing("ghost", () => { e_SkillType = E_SkillType.Init; SetState(); UIManager.Instance.GetUI().SetRandomSkillBtn(true); }); } } break; } } /// /// 技能初始 /// public void SkillInit() { switch (skillId) { case "Skill_1": if (player.isSprint) { player.skinCar.gameObject.SetActive(true); player.SetGameCamear(false); player.moveSpeed -= extraSpeed; player.isSprint = false; UIManager.Instance.GetUI()?.SpeedFXClear(); AudioManager.Instance.ClearIndividually("MudTankerGroundNoise", true, 0.5f); } break; case "Skill_2": if (player.isAmbulance) { player.skinCar.gameObject.SetActive(true); AudioManager.Instance.ClearIndividually("PoliceWhistle", true, 0.5f); player.isAmbulance = false; } break; case "Skill_3": if (player.isInvincible) { player.isInvincible = false; player.skinCar.BodyRecovery(); } break; case "Skill_4": if (player.isBloodReturn) { player.isBloodReturn = false; player.FireInit(); player.SetHp(); } break; } } /// /// 倒计时 /// private void CountDown() { if (e_SkillType == E_SkillType.Releaseing && !player.isDie) { float second = timeOfDuration; DOTween.To(() => timeOfDuration, x => timeOfDuration = x, 0, second).OnUpdate(() => { if (!isRandomSkill) { UIManager.Instance.GetUI().SetSkillEnergy(timeOfDuration, second); } if (timeOfDuration <= 0) { isRandomSkill = false; e_SkillType = E_SkillType.Over; SetState(); } }); } } /// /// 泥罐车 /// private void MudTanker() { player.skinCar.gameObject.SetActive(false); AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "TransfigurationMudTanker")); AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "MudTankerGroundNoise"), true); UIManager.Instance.GetUI().GenerateSpeedFX(); player.isSprint = true; extraSpeed = 20; player.moveSpeed += extraSpeed; skillCar = CachePoolManager.Instance.Take(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "MudTanker")).GetComponent(); skillCar.transform.SetParent(player.carNode); skillCar.transform.localPosition = Vector3.zero; skillCar.transform.localEulerAngles = Vector3.zero; } /// /// 救护车 /// private void Ambulance() { player.skinCar.gameObject.SetActive(false); AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "TransfigurationMudTanker")); AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "PoliceWhistle"), true); GenerateMorph(); player.isAmbulance = true; skillCar = CachePoolManager.Instance.Take(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "Ambulance")).GetComponent(); skillCar.transform.SetParent(player.carNode); skillCar.transform.localPosition = Vector3.zero; skillCar.transform.localEulerAngles = Vector3.zero; (skillCar as Ambulance).PoliceWhistle(); } /// /// 无敌 /// public void Invincible() { AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "Invincible")); GenerateMorph(); player.isInvincible = true; player.skinCar.BodyTransparency(); } /// /// 回血 /// public void BloodReturn() { AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "BloodReturn")); player.isBloodReturn = true; GameObject fx_health = CachePoolManager.Instance.Take(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "fx_health")); fx_health.transform.SetParent(this.transform); fx_health.transform.localPosition = Vector3.zero; fx_health.transform.localScale = Vector3.one * 3; } /// /// 生成烟雾特效 /// private void GenerateMorph() { AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "ReleaseComplete")); GameObject morphObj = CachePoolManager.Instance.Take(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "fx_morph")); morphObj.transform.SetParent(this.transform); morphObj.transform.localPosition = Vector3.zero + Vector3.up * 2 + transform.right * 2; morphObj.transform.localScale = Vector3.one; } }