using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using MoreMountains.NiceVibrations; using TMPro; using DG.Tweening; using Core.Utilities; using System.Collections; /** * 无尽模式玩家基地血量管理器 * @Author: chenxin * @Date: 2020-11-05 15:33:11 */ namespace KTGMGemClient { public class EndlessHomeBaseHPManager : MonoBehaviour { /// /// 总血量 /// public int TotalHP { get; private set; } /// /// 当前血量 /// public int CurrentHP { get; private set; } /// /// 爱心列表 /// public List HeartList; public TextMeshProUGUI hpTxt; [SerializeField] private GameObject loseHeartPrefab; private bool isPlayLoseHeartDone = true; [SerializeField] private Image heartImg; private Timer timer; public ParticleSystem loseHeartPS;//心碎特效 private GameObject decreaseHeartObj;//掉血显示 // Start is called before the first frame update private void Start() { CurrentHP = TotalHP = 5; hpTxt.text = "x" + CurrentHP.ToString(); EventCenter.Ins.Add((int)KTGMGemClient.EventType.EndlessLoseHeart, LoseHeart); } public void Update() { if (timer != null) timer.Tick(Time.deltaTime); } /// /// 减少爱心 /// /// 一次减少的数量 private void LoseHeart(int count) { if (CurrentHP == 0) return; FloatLoseHeart(count); PlayLoseHeartEffect(); CurrentHP = Mathf.Max(0, CurrentHP - count); hpTxt.text = "x" + CurrentHP.ToString(); //ViewPortAdj.instance.cachedCamera.DOShakePosition(0.25f, 1.5f, 4);//这里只可以震动3D场景中的东西 ViewPortAdj.instance.DOShakePosition(); MMVibrationManager.Haptic(HapticTypes.HeavyImpact); if (CurrentHP == 0) EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessHeartAllLose); } /// /// 丢失爱心飘字 /// /// private void FloatLoseHeart(int count) { TextMeshProUGUI textMeshProUGUI; if (decreaseHeartObj != null) { textMeshProUGUI = decreaseHeartObj.transform.GetChild(0).GetComponent(); textMeshProUGUI.text = int.Parse(textMeshProUGUI.text) - count + ""; } else { GameObject prefab = Resources.Load("UI/DecreaseHeart"); GameObject obj = Instantiate(prefab); obj.transform.SetParent(GameObject.Find("UICamera/BottomCanvas/Panel/Bottom/CurrencyContainer").transform, false); obj.transform.localPosition = new Vector3(91.5f, 48.8f, 0f); obj.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f); decreaseHeartObj = obj; textMeshProUGUI = obj.transform.GetChild(0).GetComponent(); textMeshProUGUI.text = $"-{count}"; DOTween.To( () => obj.transform.localPosition.y, (float v) => { Vector3 pos = obj.transform.localPosition; pos.y = v; obj.transform.localPosition = pos; }, 70.9f, 0.3f); StartCoroutine(DestroyDecreaseHeart()); } //Destroy(obj, 0.6f); } IEnumerator DestroyDecreaseHeart() { yield return new WaitForSeconds(0.6f); Destroy(decreaseHeartObj); decreaseHeartObj = null; } private void PlayLoseHeartEffect() { if (!isPlayLoseHeartDone) return; heartImg.enabled = false; // GameObject obj = Instantiate(loseHeartPrefab); // obj.transform.SetParent(GameObject.Find("ParticleSystemObject").transform, false); // obj.transform.localPosition = new Vector3(-27.93f, 0f, -51.52f); // obj.transform.localScale = new Vector3(0.9f, 0.9f, 0.9f); // ParticleSystem ps = obj.transform.GetChild(0).GetComponent(); loseHeartPS?.Play(); timer = new Timer(0.6f, SpawnHeart); } private void SpawnHeart() { timer = null; if (CurrentHP == 0) return; heartImg.enabled = true; heartImg.transform.localScale = new Vector3(0f, 0f, 0f); DOTween.To( () => heartImg.transform.localScale, (Vector3 v) => heartImg.transform.localScale = v, new Vector3(1f, 1f, 1f), 0.3f ).SetEase((Ease.OutBack)) .OnComplete(() => { isPlayLoseHeartDone = true; }); } } }