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; });
}
}
}