350 lines
11 KiB
C#
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;
|
|
}
|
|
}
|