chenxin
2020-11-20 5e61bf3fc6c438beb0a6470518aee73f30ff0b35
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
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using TowerDefense.Level;
using Core.Utilities;
using TowerDefense.Agents;
using Core.Health;
using TowerDefense.UI.HUD;
 
/**
 * 水精灵技能-冷冻气息控制脚本
 * @Author: chenxin
 * @Date: 2020-11-12 14:41:23
 */
namespace KTGMGemClient
{
    public class FreezeBreath : MonoBehaviour
    {
        public Image ProgressImg;
 
        private int currentProgress;
 
        /// <summary>
        /// 充能时间(s)
        /// </summary>
        public static float ChargeTime { get; private set; } = 10f;
 
        /// <summary>
        /// 伤害时间
        /// </summary>
        public float EffectTime { get; private set; } = 2f;
 
        /// <summary>
        /// 伤害结算次数
        /// </summary>
        /// <value></value>
        public int DamageCount { get; private set; } = 6;
 
        /// <summary>
        /// 整个技能时间
        /// </summary>
        public float SkillTime { get; private set; } = 2.5f;
 
        /// <summary>
        /// 当前的充能进度
        /// </summary>
        public int CurrentProgress { get; private set; }
 
        /// <summary>
        /// 喷冰特效
        /// </summary>
        public GameObject FreezeJet;
 
        public int ReleaseCount { get; set; }
 
        public void SetCtrlProgress(int progress)
        {
            if (progress == (int)Mathf.Floor(ChargeTime))
                progress = 0;
 
            ProgressImg.rectTransform.DOKill();
            SetProgress(progress, false);
        }
 
        public void SetProgress(int progress, bool ani = true)
        {
            if (CurrentProgress == progress) return;
 
            CurrentProgress = progress;
            ProgressImg.rectTransform.DOScaleY(progress / ChargeTime, ani ? 0.3f : 0);
        }
 
        public void SetProgress(float progress)
        {
            ProgressImg.rectTransform.DOScaleY(progress / ChargeTime, 0);
            CurrentProgress = (int)Mathf.Floor(progress);
        }
 
        /// <summary>
        /// 释放冷冻气息
        /// </summary>
        /// <param name="waveLineId">哪条兵线</param>
        /// <param name="damage">伤害值</param>
        public void ReleaseFreeze(int waveLineId, float damage, IAlignmentProvider alignmentProvider)
        {
            WaveLineAgentInsMgr[] agentInsMgrs = AgentInsManager.instance.GetWaveLineList();
            WaveLineAgentInsMgr waveLineAgentInsMgr = agentInsMgrs[waveLineId];
            List<Agent> list = waveLineAgentInsMgr.listAgent;
 
            if (list.Count == 0) return;
 
            List<Agent> agentList = new List<Agent>();
 
            for (int i = 0; i < list.Count; ++i)
            {
                agentList.Add(list[i]);
            }
 
            // 一次性死亡数量
            int deathCount = 0;
 
            while (agentList.Count > 0)
            {
                Agent agent = agentList[0];
                agentList.Remove(agentList[0]);
 
                if (agent.isDead) continue;
 
                if (agent.AgentType == SpawnAgentType.Normal)
                {
                    agent.addSpeedSlowRate(0.15f);
                    agent.PlayOnHitImmediately();
                    EndlessGameUI.instance.generateBloodText(agent.position, damage);
                    agent.TakeDamage(damage, agent.position, alignmentProvider);
 
                    if (agent.isDead)
                        ++deathCount;
                }
                else if (agent.AgentType == SpawnAgentType.BubbleBomb)
                    EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBossSkillBubbleBombGetHit, (agent as BubbleBombAgent).Id);
            }
 
            if (deathCount > 1)
                EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessOneTimeKillCount, deathCount);
        }
 
        public void PlayFreezeEffect(int waveLineId)
        {
            WaveLineAgentInsMgr[] agentInsMgrs = AgentInsManager.instance.GetWaveLineList();
            WaveLineAgentInsMgr waveLineAgentInsMgr = agentInsMgrs[waveLineId];
            List<Agent> list = waveLineAgentInsMgr.listAgent;
 
            if (list.Count == 0) return;
 
            GameObject obj = Poolable.TryGetPoolable(FreezeJet);
            ParticleSystem ps = obj.GetComponent<ParticleSystem>();
 
            if (ps == null) ps = obj.transform.GetChild(0).GetComponent<ParticleSystem>();
 
            ps.transform.position = EndlessLevelManager.instance.WaveManager.GetWaveEndPos(waveLineId);
            ps.Play();
        }
    }
}