//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Saturday, September 02, 2017 //-------------------------------------------------------- using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using UnityEngine.EventSystems; using UnityEngine.Events; namespace vnxbqy.UI { public class SkillButtonInterface : MonoBehaviour, IPointerDownHandler, IPointerUpHandler { public virtual void OnPointerDown(PointerEventData eventData) { } public virtual void OnPointerUp(PointerEventData eventData) { } } public class SkillButton : SkillButtonInterface, IPointerExitHandler { [SerializeField] int m_Index; [SerializeField] SkillTurnplate m_SkillTurnplate; [SerializeField] ImageEx m_Icon; [SerializeField] Transform m_Locked; [SerializeField] Text m_CoolDown; [SerializeField] Image m_CoolDownMask; [SerializeField] ScaleTween m_ScaleTween; [SerializeField] Image m_Selected; [SerializeField] LongPressShowPanel m_SkillTip; [SerializeField] UIEffect m_YinjiEffect; 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; bool inCountDown = false; float timer = 0f; int skillId = 0; public void Initialize(int skillId) { this.skillId = skillId; if (this.skillId == 0) { locked.SetActive(true); m_Icon.SetActive(false); } else { if (PreFightMission.Instance.IsFinished() || PreFightMission.Instance.s_MissionDict.ContainsKey(1002)) { locked.SetActive(false); m_Icon.SetActive(true); } var skillConfig = SkillConfig.Get(this.skillId); m_Icon.SetSprite(skillConfig.IconName); } m_CoolDown.SetActive(false); m_CoolDownMask.SetActive(false); m_Selected.SetActive(false); DisplaySkillDynamicInfo(true); HideSkillTip(); PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataRefresh; if (GeneralDefine.skillYinjis.ContainsKey(this.skillId)) { PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataRefresh; } this.enabled = true; } public void Dispose() { if (showSkillTipClock != null) { Clock.Stop(showSkillTipClock); showSkillTipClock = null; } if (m_Index != 0) { HideSkillTip(); } PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataRefresh; this.enabled = false; } public void AddDownListener(UnityAction _action) { skillEvent1.AddListener(_action); } public void AddUpListener(UnityAction _action) { skillEvent2.AddListener(_action); } public void RemoveAllListeners() { skillEvent1.RemoveAllListeners(); skillEvent2.RemoveAllListeners(); } private void LateUpdate() { DisplaySkillDynamicInfo(false); if (inCountDown) { if (!m_CoolDown.gameObject.activeSelf) { m_CoolDown.SetActive(true); } if (m_CoolDownMask != null && !m_CoolDownMask.gameObject.activeSelf) { m_CoolDownMask.SetActive(true); } if (m_CoolDownMask != null) { m_CoolDownMask.fillAmount = MainWinSkillController.Instance.GetSkillCD(m_Index).value.GetCountDownFillAmount(); } timer -= Time.deltaTime; if (timer < 0f) { var countDown = MainWinSkillController.Instance.GetSkillCD(m_Index).value.GetCountDown(); if (countDown > 1) { m_CoolDown.text = countDown.ToString("f0"); } else { m_CoolDown.text = ""; } timer += 1f; } inCountDown = MainWinSkillController.Instance.GetSkillCD(m_Index).value.IsCountDown(); if (!inCountDown) { PlayYinjiEffect(); } } else { if (m_CoolDown.gameObject.activeSelf) { m_CoolDown.SetActive(false); } if (m_CoolDownMask != null) { if (m_CoolDownMask.gameObject.activeSelf) { m_CoolDownMask.SetActive(false); } } } } public override void OnPointerDown(PointerEventData eventData) { base.OnPointerDown(eventData); ProcessForbid(); PassEvent(eventData, ExecuteEvents.pointerDownHandler); if (this.skillId == 0) { return; } if (m_ScaleTween != null) { m_ScaleTween.Play(); } m_Selected.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) { base.OnPointerUp(eventData); PassEvent(eventData, ExecuteEvents.pointerUpHandler); if (this.skillId == 0) { return; } if (m_ScaleTween != null) { m_ScaleTween.Play(true); } m_Selected.SetActive(false); if (isExit == false) { skillEvent2.Invoke(); } if (showSkillTipClock != null) { Clock.Stop(showSkillTipClock); showSkillTipClock = null; } if (m_Index != 0) { HideSkillTip(); } } public void OnPointerExit(PointerEventData eventData) { isExit = true; } public void PassEvent(PointerEventData data, ExecuteEvents.EventFunction function) where T : IEventSystemHandler { List results = new List(); EventSystem.current.RaycastAll(data, results); GameObject current = data.pointerCurrentRaycast.gameObject; if (current != null && current == m_SkillTurnplate.gameObject) { ExecuteEvents.Execute(current, data, function); } else { for (int i = 0; i < results.Count; i++) { if (current != results[i].gameObject) { if (ExecuteEvents.Execute(results[i].gameObject, data, function)) { break; } } } } } 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.SetActive(true); m_SkillTip.Display(this.skillId); } } private void HideSkillTip() { if (m_SkillTip) { m_SkillTip.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 = ""; } PlayYinjiEffect(); } var skillForbid = MainWinSkillController.Instance.GetSkillForbid(m_Index); if (force || skillForbid.dirty) { m_Icon.gray = skillForbid.Fetch(); } } private void OnPlayerDataRefresh(PlayerDataType type) { switch (type) { case PlayerDataType.CDBPlayerRefresh_YinjiCount: PlayYinjiEffect(); break; } } YinJiModel yinjiModel { get { return ModelCenter.Instance.GetModel(); } } private void PlayYinjiEffect() { if (m_YinjiEffect == null) { return; } var skillCd = MainWinSkillController.Instance.GetSkillCD(m_Index); var playYinjiEffect = yinjiModel.IsSkillYinjiEnough(this.skillId) && !skillCd.value.IsExclusiveCountDown(); if (playYinjiEffect) { if (!m_YinjiEffect.IsPlaying) { m_YinjiEffect.Play(); } } else { if (m_YinjiEffect.IsPlaying) { m_YinjiEffect.Stop(); } } } } }