wangguan
2020-12-11 1fd1bcaa2fe70eb6a8f5a79cbd946a42d029dd7f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using MoreMountains.NiceVibrations;
using TMPro;
using DG.Tweening;
using Core.Utilities;
 
/**
 * 无尽模式玩家基地血量管理器
 * @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 Text hpTxt;
 
        [SerializeField]
        private GameObject loseHeartPrefab;
 
        private bool isPlayLoseHeartDone = true;
 
        [SerializeField]
        private Image heartImg;
 
        private Timer timer;
 
        // Start is called before the first frame update
        private void Start()
        {
            CurrentHP = TotalHP = HeartList.Count;
            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)
        {
            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);
            TextMeshProUGUI 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);
            Destroy(obj, 0.6f);
        }
 
        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>();
            ps?.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; });
        }
    }
}