387 lines
13 KiB
C#
387 lines
13 KiB
C#
using Games.Events;
|
||
using Games.LogicObj;
|
||
using Games.SkillModle;
|
||
using GCGame.Table;
|
||
using Module.Log;
|
||
using UnityEngine;
|
||
using UnityEngine.EventSystems;
|
||
using UnityEngine.UI;
|
||
|
||
public class SkillButton : SkillButtonBase, IPointerDownHandler, IPointerUpHandler, IDragHandler
|
||
{
|
||
// 技能cd数值精度 - 处理一个因为cd数值不精确导致的误判
|
||
public const float cooldownPercision = 0.001f;
|
||
|
||
private bool _allowInput;
|
||
private GameObject _cdEffectClone;
|
||
|
||
private Image _comboTimer;
|
||
|
||
private float _cooldownRatio; // 冷却时间
|
||
|
||
// 当前操作开始时技能连段数目
|
||
private int _currentComboId;
|
||
|
||
public GameObject cdEffectObj;
|
||
public GameObject comboTimerObj;
|
||
public Image LockImage; //技能未开启
|
||
public Image XPSKill;
|
||
public SkillSelectUi m_skillselect;
|
||
|
||
public Text NeedLevel;
|
||
|
||
//技能开启需要个提示
|
||
public int SkillBarIndex;
|
||
public Image skillCDImage; //技能CD蒙版
|
||
public Image skillIcon; //技能图标
|
||
public Text CdTime;
|
||
|
||
//连击目标按钮
|
||
public SkillButton ComboTarget { get; set; }
|
||
|
||
// 当前操作技能按钮的手指Id
|
||
public int? CurrentFingerId { get; private set; }
|
||
|
||
// 当前技能按钮的操作Id
|
||
public int SkillIndex { get; private set; }
|
||
|
||
public bool AllowInput
|
||
{
|
||
get { return _allowInput; }
|
||
set
|
||
{
|
||
if (_allowInput != value)
|
||
{
|
||
_allowInput = value;
|
||
CleanSkillSelect();
|
||
ShowLockIcon(!_allowInput);
|
||
}
|
||
}
|
||
}
|
||
|
||
public OwnSkillData SkillData
|
||
{
|
||
get
|
||
{
|
||
if (Singleton<ObjManager>.GetInstance().MainPlayer != null && SkillIndex >= 0)
|
||
return Singleton<ObjManager>.GetInstance().MainPlayer.OwnSkillInfo[SkillIndex];
|
||
return null;
|
||
}
|
||
}
|
||
|
||
public void Clear()
|
||
{
|
||
SkillIndex = -1;
|
||
comboTimerObj.SetActive(false);
|
||
CleanSkillSelect();
|
||
if (XPSKill != null)
|
||
XPSKill.gameObject.SetActive(false);
|
||
if (LockImage != null)
|
||
LockImage.gameObject.SetActive(true);
|
||
if (skillCDImage != null)
|
||
skillCDImage.gameObject.SetActive(false);
|
||
if (skillIcon != null)
|
||
skillIcon.gameObject.SetActive(false);
|
||
SetSkillButtonOpenLevel();
|
||
}
|
||
|
||
private void Awake()
|
||
{
|
||
SkillIndex = -1;
|
||
CurrentFingerId = null;
|
||
_comboTimer = comboTimerObj.transform.Find("FillImage").GetComponent<Image>();
|
||
comboTimerObj.SetActive(false);
|
||
}
|
||
|
||
private void Start()
|
||
{
|
||
EventDispatcher.Instance.Add(Games.Events.EventId.LockSkillInput, OnSkillInputUpdate);
|
||
EventDispatcher.Instance.Add(Games.Events.EventId.ProcessInputBlock, OnProcessInputBlock);
|
||
OnSkillInputUpdate(null);
|
||
}
|
||
|
||
private void OnDisable()
|
||
{
|
||
if (CurrentFingerId != null && m_skillselect != null)
|
||
{
|
||
m_skillselect.EndSelect((int)CurrentFingerId);
|
||
CurrentFingerId = null;
|
||
}
|
||
}
|
||
|
||
private void OnDestroy()
|
||
{
|
||
EventDispatcher.Instance.Remove(Games.Events.EventId.LockSkillInput, OnSkillInputUpdate);
|
||
EventDispatcher.Instance.Remove(Games.Events.EventId.ProcessInputBlock, OnProcessInputBlock);
|
||
}
|
||
|
||
private void OnSkillInputUpdate(object args)
|
||
{
|
||
AllowInput = GameManager.gameManager.PlayerDataPool.AllowSkillInput;
|
||
}
|
||
|
||
private void OnProcessInputBlock(object args)
|
||
{
|
||
var block = (bool)args;
|
||
if (block)
|
||
CleanSkillSelect();
|
||
}
|
||
|
||
private void Update()
|
||
{
|
||
if (SkillIndex >= 0 && AllowInput)
|
||
{
|
||
var mainPlayer = Singleton<ObjManager>.GetInstance().MainPlayer;
|
||
if (mainPlayer != null)
|
||
{
|
||
var ownSkill = mainPlayer.OwnSkillInfo[SkillIndex];
|
||
if (ownSkill.IsValid())
|
||
{
|
||
ownSkill.UpdateCombo();
|
||
var cdTime = ownSkill.CurrentCooldown;
|
||
var totalCd = ownSkill.Cooldown;
|
||
if (Mathf.Abs(cdTime) < cooldownPercision)
|
||
cdTime = 0f;
|
||
CdTime.gameObject.SetActive(cdTime > 0f);
|
||
if (cdTime > 0f)
|
||
{
|
||
if (totalCd > 0)
|
||
SetCdRatio(cdTime / totalCd);
|
||
else
|
||
SetCdRatio(0f);
|
||
CdTime.text = Mathf.CeilToInt(cdTime).ToString();
|
||
}
|
||
else
|
||
SetCdRatio(0f);
|
||
|
||
var comboSkill = ownSkill.GetComboSkill();
|
||
if (comboSkill != null && ComboTarget != null)
|
||
{
|
||
ComboTarget.gameObject.SetActive(comboSkill.ComboRemain > 0);
|
||
}
|
||
|
||
// 显示当前连段技能
|
||
if (ownSkill.ComboRemain > 0)
|
||
{
|
||
comboTimerObj.SetActive(true);
|
||
_comboTimer.fillAmount = ownSkill.ComboRemain / ownSkill.ComboTime;
|
||
}
|
||
else
|
||
{
|
||
comboTimerObj.SetActive(false);
|
||
}
|
||
|
||
//// 如果连段数目发生改变,则强制清空操作并且更新连段技能图标
|
||
//if (ownSkill.ComboExTable.SkillExID != _currentComboId)
|
||
//{
|
||
// _currentComboId = ownSkill.ComboExTable.SkillExID;
|
||
// UpdateImageByCombo();
|
||
// if (CurrentFingerId != null)
|
||
// CleanSkillSelect();
|
||
//}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
public void SetSkillBarInfo(int skillIndex)
|
||
{
|
||
//if (SkillIndex != skillIndex)
|
||
//{
|
||
SkillIndex = skillIndex;
|
||
ShowLockIcon(!AllowInput);
|
||
//}
|
||
}
|
||
|
||
private void ShowLockIcon(bool isLock)
|
||
{
|
||
|
||
//if (isLock || SkillIndex < 0)
|
||
if (isLock)
|
||
{
|
||
skillIcon.gameObject.SetActive(false);
|
||
skillCDImage.gameObject.SetActive(false);
|
||
comboTimerObj.SetActive(false);
|
||
SetSkillButtonOpenLevel();
|
||
}
|
||
else if (SkillIndex < 0)
|
||
{
|
||
skillIcon.gameObject.SetActive(false);
|
||
skillCDImage.gameObject.SetActive(false);
|
||
comboTimerObj.SetActive(false);
|
||
SetSkillButtonOpenLevel();
|
||
}
|
||
else
|
||
{
|
||
LockImage.gameObject.SetActive(false);
|
||
NeedLevel.gameObject.SetActive(false);
|
||
skillIcon.gameObject.SetActive(true);
|
||
UpdateImageByCombo();
|
||
}
|
||
}
|
||
|
||
private void SetSkillButtonOpenLevel()
|
||
{
|
||
// 仅仅显示未达到等级的技能
|
||
var mainPlayer = ObjManager.Instance.MainPlayer;
|
||
if (mainPlayer == null)
|
||
return;
|
||
var skillActives = TableManager.GetSkillLearn().Values;
|
||
foreach (var skill in skillActives)
|
||
{
|
||
if (skill.Profession == mainPlayer.Profession
|
||
&& SkillBarIndex == skill.SkillBarIndex)
|
||
{
|
||
if (mainPlayer.BaseAttr.Level < skill.LearnLv)
|
||
{
|
||
NeedLevel.text = StrDictionary.GetClientDictionaryString("#{1166}", skill.LearnLv);
|
||
NeedLevel.gameObject.SetActive(true);
|
||
LockImage.gameObject.SetActive(true);
|
||
if (XPSKill != null)
|
||
XPSKill.gameObject.SetActive(false);
|
||
}
|
||
else
|
||
{
|
||
NeedLevel.gameObject.SetActive(false);
|
||
LockImage.gameObject.SetActive(false);
|
||
if (XPSKill != null)
|
||
XPSKill.gameObject.SetActive(SkillBarIndex == 4 || SkillBarIndex == 5);
|
||
}
|
||
|
||
return;
|
||
}
|
||
}
|
||
|
||
NeedLevel.gameObject.SetActive(false);
|
||
LockImage.gameObject.SetActive(false);
|
||
if (SkillBarIndex >= 4)
|
||
gameObject.SetActive(false);
|
||
}
|
||
|
||
private void SetCdRatio(float ratio)
|
||
{
|
||
// 仅在Ratio有所改变的状况下有响应
|
||
if (_cooldownRatio != ratio)
|
||
{
|
||
_cooldownRatio = ratio;
|
||
if (ratio > 0f)
|
||
{
|
||
skillCDImage.gameObject.SetActive(true);
|
||
skillCDImage.fillAmount = ratio;
|
||
}
|
||
else
|
||
{
|
||
skillCDImage.gameObject.SetActive(false);
|
||
if (_cdEffectClone == null)
|
||
_cdEffectClone = CloneEffectObj(cdEffectObj);
|
||
_cdEffectClone.SetActive(true);
|
||
}
|
||
}
|
||
}
|
||
|
||
#region 点击相关的事件处理
|
||
|
||
public void OnDrag(PointerEventData eventData)
|
||
{
|
||
if (CurrentFingerId == eventData.pointerId)
|
||
if (SkillIndex >= 0)
|
||
{
|
||
if (m_skillselect != null)
|
||
{
|
||
var mainPlayer = Singleton<ObjManager>.Instance.MainPlayer;
|
||
m_skillselect.MoveSelect(eventData, mainPlayer.OwnSkillInfo[SkillIndex].ComboExTableFinal);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CurrentFingerId = null;
|
||
}
|
||
}
|
||
|
||
public void OnPointerDown(PointerEventData eventData)
|
||
{
|
||
if (SkillIndex >= 0 && AllowInput && ProcessInput.Instance != null && !ProcessInput.Instance.isBlocked)
|
||
if (CurrentFingerId == null)
|
||
{
|
||
var mainPlayer = Singleton<ObjManager>.GetInstance().MainPlayer;
|
||
if (mainPlayer == null)
|
||
{
|
||
LogModule.ErrorLog("MainPlayer is Null");
|
||
}
|
||
else
|
||
{
|
||
var ownSkill = mainPlayer.OwnSkillInfo[SkillIndex];
|
||
var castable = mainPlayer.CheckSkillCastable(ownSkill.SkillBaseTable, ownSkill.SkillExTable, ownSkill.IsCooldownFinish());
|
||
switch (castable)
|
||
{
|
||
case SkillCastableCheckResult.Success:
|
||
case SkillCastableCheckResult.FailOtherSkill:
|
||
// 注:严进宽出,OnUp会直接用CurrentFingerId检查就释放事件
|
||
if (m_skillselect != null && m_skillselect.StartSelect(eventData,
|
||
(RectTransform)transform.parent, ownSkill))
|
||
CurrentFingerId = eventData.pointerId;
|
||
break;
|
||
case SkillCastableCheckResult.FailCooldown:
|
||
mainPlayer.SendNoticMsg(false, "#{1245}");
|
||
break;
|
||
case SkillCastableCheckResult.FailSelect:
|
||
mainPlayer.SendNoticMsg(false, "#{1250}");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
public void OnPointerUp(PointerEventData eventData)
|
||
{
|
||
if (LockImage.gameObject.activeSelf)
|
||
{
|
||
GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{4747}"));
|
||
}
|
||
|
||
if (CurrentFingerId == eventData.pointerId)
|
||
{
|
||
CurrentFingerId = null;
|
||
if (SkillIndex >= 0)
|
||
if (m_skillselect != null && m_skillselect.EndSelect(eventData.pointerId))
|
||
{
|
||
var mainPlayer = Singleton<ObjManager>.Instance.MainPlayer;
|
||
if (mainPlayer != null)
|
||
if (mainPlayer.IsDisableControl())
|
||
{
|
||
//组队跟随,不响应技能报错
|
||
if (GameManager.gameManager.PlayerDataPool.IsFollowTeam)
|
||
GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{5128}"));
|
||
// 暂时没有混乱中报错的机制
|
||
}
|
||
else
|
||
UseSkill(m_skillselect.AttackPoint, SkillIndex);
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 强制停止当前使用中的技能
|
||
/// </summary>
|
||
private void CleanSkillSelect()
|
||
{
|
||
if (CurrentFingerId != null)
|
||
{
|
||
if (m_skillselect != null)
|
||
m_skillselect.EndSelect(CurrentFingerId.Value);
|
||
CurrentFingerId = null;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 根据当前连段数目配置技能图标
|
||
/// </summary>
|
||
private void UpdateImageByCombo()
|
||
{
|
||
var mainPlayer = Singleton<ObjManager>.Instance.MainPlayer;
|
||
if (mainPlayer != null)
|
||
LoadAssetBundle.Instance.SetImageSprite(skillIcon, mainPlayer.OwnSkillInfo[SkillIndex].ComboBaseTable.Icon);
|
||
}
|
||
|
||
#endregion
|
||
} |