OvertakingLegend/Assets/Script/Skill.cs

350 lines
11 KiB
C#

using DG.Tweening;
using UnityEngine;
/// <summary>
/// 技能状态
/// </summary>
public enum E_SkillType
{
/// <summary>
/// 初始状态
/// </summary>
Init,
/// <summary>
/// 释放中
/// </summary>
Releaseing,
/// <summary>
/// 释放结束
/// </summary>
Over,
}
/// <summary>
/// 技能
/// </summary>
public class Skill : MonoBehaviour
{
/// <summary>
/// 技能id
/// </summary>
public string skillId;
/// <summary>
/// 玩家
/// </summary>
public Player player;
/// <summary>
/// 技能车
/// </summary>
private SkillCar skillCar;
/// <summary>
/// 持续时间
/// </summary>
private float timeOfDuration;
/// <summary>
/// 额外速度
/// </summary>
private float extraSpeed;
/// <summary>
/// 是否是随机技能
/// </summary>
private bool isRandomSkill;
/// <summary>
/// 技能状态
/// </summary>
public E_SkillType e_SkillType = E_SkillType.Init;
/// <summary>
/// 清除
/// </summary>
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);
}
}
/// <summary>
/// 释放技能
/// </summary>
public void ReleaseSkills(string skillId)
{
if (e_SkillType != E_SkillType.Init) return;
Scenes.Instance.gameScene.useSkillNumber++;
isRandomSkill = true;
UIManager.Instance.GetUI<GameUI>().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();
}
/// <summary>
/// 释放技能
/// </summary>
public void ReleaseSkills()
{
if (e_SkillType != E_SkillType.Init) return;
Scenes.Instance.gameScene.useSkillNumber++;
if (player.skillEnergy >= UserDataManager.Instance.GetEnergesis())
{
UIManager.Instance.GetUI<GameUI>().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();
}
}
/// <summary>
/// 设置状态
/// </summary>
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<GameUI>().SetRandomSkillBtn(true);
}
else
{
if (skillCar != null)
{
skillCar.Flashing(() =>
{
e_SkillType = E_SkillType.Init;
SetState();
UIManager.Instance.GetUI<GameUI>().SetRandomSkillBtn(true);
GuidanceManger.Instance.SkillOver();
});
}
else
{
player.skinCar.Flashing("ghost", () =>
{
e_SkillType = E_SkillType.Init;
SetState();
UIManager.Instance.GetUI<GameUI>().SetRandomSkillBtn(true);
});
}
}
break;
}
}
/// <summary>
/// 技能初始
/// </summary>
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<GameUI>()?.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;
}
}
/// <summary>
/// 倒计时
/// </summary>
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<GameUI>().SetSkillEnergy(timeOfDuration, second);
}
if (timeOfDuration <= 0)
{
isRandomSkill = false;
e_SkillType = E_SkillType.Over;
SetState();
}
});
}
}
/// <summary>
/// 泥罐车
/// </summary>
private void MudTanker()
{
player.skinCar.gameObject.SetActive(false);
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(PackagesName.GameData, "TransfigurationMudTanker"));
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(PackagesName.GameData, "MudTankerGroundNoise"), true);
UIManager.Instance.GetUI<GameUI>().GenerateSpeedFX();
player.isSprint = true;
extraSpeed = 20;
player.moveSpeed += extraSpeed;
skillCar = CachePoolManager.Instance.Take(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, "MudTanker")).GetComponent<SkillCar>();
skillCar.transform.SetParent(player.carNode);
skillCar.transform.localPosition = Vector3.zero;
skillCar.transform.localEulerAngles = Vector3.zero;
}
/// <summary>
/// 救护车
/// </summary>
private void Ambulance()
{
player.skinCar.gameObject.SetActive(false);
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(PackagesName.GameData, "TransfigurationMudTanker"));
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(PackagesName.GameData, "PoliceWhistle"), true);
GenerateMorph();
player.isAmbulance = true;
skillCar = CachePoolManager.Instance.Take(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, "Ambulance")).GetComponent<SkillCar>();
skillCar.transform.SetParent(player.carNode);
skillCar.transform.localPosition = Vector3.zero;
skillCar.transform.localEulerAngles = Vector3.zero;
(skillCar as Ambulance).PoliceWhistle();
}
/// <summary>
/// 无敌
/// </summary>
public void Invincible()
{
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(PackagesName.GameData, "Invincible"));
GenerateMorph();
player.isInvincible = true;
player.skinCar.BodyTransparency();
}
/// <summary>
/// 回血
/// </summary>
public void BloodReturn()
{
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(PackagesName.GameData, "BloodReturn"));
player.isBloodReturn = true;
GameObject fx_health = CachePoolManager.Instance.Take(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, "fx_health"));
fx_health.transform.SetParent(this.transform);
fx_health.transform.localPosition = Vector3.zero;
fx_health.transform.localScale = Vector3.one * 3;
}
/// <summary>
/// 生成烟雾特效
/// </summary>
private void GenerateMorph()
{
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(PackagesName.GameData, "ReleaseComplete"));
GameObject morphObj = CachePoolManager.Instance.Take(YooAssetManager.Instance.LoadAssetSync<GameObject>(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;
}
}