| | |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using UnityEngine.UI; |
| | | |
| | | using UnityEngine.EventSystems; |
| | | using UnityEngine.Events; |
| | | |
| | |
| | | |
| | | 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); |
| | |
| | | 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(); |
| | | } |
| | | } |
| | | |
| | |
| | | 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); |
| | | } |
| | | } |
| | | |
| | |
| | | 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) |
| | |
| | | |
| | | 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(); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | } |
| | | |
| | | 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(); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | } |