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
|
{
|
/// <summary>
|
/// 总血量
|
/// </summary>
|
public int TotalHP { get; private set; }
|
|
/// <summary>
|
/// 当前血量
|
/// </summary>
|
public int CurrentHP { get; private set; }
|
|
/// <summary>
|
/// 爱心列表
|
/// </summary>
|
public List<GameObject> 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>((int)KTGMGemClient.EventType.EndlessLoseHeart, LoseHeart);
|
}
|
|
public void Update()
|
{
|
if (timer != null)
|
timer.Tick(Time.deltaTime);
|
}
|
|
/// <summary>
|
/// 减少爱心
|
/// </summary>
|
/// <param name="count">一次减少的数量</param>
|
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);
|
}
|
|
|
/// <summary>
|
/// 丢失爱心飘字
|
/// </summary>
|
/// <param name="count"></param>
|
private void FloatLoseHeart(int count)
|
{
|
TextMeshProUGUI textMeshProUGUI;
|
if (decreaseHeartObj != null)
|
{
|
textMeshProUGUI = decreaseHeartObj.transform.GetChild(0).GetComponent<TextMeshProUGUI>();
|
textMeshProUGUI.text = int.Parse(textMeshProUGUI.text) - count + "";
|
}
|
else
|
{
|
GameObject prefab = Resources.Load<GameObject>("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>();
|
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<ParticleSystem>();
|
|
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; });
|
}
|
}
|
}
|