少年修仙传客户端代码仓库
client_Wu Xijin
2019-04-12 5c6d49f48e70fd37919e948468a1c24d5aa2990e
System/MainWin/SkillButton.cs
@@ -6,7 +6,6 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.Events;
@@ -28,64 +27,32 @@
    public class SkillButton : SkillButtonInterface, IPointerExitHandler
    {
        [SerializeField] int m_Index;
        [SerializeField] SkillTurnplate m_SkillTurnplate;
        [SerializeField] Image m_Icon;
        public Image icon { get { return m_Icon; } }
        [SerializeField] ImageEx m_Icon;
        [SerializeField] Transform m_Locked;
        public Transform locked
        {
            get
            {
                return m_Locked;
            }
        }
        [SerializeField] Text m_CoolDown;
        [SerializeField] Image m_CoolDownMask;
        [SerializeField] ScaleTween m_ScaleTween;
        [SerializeField] Image m_Selected;
        [SerializeField] LongPressShowPanel m_SkillTip;
        [Header("遮罩是否反向")]
        public bool Isreverse = false;
        public Image icon { get { return m_Icon; } }
        public Transform locked { get { return m_Locked; } }
        UIEvent skillEvent1 = new UIEvent();
        UIEvent skillEvent2 = new UIEvent();
        bool isExit = false;
        float m_TotalCoolDown = 0f;
        public float totalCoolDown
        {
            get
            {
                return m_TotalCoolDown;
            }
            set
            {
                m_TotalCoolDown = value;
            }
        }
        float m_CoolDownCompleteTime = 0f;
        public float coolDownCompleteTime
        {
            get
            {
                return m_CoolDownCompleteTime;
            }
            set
            {
                m_CoolDownCompleteTime = value;
            }
        }
        bool inCountDown = false;
        float timer = 0f;
        PlayerSkillData m_SkillData = null;
        Skill skillBuf = null;
        float fillAmountRevise = 1f;
        int skillId = 0;
        public void SetSkillData(PlayerSkillData _skillData)
        public void SetSkill(int skillId)
        {
            m_SkillData = _skillData;
            if (m_SkillData == null)
            this.skillId = skillId;
            if (this.skillId == 0)
            {
                locked.gameObject.SetActive(true);
                m_Icon.gameObject.SetActive(false);
@@ -98,29 +65,27 @@
                    locked.gameObject.SetActive(false);
                    m_Icon.gameObject.SetActive(true);
                }
                var skillConfig = m_SkillData.skillCfg;
                var skillConfig = SkillConfig.Get(this.skillId);
                m_Icon.SetSprite(skillConfig.IconName);
                if (skillBuf != null)
                {
                    skillBuf.RefreshCD -= OnSkillCDRefresh;
                }
                if (PlayerDatas.Instance.hero != null)
                {
                    skillBuf = PlayerDatas.Instance.hero.SkillMgr.Get(m_SkillData.id);
                    OnSkillCDRefresh(skillBuf.cd, skillBuf.skillInfo.config.CoolDownTime * Constants.F_GAMMA);
                    skillBuf.RefreshCD += OnSkillCDRefresh;
                }
            }
            DisplaySkillDynamicInfo(true);
            m_Selected.gameObject.SetActive(false);
            HideSkillTip();
        }
        public void Dispose()
        {
            if (skillBuf != null)
            if (showSkillTipClock != null)
            {
                skillBuf.RefreshCD -= OnSkillCDRefresh;
                Clock.Stop(showSkillTipClock);
                showSkillTipClock = null;
            }
            if (m_Index != 0)
            {
                HideSkillTip();
            }
        }
@@ -140,72 +105,55 @@
            skillEvent2.RemoveAllListeners();
        }
        /// <summary>
        /// 剩余CD和总CD都是毫秒
        /// </summary>
        /// <param name="_cd"></param>
        /// <param name="_totalCD"></param>
        private void OnSkillCDRefresh(float _cd, float _totalCD)
        {
            totalCoolDown = _totalCD;
            coolDownCompleteTime = Time.time + _cd;
            timer = 0f;
        }
        private void LateUpdate()
        {
            if (m_CoolDownCompleteTime > Time.time)
            DisplaySkillDynamicInfo(false);
            if (inCountDown)
            {
                var cd = m_CoolDownCompleteTime - Time.time;
                if (!m_CoolDown.gameObject.activeInHierarchy)
                if (!m_CoolDown.gameObject.activeSelf)
                {
                    m_CoolDown.gameObject.SetActive(true);
                }
                if (m_CoolDownMask != null && !m_CoolDownMask.gameObject.activeInHierarchy)
                if (m_CoolDownMask != null && !m_CoolDownMask.gameObject.activeSelf)
                {
                    m_CoolDownMask.gameObject.SetActive(true);
                }
                if (m_CoolDownMask != null)
                {
                    if (Isreverse)
                    {
                        float flo = cd / totalCoolDown;
                        m_CoolDownMask.fillAmount = 1.0f - flo;
                    }
                    else
                    {
                        m_CoolDownMask.fillAmount = cd / totalCoolDown;
                    }
                    m_CoolDownMask.fillAmount = MainWinSkillController.Instance.GetSkillCD(m_Index).value.GetCountDownFillAmount();
                }
                timer -= Time.deltaTime;
                if (timer < 0f)
                {
                    m_CoolDown.text = cd.ToString("f0");
                    var countDown = MainWinSkillController.Instance.GetSkillCD(m_Index).value.GetCountDown();
                    if (countDown > 1)
                    {
                        m_CoolDown.text = countDown.ToString("f0");
                    }
                    else
                    {
                        m_CoolDown.text = "";
                    }
                    timer += 1f;
                }
            }
            else
            {
                if (m_CoolDown.gameObject.activeInHierarchy)
                if (m_CoolDown.gameObject.activeSelf)
                {
                    m_CoolDown.gameObject.SetActive(false);
                }
                if (m_CoolDownMask != null)
                {
                    if (Isreverse)
                    if (m_CoolDownMask.gameObject.activeSelf)
                    {
                        m_CoolDownMask.fillAmount = 1;
                    }
                    else
                    {
                        if (m_CoolDownMask.gameObject.activeInHierarchy)
                        {
                            m_CoolDownMask.gameObject.SetActive(false);
                        }
                        m_CoolDownMask.gameObject.SetActive(false);
                    }
                }
@@ -216,21 +164,34 @@
        public override void OnPointerDown(PointerEventData eventData)
        {
            base.OnPointerDown(eventData);
            ProcessForbid();
            PassEvent(eventData, ExecuteEvents.pointerDownHandler);
            if (m_SkillData == null)
            if (this.skillId == 0)
            {
                return;
            }
            if (m_ScaleTween != null)
            {
                m_ScaleTween.Play();
            }
            skillEvent1.Invoke();
            isExit = false;
            m_Selected.gameObject.SetActive(true);
            skillEvent1.Invoke();
            if (m_Index != 0)
            {
                if (showSkillTipClock != null)
                {
                    Clock.Stop(showSkillTipClock);
                }
                showSkillTipClock = Clock.AlarmAfter(1, ShowSkillTip);
            }
            isExit = false;
        }
        public override void OnPointerUp(PointerEventData eventData)
@@ -239,18 +200,32 @@
            PassEvent(eventData, ExecuteEvents.pointerUpHandler);
            if (m_SkillData == null)
            if (this.skillId == 0)
            {
                return;
            }
            if (m_ScaleTween != null)
            {
                m_ScaleTween.Play(true);
            }
            m_Selected.gameObject.SetActive(false);
            if (isExit == false)
            {
                skillEvent2.Invoke();
            }
            if (showSkillTipClock != null)
            {
                Clock.Stop(showSkillTipClock);
                showSkillTipClock = null;
            }
            if (m_Index != 0)
            {
                HideSkillTip();
            }
        }
@@ -283,6 +258,152 @@
            }
        }
        private void Awake()
        {
            Skill.OnSkillCDFinished += OnSkillPrepared;
            Skill.OnSkillCast += OnSkillCast;
        }
        private void OnDestroy()
        {
            Skill.OnSkillCDFinished += OnSkillPrepared;
            Skill.OnSkillCast += OnSkillCast;
        }
        private void OnSkillPrepared(int skillId)
        {
            if (!this.enabled)
            {
                return;
            }
            if (this.skillId != skillId)
            {
                return;
            }
            EffectMgr.Instance.PlayUIEffect(1024, 1500, this.transform, false);
        }
        private void OnSkillCast(uint playerInstanceId, int skillId)
        {
            if (!this.enabled)
            {
                return;
            }
            if (playerInstanceId != PlayerDatas.Instance.PlayerId)
            {
                return;
            }
            if (this.skillId != skillId)
            {
                return;
            }
            EffectMgr.Instance.PlayUIEffect(1023, 1500, this.transform, false);
        }
        private void ProcessForbid()
        {
            var isUnLocked = this.skillId != 0;
            if (!isUnLocked)
            {
                switch (m_Index)
                {
                    case 1:
                        SysNotifyMgr.Instance.ShowTip("Skill1Btn_Unlock");
                        break;
                    case 2:
                        SysNotifyMgr.Instance.ShowTip("Skill2Btn_Unlock");
                        break;
                    case 3:
                        SysNotifyMgr.Instance.ShowTip("Skill3Btn_Unlock");
                        break;
                    case 4:
                        SysNotifyMgr.Instance.ShowTip("Skill4Btn_Unlock");
                        break;
                    case 5:
                        SysNotifyMgr.Instance.ShowTip("Skill5Btn_Unlock");
                        break;
                    case 6:
                        SysNotifyMgr.Instance.ShowTip("Skill6Btn_Unlock");
                        break;
                    case 7:
                        SysNotifyMgr.Instance.ShowTip("Skill7Btn_Unlock");
                        break;
                    case 8:
                        SysNotifyMgr.Instance.ShowTip("SkillXpBtn_Unlock");
                        break;
                }
                return;
            }
            if (PlayerDatas.Instance.hero == null)
            {
                return;
            }
            var skill = PlayerDatas.Instance.hero.SkillMgr.Get(this.skillId);
            if (!skill.IsValid())
            {
                SysNotifyMgr.Instance.ShowTip("SkillBtn_CD");
                return;
            }
        }
        Clock showSkillTipClock;
        private void ShowSkillTip()
        {
            if (this.skillId == 0)
            {
                return;
            }
            if (m_SkillTip)
            {
                m_SkillTip.gameObject.SetActive(true);
                m_SkillTip.Display(this.skillId);
            }
        }
        private void HideSkillTip()
        {
            if (m_SkillTip)
            {
                m_SkillTip.gameObject.SetActive(false);
            }
        }
        private void DisplaySkillDynamicInfo(bool force)
        {
            var skillCd = MainWinSkillController.Instance.GetSkillCD(m_Index);
            if (force || skillCd.dirty)
            {
                var data = skillCd.Fetch();
                inCountDown = data.IsCountDown();
                var countDown = MainWinSkillController.Instance.GetSkillCD(m_Index).value.GetCountDown();
                if (countDown > 0)
                {
                    m_CoolDown.text = countDown.ToString("f0");
                }
                else
                {
                    m_CoolDown.text = "";
                }
            }
            var skillForbid = MainWinSkillController.Instance.GetSkillForbid(m_Index);
            if (force || skillForbid.dirty)
            {
                m_Icon.gray = skillForbid.Fetch();
            }
        }
    }
}