wangguan
2020-12-24 c5679cb58551843e74d31a839de649f16885fa8b
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
using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;
using Core.Utilities;
using TowerDefense.Level;
 
/**
 * 无尽模式boss控制器
 * @Author: chenxin
 * @Date: 2020-10-30 16:40:54
 */
namespace KTGMGemClient
{
    public class EndlessBossCtrl : Singleton<EndlessBossCtrl>
    {
        /// <summary>
        /// boss动作
        /// </summary>
        private Animator BossAnimator;
 
        /// <summary>
        /// 动作状态
        /// </summary>
        public EndlessBossActionState ActionState { get; set; }
 
        public Image Title;
 
        private string titlePath = "UI/Endless/SkillTitle/";
 
        private ParticleSystem deadPS, deadMoney;
 
        private string prefabPath = "Prefabs/Boss/Boss_";
 
        private GameObject Body;
 
        // Start is called before the first frame update
        private void Start()
        {
            ColorVal = 0;
            EventCenter.Ins.Add<int>((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitle, Glint);
        }
 
        private void LateUpdate()
        {
            if (BossAnimator == null) return;
 
            AnimatorStateInfo stateInfo = BossAnimator.GetCurrentAnimatorStateInfo(0);
 
            if (stateInfo.IsName("Boss_Summon") && stateInfo.normalizedTime >= 1f)
            {
                EventCenter.Ins.BroadCast((int)EventType.EndlessBossSummonEnd);
                // 召唤动作结束后自动切换到站立状态
                ChangeState(EndlessBossActionState.Standing);
            }
            else if (stateInfo.IsName("Boss_Death") && stateInfo.normalizedTime >= 1f)
            {
                ClearBoss();
                EndlessLevelManager.instance.WaveManager.HideTunel();
            }
        }
 
        public void ClearBoss()
        {
            BossAnimator = null;
            deadPS = null;
            deadMoney = null;
 
            if (Body != null)
            {
                Destroy(Body);
                Body = null;
            }
        }
 
        private void Glint(int skillType)
        {
            Title.sprite = Resources.Load<Sprite>($"{titlePath}{skillType}");
            //设置一个DOTween队列
            Sequence flashSeq = DOTween.Sequence();
            Color c = Title.color;
            c.a = 0;
            Title.color = c;
            Title.gameObject.SetActive(true);
 
            flashSeq.Append(DOTween.To(() => ColorVal, (v) => ColorVal = v, 1, 0.3f));
            flashSeq.Append(DOTween.To(() => ColorVal, (v) => ColorVal = v, 0, 0.15f));
            flashSeq.Append(DOTween.To(() => ColorVal, (v) => ColorVal = v, 1, 0.3f));
            flashSeq.Append(DOTween.To(() => ColorVal, (v) => ColorVal = v, 0, 0.15f));
            flashSeq.Append(DOTween.To(() => ColorVal, (v) => ColorVal = v, 1, 0.3f));
            flashSeq.Append(DOTween.To(() => ColorVal, (v) => ColorVal = v, 0, 0.15f));
            flashSeq.AppendCallback(() => { EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitleCompleted); });
        }
 
        private float ColorVal
        {
            get { return Title.color.a; }
            set
            {
                Title.gameObject.SetActive(value != 0);
                Color c = Title.color;
                c.a = value;
                Title.color = c;
            }
        }
 
        /// <summary>
        /// 切换状态
        /// </summary>
        /// <param name="newState"></param>
        public void ChangeState(EndlessBossActionState newState)
        {
            ActionState = newState;
 
            if (newState == EndlessBossActionState.Death)
            {
                deadPS?.Play();
                deadMoney?.Play();
            }
            BossAnimator.SetInteger("State", (int)newState);
        }
 
        /// <summary>
        /// 刷新boss形象
        /// </summary>
        /// <param name="resId"></param>
        public void RefreshBody(int resId)
        {
            GameObject prefab = Resources.Load<GameObject>($"{prefabPath}{resId}");
 
            if (prefab == null)
            {
                Debug.LogError($"---- 加载boss资源出错,resId: {resId} ----");
                return;
            }
 
            Body = Instantiate(prefab);
            Body.transform.SetParent(transform, false);
            BossAnimator = Body.GetComponent<Animator>();
        }
    }
}