350 lines
11 KiB
C#
350 lines
11 KiB
C#
|
|
using DG.Tweening;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>״̬
|
|||
|
|
/// </summary>
|
|||
|
|
public enum E_SkillType
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ʼ״̬
|
|||
|
|
/// </summary>
|
|||
|
|
Init,
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ͷ<EFBFBD><CDB7><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
Releaseing,
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ͷŽ<CDB7><C5BD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
Over,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public class Skill : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>id
|
|||
|
|
/// </summary>
|
|||
|
|
public string skillId;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public Player player;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>ܳ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private SkillCar skillCar;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
|
/// </summary>
|
|||
|
|
private float timeOfDuration;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private float extraSpeed;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private bool isRandomSkill;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>״̬
|
|||
|
|
/// </summary>
|
|||
|
|
public E_SkillType e_SkillType = E_SkillType.Init;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>
|
|||
|
|
/// </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>
|
|||
|
|
/// <20>ͷż<CDB7><C5BC><EFBFBD>
|
|||
|
|
/// </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>
|
|||
|
|
/// <20>ͷż<CDB7><C5BC><EFBFBD>
|
|||
|
|
/// </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>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>״̬
|
|||
|
|
/// </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>
|
|||
|
|
/// <20><><EFBFBD>ܳ<EFBFBD>ʼ
|
|||
|
|
/// </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>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ʱ
|
|||
|
|
/// </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>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>
|
|||
|
|
/// </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>
|
|||
|
|
/// <20>Ȼ<EFBFBD><C8BB><EFBFBD>
|
|||
|
|
/// </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>
|
|||
|
|
/// <20><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public void Invincible()
|
|||
|
|
{
|
|||
|
|
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(PackagesName.GameData, "Invincible"));
|
|||
|
|
GenerateMorph();
|
|||
|
|
player.isInvincible = true;
|
|||
|
|
player.skinCar.BodyTransparency();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>Ѫ
|
|||
|
|
/// </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>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
|
|||
|
|
/// </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;
|
|||
|
|
}
|
|||
|
|
}
|