chenxin
2020-12-17 df8c6633500f6c1c752f8a60025cda0e9909644c
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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; });
        }
    }
}