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;
}
}