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 { public TextMeshProUGUI ScoreText; private int score; /// /// 数字滚动时间 /// public float RollTime { get; set; } = 0.4f; public GameObject DoubleHit; public Text DoubleHitText; public Image OneTimeKillObj; public Text OneTimeKillText; /// /// 连击的CD时间 /// private float doubleHitCD = 0.8f; private float remainTime; /// /// 连击次数 /// public int DoubleHitCount { get; private set; } /// /// 连击是否开启 /// 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)KTGMGemClient.EventType.EndlessAgentDead, AgentDead); EventCenter.Ins.Add((int)KTGMGemClient.EventType.EndlessOneHit, OnHit); EventCenter.Ins.Add((int)KTGMGemClient.EventType.EndlessOneTimeKillCount, OnTimeKill); canvasGroup = DoubleHit.GetComponent(); } /// /// 一次性击杀 /// /// 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(Agent agent) { if (EndlessGameUI.instance.state == EndlessGameUI.State.GameOver) return; AddScore(agent.EnemyData.point); } // Update is called once per frame private void Update() { if (openDoubleHit) { if (remainTime <= 0) { openDoubleHit = false; DoubleHitCount = 0; HideDoubleHit(); } else remainTime -= Time.deltaTime; } } /// /// 一次击打 /// 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); } /// /// 显示一次性击杀飘字 /// /// /// private void ShowOneTimeKill(int count, int score) { // OneTimeKillText.text = $"{count}连杀 +{score}"; // OneTimeKillObj.transform.localScale = Vector3.zero; // OneTimeKillObj.SetActive(true); // CanvasGroup cg = OneTimeKillObj.GetComponent(); // 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($"UI/DoubleHit/hit_{count}"); Animator animator = obj.GetComponent(); AnimatorClipInfo[] animatorClipInfos = animator.GetCurrentAnimatorClipInfo(0); Destroy(obj.gameObject, animatorClipInfos[0].clip.length); } private void OnShowOneTimeKillComplete() { // OneTimeKillObj.SetActive(false); } /// /// 飘连击奖励分数 /// /// 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(); } /// /// 增加分数 /// /// public void AddScore(int score) { EndlessScoreData.CurrentSocre += score; DOTween.To(() => CurrentScore, (int v) => CurrentScore = v, EndlessScoreData.CurrentSocre, RollTime).SetEase(Ease.Linear); } } }