wangguan
2020-11-17 0817eca03c8050d61c3c1ff82338742e637d5573
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
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 static float EffectTime { get; private set; } = 1f;
 
        /// <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]);
            }
 
            PlayFreezeEffect(waveLineId);
 
            while (agentList.Count > 0)
            {
                Agent agent = agentList[0];
                agentList.Remove(agentList[0]);
 
                if (agent.isDead) continue;
 
                agent.addSpeedSlowRate(0.25f);
                agent.PlayOnHitImmediately();
                EndlessGameUI.instance.generateBloodText(agent.position, damage);
                agent.TakeDamage(damage, agent.position, alignmentProvider);
            }
        }
 
        private void PlayFreezeEffect(int waveLineId)
        {
            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();
        }
    }
}