using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using Core.Utilities;
|
using UnityEngine.UI;
|
using TMPro;
|
using DG.Tweening;
|
using TowerDefense.Agents;
|
using TowerDefense.UI.HUD;
|
|
/**
|
* 无尽模式分数管理器
|
* @Author: chenxin
|
* @Date: 2020-11-10 13:43:54
|
*/
|
namespace KTGMGemClient
|
{
|
public class EndlessScoreManager : Singleton<EndlessScoreManager>
|
{
|
public TextMeshProUGUI ScoreText;
|
|
private int score;
|
|
/// <summary>
|
/// 数字滚动时间
|
/// </summary>
|
public float RollTime { get; set; } = 0.4f;
|
|
public GameObject DoubleHit;
|
|
public Text DoubleHitText;
|
|
public Image OneTimeKillObj;
|
|
public Text OneTimeKillText;
|
|
/// <summary>
|
/// 连击的CD时间
|
/// </summary>
|
private float doubleHitCD = 0.8f;
|
|
private float remainTime;
|
|
/// <summary>
|
/// 连击次数
|
/// </summary>
|
public int DoubleHitCount { get; private set; }
|
|
/// <summary>
|
/// 连击是否开启
|
/// </summary>
|
private bool openDoubleHit;
|
|
private CanvasGroup canvasGroup;
|
|
private int CurrentScore
|
{
|
get { return score; }
|
set
|
{
|
score = value;
|
ScoreText.text = score.ToString().PadLeft(7, '0');
|
}
|
}
|
|
// Start is called before the first frame update
|
private void Start()
|
{
|
Init();
|
EventCenter.Ins.Add<int>((int)KTGMGemClient.EventType.EndlessAgentDead, AgentDead);
|
EventCenter.Ins.Add((int)KTGMGemClient.EventType.EndlessOneHit, OnHit);
|
EventCenter.Ins.Add<int>((int)KTGMGemClient.EventType.EndlessOneTimeKillCount, OnTimeKill);
|
canvasGroup = DoubleHit.GetComponent<CanvasGroup>();
|
}
|
|
/// <summary>
|
/// 一次性击杀
|
/// </summary>
|
/// <param name="count"></param>
|
private void OnTimeKill(int count)
|
{
|
Debug.Log($"--------------------- 一次性击杀个数:{count} ---------------------");
|
if (count >= 10)
|
{
|
AddScore(500);
|
ShowOneTimeKill(10, 500);
|
}
|
else if (count >= 8)
|
{
|
AddScore(200);
|
ShowOneTimeKill(8, 200);
|
}
|
else if (count >= 5)
|
{
|
AddScore(100);
|
ShowOneTimeKill(5, 100);
|
}
|
}
|
|
private void AgentDead(int point)
|
{
|
if (EndlessGameUI.instance.state == EndlessGameUI.State.GameOver) return;
|
AddScore(point);
|
}
|
|
// Update is called once per frame
|
private void Update()
|
{
|
if (openDoubleHit)
|
{
|
if (remainTime <= 0)
|
{
|
openDoubleHit = false;
|
DoubleHitCount = 0;
|
HideDoubleHit();
|
}
|
else
|
remainTime -= Time.deltaTime;
|
}
|
}
|
|
/// <summary>
|
/// 一次击打
|
/// </summary>
|
private void OnHit()
|
{
|
++DoubleHitCount;
|
openDoubleHit = true;
|
DoubleHitText.text = $"{DoubleHitCount}";
|
if (DoubleHitCount >= 10)
|
ShowDoubleHit();
|
remainTime = doubleHitCD;
|
|
// 策划说先写死吧
|
if (DoubleHitCount == 50)
|
{
|
AddScore(200);
|
FloatDoubleHitReward(200);
|
}
|
else if (DoubleHitCount == 100)
|
{
|
AddScore(500);
|
FloatDoubleHitReward(500);
|
}
|
else if (DoubleHitCount == 200)
|
{
|
AddScore(1500);
|
FloatDoubleHitReward(1500);
|
}
|
}
|
|
private void ShowDoubleHit()
|
{
|
canvasGroup.alpha = 1;
|
if (!DoubleHit.activeInHierarchy)
|
{
|
DoubleHit.SetActive(true);
|
DoubleHit.transform.localScale = Vector3.zero;
|
DOTween.To(() => DoubleHit.transform.localScale, (Vector3 v) => DoubleHit.transform.localScale = v, Vector3.one, 0.15f)
|
.SetEase(Ease.OutBack);
|
}
|
else
|
{
|
Sequence sequence = DOTween.Sequence();
|
sequence.Append(DOTween.To(() => DoubleHit.transform.localScale, (Vector3 v) => DoubleHit.transform.localScale = v, new Vector3(1.2f, 1.2f, 1.2f), 0.08f));
|
sequence.Append(DOTween.To(() => DoubleHit.transform.localScale, (Vector3 v) => DoubleHit.transform.localScale = v, Vector3.one, 0.05f));
|
}
|
}
|
|
private void HideDoubleHit()
|
{
|
if (!DoubleHit.activeInHierarchy) return;
|
|
DOTween.To(() => canvasGroup.alpha, (float v) => canvasGroup.alpha = v, 0, 0.3f);
|
}
|
|
/// <summary>
|
/// 显示一次性击杀飘字
|
/// </summary>
|
/// <param name="count"></param>
|
/// <param name="score"></param>
|
private void ShowOneTimeKill(int count, int score)
|
{
|
// OneTimeKillText.text = $"{count}连杀 +{score}";
|
// OneTimeKillObj.transform.localScale = Vector3.zero;
|
// OneTimeKillObj.SetActive(true);
|
// CanvasGroup cg = OneTimeKillObj.GetComponent<CanvasGroup>();
|
// DOTween.To(() => OneTimeKillObj.transform.localScale, (Vector3 v) => OneTimeKillObj.transform.localScale = v, Vector3.one, 0.2f);
|
// Tween t1 = DOTween.To(() => cg.alpha, (float v) => cg.alpha = v, 0f, 0.2f).SetDelay(2f);
|
// t1.OnComplete(OnShowOneTimeKillComplete);
|
Image obj = Instantiate(OneTimeKillObj);
|
obj.transform.SetParent(GameObject.Find("Panel").transform, false);
|
obj.sprite = Resources.Load<Sprite>($"UI/DoubleHit/hit_{count}");
|
Destroy(obj.gameObject, 0.59f);
|
}
|
|
private void OnShowOneTimeKillComplete()
|
{
|
// OneTimeKillObj.SetActive(false);
|
}
|
|
/// <summary>
|
/// 飘连击奖励分数
|
/// </summary>
|
/// <param name="score"></param>
|
private void FloatDoubleHitReward(int score)
|
{
|
|
}
|
|
public void ShowScore()
|
{
|
gameObject.SetActive(true);
|
}
|
|
public void HideScore()
|
{
|
gameObject.SetActive(false);
|
}
|
|
public void Init()
|
{
|
EndlessScoreData.CurrentSocre = 0;
|
score = 0;
|
ScoreText.text = EndlessScoreData.FormatScore;
|
HideDoubleHit();
|
}
|
|
/// <summary>
|
/// 增加分数
|
/// </summary>
|
/// <param name="score"></param>
|
public void AddScore(int score)
|
{
|
EndlessScoreData.CurrentSocre += score;
|
DOTween.To(() => CurrentScore, (int v) => CurrentScore = v, EndlessScoreData.CurrentSocre, RollTime).SetEase(Ease.Linear);
|
}
|
}
|
}
|