//--------------------------------------------------------
// [Author]: 第二世界
// [ Date ]: Saturday, September 02, 2017
//--------------------------------------------------------
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using TableConfig;
using UnityEngine.EventSystems;
using UnityEngine.Events;
namespace Snxxz.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] SkillTurnplate m_SkillTurnplate;
[SerializeField] Image m_Icon;
public Image icon { get { return 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;
[Header("遮罩是否反向")]
public bool Isreverse = false;
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;
}
}
float timer = 0f;
PlayerSkillData m_SkillData = null;
Skill skillBuf = null;
float fillAmountRevise = 1f;
public void SetSkillData(PlayerSkillData _skillData)
{
m_SkillData = _skillData;
if (m_SkillData == null)
{
m_Locked.gameObject.SetActive(true);
m_Icon.gameObject.SetActive(false);
}
else
{
if (PreFightMission.Instance.IsFinished())
{
m_Locked.gameObject.SetActive(false);
m_Icon.gameObject.SetActive(true);
}
var skillConfig = m_SkillData.skillCfg;
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;
}
}
}
public void Dispose()
{
if (skillBuf != null)
{
skillBuf.RefreshCD -= OnSkillCDRefresh;
}
}
public void AddDownListener(UnityAction _action)
{
skillEvent1.AddListener(_action);
}
public void AddUpListener(UnityAction _action)
{
skillEvent2.AddListener(_action);
}
public void RemoveAllListeners()
{
skillEvent1.RemoveAllListeners();
skillEvent2.RemoveAllListeners();
}
///
/// 剩余CD和总CD都是毫秒
///
///
///
private void OnSkillCDRefresh(float _cd, float _totalCD)
{
totalCoolDown = _totalCD;
coolDownCompleteTime = Time.time + _cd;
timer = 0f;
}
private void LateUpdate()
{
if (m_CoolDownCompleteTime > Time.time)
{
var cd = m_CoolDownCompleteTime - Time.time;
if (!m_CoolDown.gameObject.activeInHierarchy)
{
m_CoolDown.gameObject.SetActive(true);
}
if (m_CoolDownMask != null && !m_CoolDownMask.gameObject.activeInHierarchy)
{
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;
}
}
timer -= Time.deltaTime;
if (timer < 0f)
{
m_CoolDown.text = cd.ToString("f0");
timer += 1f;
}
}
else
{
if (m_CoolDown.gameObject.activeInHierarchy)
{
m_CoolDown.gameObject.SetActive(false);
}
if (m_CoolDownMask != null)
{
if (Isreverse)
{
m_CoolDownMask.fillAmount = 1;
}
else
{
if (m_CoolDownMask.gameObject.activeInHierarchy)
{
m_CoolDownMask.gameObject.SetActive(false);
}
}
}
}
}
public override void OnPointerDown(PointerEventData eventData)
{
base.OnPointerDown(eventData);
PassEvent(eventData, ExecuteEvents.pointerDownHandler);
if (m_SkillData == null)
{
return;
}
if (m_ScaleTween != null)
{
m_ScaleTween.Play();
}
skillEvent1.Invoke();
isExit = false;
}
public override void OnPointerUp(PointerEventData eventData)
{
base.OnPointerUp(eventData);
PassEvent(eventData, ExecuteEvents.pointerUpHandler);
if (m_SkillData == null)
{
return;
}
if (m_ScaleTween != null)
{
m_ScaleTween.Play(true);
}
if (isExit == false)
{
skillEvent2.Invoke();
}
}
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;
}
}
}
}
}
}
}