窗口初始化
按下技能
监听到消息
执行显示方法
更新技能描述
读技能表
表中的内容
按下技能
使用技能
技能接口
技能ID为0,显示错误信息
给服务端发消息
public class SkillWindow : BaseWindow
{
public SkillWindow()
{
mScenesType = EScenesType.EST_Play;
mResName = GameConstDefine.LoadSkillUI;
mResident = false;
}
继承接口/
//类对象初始化
public override void Init()
{
EventCenter.AddListener(EGameEvent.eGameEvent_GamePlayEnter, Show);
EventCenter.AddListener(EGameEvent.eGameEvent_GamePlayExit, Hide);
}
//类对象释放
public override void Realse()
{
EventCenter.RemoveListener(EGameEvent.eGameEvent_GamePlayEnter, Show);
EventCenter.RemoveListener(EGameEvent.eGameEvent_GamePlayExit, Hide);
}
//技能按钮初始化
protected override void InitWidget()
{
//技能按钮初始化
Transform Adjust = mRoot.FindChild("Adjust");
mBtnArray = new ButtonOnPress[Adjust.childCount];
for (int i = 0; i < mBtnArray.Length; i++)
{
ButtonOnPress btn = mRoot.FindChild("Adjust/Button_" + i).GetComponent<ButtonOnPress>();
mBtnArray[i] = btn;
//事件注册
switch ((ShortCutBarBtn)i)
{
case ShortCutBarBtn.BTN_SKILL_1:
//按下技能
btn.AddListener(i, OnSkillBtnFunc);
//按下技能描述
btn.AddListener(i, OnSkillPress, ButtonOnPress.EventType.PressType);
UIGuideCtrl.Instance.AddUiGuideEventBtn(btn.gameObject);
break;
case ShortCutBarBtn.BTN_SKILL_2:
case ShortCutBarBtn.BTN_SKILL_3:
case ShortCutBarBtn.BTN_SKILL_4:
case ShortCutBarBtn.BTN_SKILL_5:
case ShortCutBarBtn.BTN_SKILL_6:
btn.AddListener(i, OnSkillBtnFunc);
btn.AddListener(i, OnSkillPress, ButtonOnPress.EventType.PressType);
break;
case ShortCutBarBtn.BTN_AUTOFIGHT:
case ShortCutBarBtn.BTN_CHANGELOCK:
btn.AddListener(i, OnCutBarBtnFunc, ButtonOnPress.EventType.ClickType);
UIGuideCtrl.Instance.AddUiGuideEventBtn(btn.gameObject);
break;
}
//状态控制组件初始化
if (i < SkillCount)
{
GameObject obj = btn.transform.FindChild("Light").gameObject;
mCanPressEffect.Add((ShortCutBarBtn)i, obj);
UISprite sprite = mRoot.FindChild("Adjust/Button_" + i + "/CutBar_" + i).GetComponent<UISprite>();
mBtnSprite.Add((ShortCutBarBtn)i, sprite);
ButtonSelectPic selectPic = btn.GetComponent<ButtonSelectPic>();
selectPic.state = ButtonSelectPic.SelectState.DisableState;
mBtnSelectPic.Add((ShortCutBarBtn)i, selectPic);
}
}
//暴气技能初始化
ResourceUnit effectUnit = ResourcesManager.Instance.loadImmediate(GameDefine.GameConstDefine.FurySkillBtnEffect, ResourceType.PREFAB);
//技能1暴气
mEffect3 = GameObject.Instantiate(effectUnit.Asset) as GameObject;
mEffect3.transform.parent = mBtnArray[(int)ShortCutBarBtn.BTN_SKILL_3].transform;
mEffect3.transform.localPosition = new Vector3(0f, 0f, -10f);
//技能2暴气
mEffect4 = GameObject.Instantiate(effectUnit.Asset) as GameObject;
mEffect4.transform.parent = mBtnArray[(int)ShortCutBarBtn.BTN_SKILL_4].transform;
mEffect4.transform.localPosition = new Vector3(0f, 0f, -10f);
ChangeFuryState(EFuryState.eFuryNullState);
//初始化技能按钮
ShowValideUseSkillBtn(ShortCutBarBtn.BTN_SKILL_1, true);
ShowValideUseSkillBtn(ShortCutBarBtn.BTN_SKILL_2, true);
ShowValideUseSkillBtn(ShortCutBarBtn.BTN_SKILL_3, true);
ShowValideUseSkillBtn(ShortCutBarBtn.BTN_SKILL_4, true);
if (SceneGuideTaskManager.Instance().IsNewsGuide() == SceneGuideTaskManager.SceneGuideType.NoGuide)
{
mBtnSelectPic[ShortCutBarBtn.BTN_SKILL_5].gameObject.SetActive(false);
mBtnSelectPic[ShortCutBarBtn.BTN_SKILL_6].gameObject.SetActive(false);
ShowValideUseSkillBtn(ShortCutBarBtn.BTN_SKILL_5, false);
ShowValideUseSkillBtn(ShortCutBarBtn.BTN_SKILL_6, false);
}
//CD初始化
for (int i = 0; i < SkillCount; i++)
{
CdCountDown cd = mBtnArray[i].GetComponent<CdCountDown>();
mCdDownDic.Add((ShortCutBarBtn)i, cd);
}
ResetSkill();
mIsShowDes = false;
mTimePressStart = 0f;
mCurSkillPress = -1;
}
//窗口控件释放
protected override void RealseWidget()
{
mCanPressEffect.Clear();
mBtnSprite.Clear();
mBtnSelectPic.Clear();
mCdEndEffect.Clear();
mCdEndEffectTime.Clear();
mPressBtnEffect.Clear();
mPressBtnEffectTime.Clear();
mCdDownDic.Clear();
mSkillCdList.Clear();
}
//游戏事件注册
protected override void OnAddListener()
{
EventCenter.AddListener<EFuryState>(EGameEvent.eGameEvent_FuryStateInfo, ChangeFuryState);
EventCenter.AddListener<int, string, bool>(EGameEvent.eGameEvent_AbsorbResult, OnAbsorbResult);
EventCenter.AddListener<SkillType, float, float>(EGameEvent.eGameEvent_LocalPlayerSkillCD, OnSkillCountDown);
EventCenter.AddListener(EGameEvent.eGameEvent_LocalPlayerInit, OnLocalPlayerInit);
EventCenter.AddListener<bool>(EGameEvent.eGameEvent_LocalPlayerSilence, OnLocalPlayerSilence);
}
//游戏事件注消
protected override void OnRemoveListener()
{
EventCenter.RemoveListener<EFuryState>(EGameEvent.eGameEvent_FuryStateInfo, ChangeFuryState);
EventCenter.RemoveListener<int, string, bool>(EGameEvent.eGameEvent_AbsorbResult, OnAbsorbResult);
EventCenter.RemoveListener<SkillType, float, float>(EGameEvent.eGameEvent_LocalPlayerSkillCD, OnSkillCountDown);
EventCenter.RemoveListener(EGameEvent.eGameEvent_LocalPlayerInit, OnLocalPlayerInit);
EventCenter.RemoveListener<bool>(EGameEvent.eGameEvent_LocalPlayerSilence, OnLocalPlayerSilence);
}
//显示
public override void OnEnable()
{
}
//隐藏
public override void OnDisable()
{
EventCenter.Broadcast<bool, SkillType, Iplayer>(EGameEvent.eGameEvent_SkillDescribleType, false, SkillType.SKILL_NULL, PlayerManager.Instance.LocalPlayer);
mIsShowDes = false;
mCurSkillPress = -1;
mTimePressStart = 0f;
}
public override void Update(float deltaTime)
{
//清除技能描述
CloseSkillDestribe();
//yaz限帧
mElapseTime += Time.deltaTime;
if (mElapseTime > 0.2f)
{
mElapseTime = 0.0f;
CheckToDeletePressEffect();
CheckToDeleteCdEndEffect();
ShowAllBtnCanUseEffect();
}
if (mTimePressStart == 0 || mCurSkillPress == -1)
return;
//显示技能描述
if (Time.time - mTimePressStart >= mTimeLimit)
{
EventCenter.Broadcast<bool, SkillType, Iplayer>(EGameEvent.eGameEvent_SkillDescribleType, true, GetSkillType(mCurSkillPress), PlayerManager.Instance.LocalPlayer);
mIsShowDes = true;
mTimePressStart = 0f;
mCurSkillPress = -1;
}
}
//关闭技能描述
void CloseSkillDestribe()
{
bool isUp = false;
if (Application.platform == RuntimePlatform.Android
|| Application.platform == RuntimePlatform.IPhonePlayer
|| Application.platform == RuntimePlatform.WP8Player
|| Application.platform == RuntimePlatform.BlackBerryPlayer)
{
if (Input.touchCount <= 0)
return;
Touch touch = Input.GetTouch(0);
isUp = (touch.phase == TouchPhase.Canceled || touch.phase == TouchPhase.Ended);
}
else
{
isUp = Input.GetMouseButtonUp(0);
}
if (isUp)
{
EventCenter.Broadcast<bool, SkillType, Iplayer>(EGameEvent.eGameEvent_SkillDescribleType, false, SkillType.SKILL_NULL, PlayerManager.Instance.LocalPlayer);
mCurSkillPress = -1;
mTimePressStart = 0f;
}
}
//设计技能图片
public void SetSkillBtnPic(ShortCutBarBtn btntype, string spriteName)
{
mBtnSprite[btntype].spriteName = spriteName;
if (btntype == ShortCutBarBtn.BTN_SKILL_5 || btntype == ShortCutBarBtn.BTN_SKILL_6)
{
if (spriteName == "")
{
mBtnSprite[btntype].enabled = false;
mBtnSelectPic[btntype].gameObject.SetActive(false);
RemoveSkillCountDown(btntype);
}
else
{
mBtnSelectPic[btntype].gameObject.SetActive(true);
mBtnSprite[btntype].enabled = true;
}
}
}
public void DisableSkillBtn()
{
for (int i = 0; i < SkillCount; i++)
{
mBtnSelectPic[(ShortCutBarBtn)i].ShowSelectPic(true);
}
}
public void EnableSkillBtn()
{
for (int i = 0; i < SkillCount; i++)
{
mBtnSelectPic[(ShortCutBarBtn)i].ShowSelectPic(false);
}
}
public void ChangeFuryState(EFuryState state)
{
if (state == EFuryState.eFuryRunState)
{
mBtnArray[(int)ShortCutBarBtn.BTN_SKILL_1].gameObject.SetActive(false);
mBtnArray[(int)ShortCutBarBtn.BTN_SKILL_2].gameObject.SetActive(false);
mBtnArray[(int)ShortCutBarBtn.BTN_SKILL_3].gameObject.SetActive(true);
mBtnArray[(int)ShortCutBarBtn.BTN_SKILL_4].gameObject.SetActive(true);
}
else
{
mBtnArray[(int)ShortCutBarBtn.BTN_SKILL_1].gameObject.SetActive(true);
mBtnArray[(int)ShortCutBarBtn.BTN_SKILL_2].gameObject.SetActive(true);
mBtnArray[(int)ShortCutBarBtn.BTN_SKILL_3].gameObject.SetActive(false);
mBtnArray[(int)ShortCutBarBtn.BTN_SKILL_4].gameObject.SetActive(false);
}
}
bool IsHeroSkillBtn(int index)
{
if (ShortCutBarBtn.BTN_SKILL_1 == (ShortCutBarBtn)index ||
ShortCutBarBtn.BTN_SKILL_2 == (ShortCutBarBtn)index ||
ShortCutBarBtn.BTN_SKILL_3 == (ShortCutBarBtn)index ||
ShortCutBarBtn.BTN_SKILL_4 == (ShortCutBarBtn)index)
return true;
return false;
}
//按下技能描述
private void OnSkillPress(int id, bool isDown)
{
if (isDown)
{
mTimePressStart = Time.time;
mCurSkillPress = id;
mIsShowDes = false;
return;
}
//广播技能描述
EventCenter.Broadcast<bool, SkillType, Iplayer>(EGameEvent.eGameEvent_SkillDescribleType, false, SkillType.SKILL_NULL, PlayerManager.Instance.LocalPlayer);
mCurSkillPress = -1;
mTimePressStart = 0f;
}
//按下技能
private void OnSkillBtnFunc(int ie, bool isDown)
{
if (mIsShowDes)
{
mIsShowDes = false;
return;
}
mIsShowDes = false;
GamePlayCtrl.Instance.showaudiotimeold = System.DateTime.Now;
if (PlayerManager.Instance.LocalPlayer.FSM == null ||
PlayerManager.Instance.LocalPlayer.FSM.State == Game.FSM.FsmState.FSM_STATE_DEAD ||
Game.Skill.BuffManager.Instance.isSelfHaveBuffType(1017))
{
return;
}
//发送技能
SendSkill(ie);
}
//按功能键
private void OnCutBarBtnFunc(int ie, bool isDown)
{
if (isDown)
{
return;
}
switch ((ShortCutBarBtn)ie)
{
case ShortCutBarBtn.BTN_AUTOFIGHT:
CGLCtrl_GameLogin.Instance.GameAutoFight();
break;
case ShortCutBarBtn.BTN_CHANGELOCK:
OnLockEnemySoldier();
break;
}
}
//设置技能状态,是普通技能还是怒气技能
private void SetSkillState(int ie)
{
if (!IsHeroSkillBtn(ie))
{
mSkillState = SkillState.NormalSkill;
return;
}
if (PlayerManager.Instance.LocalPlayer.FuryState == EFuryState.eFuryRunState)
{
mSkillState = SkillState.FurySkill;
}
else
{
mSkillState = SkillState.NormalSkill;
}
}
//使用技能
private void SendSkill(int btn)
{
if (PlayerManager.Instance.LocalPlayer.FSM.State == Game.FSM.FsmState.FSM_STATE_DEAD)
return;
SkillType type = GetSkillType(btn);
if (type == SkillType.SKILL_NULL)
{
return;
}
PlayerManager.Instance.LocalPlayer.SendPreparePlaySkill(type);
}
//快键到技能类型转换
SkillType GetSkillType(int ie)
{
SetSkillState(ie);
SkillType type = SkillType.SKILL_NULL;
switch ((ShortCutBarBtn)ie)
{
case ShortCutBarBtn.BTN_SKILL_1:
type = SkillType.SKILL_TYPE1;
break;
case ShortCutBarBtn.BTN_SKILL_2:
type = SkillType.SKILL_TYPE2;
break;
case ShortCutBarBtn.BTN_SKILL_3:
type = SkillType.SKILL_TYPE3;
break;
case ShortCutBarBtn.BTN_SKILL_4:
type = SkillType.SKILL_TYPE4;
break;
case ShortCutBarBtn.BTN_SKILL_5:
type = SkillType.SKILL_TYPEABSORB1;
break;
case ShortCutBarBtn.BTN_SKILL_6:
type = SkillType.SKILL_TYPEABSORB2;
break;
}
return type;
}
//快键到技能类型转换
private ShortCutBarBtn GetBtnType(SkillType type)
{
ShortCutBarBtn btnType = ShortCutBarBtn.BTN_END;
switch (type)
{
case SkillType.SKILL_TYPE1:
btnType = ShortCutBarBtn.BTN_SKILL_1;
break;
case SkillType.SKILL_TYPE2:
btnType = ShortCutBarBtn.BTN_SKILL_2;
break;
case SkillType.SKILL_TYPE3:
btnType = ShortCutBarBtn.BTN_SKILL_3;
break;
case SkillType.SKILL_TYPE4:
btnType = ShortCutBarBtn.BTN_SKILL_4;
break;
case SkillType.SKILL_TYPEABSORB1:
btnType = ShortCutBarBtn.BTN_SKILL_5;
break;
case SkillType.SKILL_TYPEABSORB2:
btnType = ShortCutBarBtn.BTN_SKILL_6;
break;
}
return btnType;
}
/// <summary>
/// 锁定目标
/// </summary>
/// <param name="ItemList"></param>
private void OnLockEnemySoldier()
{
GameObject mGameObjectLock = mBtnArray[(int)ShortCutBarBtn.BTN_CHANGELOCK].gameObject;
List<Ientity> itemList = new List<Ientity>();
if (GamePlayGuideModel.Instance.IsGuideTrigger(ButtonTriggerType.mTypeClick, mGameObjectLock))
{
itemList = GameMethod.GetMonsterEnemyItemListByRadius(PlayerManager.Instance.LocalPlayer, GameConstDefine.PlayerLockTargetDis);
}
else
{
itemList = GameMethod.GetSoldierEnemyItemListByRadius(PlayerManager.Instance.LocalPlayer, GameConstDefine.PlayerLockTargetDis);
}
if (itemList == null || itemList.Count == 0)
{
return;
}
if (mSyncLockSelIndex >= itemList.Count)
{
mSyncLockSelIndex = 0;
}
PlayerManager.Instance.LocalPlayer.SetSyncLockTarget(itemList[mSyncLockSelIndex]);
mSyncLockSelIndex++;
}
public void CreateEffect(Transform tran, string pathName)
{
ResourceUnit objUnit = ResourcesManager.Instance.loadImmediate("effect/ui_effect/" + pathName, ResourceType.PREFAB);
GameObject obj = objUnit.Asset as GameObject;
if (obj == null)
{
return;
}
for (int i = 0; i < tran.childCount; i++)
GameObject.DestroyImmediate(tran.GetChild(i).gameObject);
GameObject ShowEffect = GameObject.Instantiate(obj) as GameObject;
ShowEffect.transform.parent = tran;
ShowEffect.transform.localPosition = Vector3.zero;
ShowEffect.transform.localScale = Vector3.one;
}
//显示有效的可以在使用中的技能
public void ShowValideUseSkillBtn(ShortCutBarBtn btnType, bool visiable)
{
Iselfplayer player = PlayerManager.Instance.LocalPlayer;
if (null == player)
{
return;
}
int index = (int)btnType;
int skillId = 0;
SkillManagerConfig info = null;
switch (btnType)
{
case ShortCutBarBtn.BTN_SKILL_1:
case ShortCutBarBtn.BTN_SKILL_2:
case ShortCutBarBtn.BTN_SKILL_3:
case ShortCutBarBtn.BTN_SKILL_4:
break;
case ShortCutBarBtn.BTN_SKILL_5:
if (player != null && player.BaseSkillIdDic.ContainsKey(SkillType.SKILL_TYPEABSORB1))
{
skillId = player.BaseSkillIdDic[SkillType.SKILL_TYPEABSORB1];
}
info = ConfigReader.GetSkillManagerCfg(skillId);
if (skillId == 0 || info == null)
{
visiable = false;
}
break;
case ShortCutBarBtn.BTN_SKILL_6:
if (player != null && player.BaseSkillIdDic.ContainsKey(SkillType.SKILL_TYPEABSORB2))
{
skillId = player.BaseSkillIdDic[SkillType.SKILL_TYPEABSORB2];
}
info = ConfigReader.GetSkillManagerCfg(skillId);
if (skillId == 0 || info == null)
{
visiable = false;
}
break;
default:
return;
}
if (!visiable)
{
ShowCdEndEffect(btnType, false);
}
}
//显示按下技能特效
public void ShowPressEffect(ShortCutBarBtn btnType)
{
if (IsSkillInCd(btnType) || mPressBtnEffect.ContainsKey(btnType))
{
return;
}
ResourceUnit objUnit = ResourcesManager.Instance.loadImmediate(GameConstDefine.PressBtnEffect, ResourceType.PREFAB);
GameObject obj = GameObject.Instantiate(objUnit.Asset) as GameObject;
int index = (int)btnType;
obj.transform.parent = mBtnArray[index].transform;
obj.transform.localPosition = Vector3.zero;
obj.transform.localScale = Vector3.one;
mPressBtnEffect.Add(btnType, obj);
mPressBtnEffectTime.Add(btnType, 1.5f);
}
private void DeletePressEffect(ShortCutBarBtn btnType)
{
GameObject obj = null;
if (mPressBtnEffect.TryGetValue(btnType, out obj))
{
GameObject.DestroyObject(obj);
mPressBtnEffect.Remove(btnType);
}
}
private float timePressCount = 0f;
private void CheckToDeletePressEffect()
{
if (mPressBtnEffectTime == null || mPressBtnEffectTime.Count == 0) return;
if (timePressCount == 0)
timePressCount = Time.time;
if (Time.time - timePressCount < 0.5f)
{
return;
}
timePressCount = Time.time;
for (int i = mPressBtnEffect.Count - 1; i >= 0; i--)
{
ShortCutBarBtn type = mPressBtnEffectTime.ElementAt(i).Key;
mPressBtnEffectTime[type] = mPressBtnEffectTime[type] - 0.5f;
if (mPressBtnEffectTime[type] <= 0)
{
mPressBtnEffectTime.Remove(type);
DeletePressEffect(type);
}
}
}
//显示CD结束效果
public void ShowCdEndEffect(ShortCutBarBtn btnType, bool show)
{
GameObject obj = null;
if (show)
{
if (mCdEndEffect.ContainsKey(btnType))
{
return;
}
ResourceUnit objUnit = ResourcesManager.Instance.loadImmediate(GameConstDefine.CdEndEffect, ResourceType.PREFAB);
obj = GameObject.Instantiate(objUnit.Asset) as GameObject;
int index = (int)btnType;
obj.transform.parent = mBtnArray[index].transform;
obj.transform.localPosition = Vector3.zero;
obj.transform.localScale = Vector3.one;
mCdEndEffect.Add(btnType, obj);
mCdEndEffectTime.Add(btnType, 1.5f);
}
else
{
if (!mCdEndEffect.ContainsKey(btnType))
{
return;
}
obj = null;
if (mCdEndEffect.TryGetValue(btnType, out obj))
{
GameObject.DestroyObject(obj);
}
mCdEndEffect.Remove(btnType);
mCdEndEffectTime.Remove(btnType);
}
}
private float timeCount = 0f;
//删除CD的效果
private void CheckToDeleteCdEndEffect()
{
if (mCdEndEffect == null || mCdEndEffect.Count == 0) return;
if (timeCount == 0)
timeCount = Time.time;
if (Time.time - timeCount < 0.5f)
{
return;
}
timeCount = Time.time;
for (int i = mCdEndEffect.Count - 1; i >= 0; i--)
{
ShortCutBarBtn type = mCdEndEffectTime.ElementAt(i).Key;
mCdEndEffectTime[type] = mCdEndEffectTime[type] - 0.5f;
if (mCdEndEffectTime[type] <= 0)
{
ShowCdEndEffect(type, false);
}
}
}
//显示可以用的技能效果
private void ShowBtnCanUseEffect(ShortCutBarBtn type)
{
if (PlayerManager.Instance == null || PlayerManager.Instance.LocalPlayer == null)
return;
if (PlayerManager.Instance.LocalPlayer.SkillIdDic == null || PlayerManager.Instance.LocalPlayer.SkillIdDic.Count == 0)
return;
Iselfplayer player = PlayerManager.Instance.LocalPlayer;
//转化为技能枚举
SkillType skillType = GetSkillType((int)type);
int skillId = PlayerManager.Instance.LocalPlayer.SkillIdDic[skillType];
//根据技能id获取技能信息
SkillManagerConfig info = ConfigReader.GetSkillManagerCfg(skillId);
if (info == null)
return;
GameObject sprite = mCanPressEffect[type];
bool isInCd = IsSkillInCd(type);
if (info.mpUse > player.Mp || info.cpUse > player.Cp || info.hpUse > player.Hp || isInCd)
{
if (sprite.activeInHierarchy)
{
sprite.SetActive(false);
}
}
else
{
if (!sprite.activeInHierarchy)
{
sprite.SetActive(true);
}
}
}
//显示所有可用技能效果
private void ShowAllBtnCanUseEffect()
{
for (int i = 0; i < SkillCount; i++)
{
ShowBtnCanUseEffect((ShortCutBarBtn)i);
}
}
// 开始技能CD显示,参数:按钮槽类型,总CD时间,CD时间;返回true 成功,否则 技能正在CD中
public bool StartSkillCountDown(ShortCutBarBtn btnType, float totalTime, float lastTime)
{
CdCountDown cd;
if (IsSkillInCd(btnType))
{
return false;
}
if (mCdDownDic.TryGetValue(btnType, out cd) && lastTime > 0)
{
//显示使用中技能按钮
ShowValideUseSkillBtn(btnType, false);
//显示按下的技能效果
ShowPressEffect(btnType);
//技能Cd时间走动
cd.StartCdCountDown(totalTime, lastTime);
cd.CdCountDownEvent += SkillCdEnd;
mSkillCdList.Add(btnType);
}
return true;
}
//清除某个技能CD
public void RemoveSkillCountDown(ShortCutBarBtn type)
{
CdCountDown cd;
if (mCdDownDic.TryGetValue(type, out cd) && IsSkillInCd(type))
{
cd.EndCdCountDown();
RemoveCdList(type);
ShowValideUseSkillBtn(type, true);
}
}
//清除所有技能CD
public void ResetSkill()
{
foreach (var item in mCdDownDic)
{
item.Value.EndCdCountDown();
ShowValideUseSkillBtn(item.Key, true);
}
for (int i = mSkillCdList.Count - 1; i >= 0; i--)
{
RemoveCdList(mSkillCdList.ElementAt(i));
}
}
//设置技能分配技能
public void ResetSkillAsignedSkill(ShortCutBarBtn btnType)
{
CdCountDown cdDown = null;
if (mCdDownDic.TryGetValue(btnType, out cdDown) && IsSkillInCd(btnType))
{
cdDown.EndCdCountDown();
RemoveCdList(btnType);
ShowValideUseSkillBtn(btnType, true);
}
}
// 监听某个技能CD结束,技能CD结束之后可以重新按下去
private void SkillCdEnd(CdCountDown cd)
{
for (int i = mCdDownDic.Count - 1; i >= 0; i--)
{
if (mCdDownDic.ElementAt(i).Value == cd && IsSkillInCd(mCdDownDic.ElementAt(i).Key))
{
ShowValideUseSkillBtn(mCdDownDic.ElementAt(i).Key, true);
RemoveCdList(mCdDownDic.ElementAt(i).Key);
break;
}
}
}
//判断某个技能是否在CD中
public bool IsSkillInCd(ShortCutBarBtn type)
{
return mSkillCdList.Contains(type);
}
private void RemoveCdList(ShortCutBarBtn type)
{
if (!IsSkillInCd(type))
return;
ShowCdEndEffect(type, true);
mSkillCdList.Remove(type);
}
private void OnAbsorbResult(int slot, string spriteName, bool remove)
{
if (remove == false)
{
if (slot == 0)
{
CreateEffect(mBtnSprite[ShortCutBarBtn.BTN_SKILL_5].transform, "soul_01_burst");
}
else
{
CreateEffect(mBtnSprite[ShortCutBarBtn.BTN_SKILL_6].transform, "soul_02_burst");
}
}
SetSkillBtnPic((ShortCutBarBtn.BTN_SKILL_5 + slot), spriteName);//show absorb btn sprite
ShowValideUseSkillBtn((ShortCutBarBtn.BTN_SKILL_5 + slot), !remove);//show absorb btn
}
private void OnSkillCountDown(SkillType type, float CDTime, float time)
{
if (time > 0)
{
StartSkillCountDown(GetBtnType(type), CDTime, time);
}
else
{
ResetSkillAsignedSkill(GetBtnType(type));
}
}
private void OnLocalPlayerInit()
{
int id = (int)PlayerManager.Instance.LocalPlayer.ObjTypeID;
HeroConfigInfo heroInfo = ConfigReader.GetHeroInfo(id);
if (ConfigReader.GetSkillManagerCfg(heroInfo.HeroSkillType1) != null)
{
SetSkillBtnPic(ShortCutBarBtn.BTN_SKILL_1, ConfigReader.GetSkillManagerCfg(heroInfo.HeroSkillType1).skillIcon);
}
if (ConfigReader.GetSkillManagerCfg(heroInfo.HeroSkillType2) != null)
{
SetSkillBtnPic(ShortCutBarBtn.BTN_SKILL_2, ConfigReader.GetSkillManagerCfg(heroInfo.HeroSkillType2).skillIcon);
}
if (ConfigReader.GetSkillManagerCfg(heroInfo.HeroSkillType3) != null)
{
SetSkillBtnPic(ShortCutBarBtn.BTN_SKILL_3, ConfigReader.GetSkillManagerCfg(heroInfo.HeroSkillType3).skillIcon);
}
if (ConfigReader.GetSkillManagerCfg(heroInfo.HeroSkillType4) != null)
{
SetSkillBtnPic(ShortCutBarBtn.BTN_SKILL_4, ConfigReader.GetSkillManagerCfg(heroInfo.HeroSkillType4).skillIcon);
}
SetSkillBtnPic(ShortCutBarBtn.BTN_SKILL_5, "");
SetSkillBtnPic(ShortCutBarBtn.BTN_SKILL_6, "");
}
private void OnLocalPlayerSilence(bool val)
{
if (val)
{
DisableSkillBtn();
}
else
{
EnableSkillBtn();
}
}
//技能按钮类型
public enum ShortCutBarBtn
{
BTN_SKILL_1 = 0, //技能1
BTN_SKILL_2, //技能2
BTN_SKILL_3, //技能1暴气
BTN_SKILL_4, //技能2暴气
BTN_SKILL_5, //吸附技能1
BTN_SKILL_6, //吸附技能2
BTN_AUTOFIGHT,
BTN_CHANGELOCK,
BTN_END,
}
private enum SkillState
{
NormalSkill,
FurySkill,
}
//技能按钮列表
private ButtonOnPress[] mBtnArray;
//可点击特效列表
private Dictionary<ShortCutBarBtn, GameObject> mCanPressEffect = new Dictionary<ShortCutBarBtn, GameObject>();
private Dictionary<ShortCutBarBtn, UISprite> mBtnSprite = new Dictionary<ShortCutBarBtn, UISprite>();
//技能选择图片列表
private Dictionary<ShortCutBarBtn, ButtonSelectPic> mBtnSelectPic = new Dictionary<ShortCutBarBtn, ButtonSelectPic>();
private Dictionary<ShortCutBarBtn, GameObject> mCdEndEffect = new Dictionary<ShortCutBarBtn, GameObject>();
private Dictionary<ShortCutBarBtn, float> mCdEndEffectTime = new Dictionary<ShortCutBarBtn, float>();
private Dictionary<ShortCutBarBtn, GameObject> mPressBtnEffect = new Dictionary<ShortCutBarBtn, GameObject>();
private Dictionary<ShortCutBarBtn, float> mPressBtnEffectTime = new Dictionary<ShortCutBarBtn, float>();
private Dictionary<ShortCutBarBtn, CdCountDown> mCdDownDic = new Dictionary<ShortCutBarBtn, CdCountDown>();
private List<ShortCutBarBtn> mSkillCdList = new List<ShortCutBarBtn>();
private GameObject mEffect3;
private GameObject mEffect4;
private float mTimePressStart = 0f;
private const float mTimeLimit = 1.2f;
private int mCurSkillPress = -1;
private int mSyncLockSelIndex;
private const int SkillCount = 6;
private float mElapseTime = 0.0f;
private bool mIsShowDes = false;
SkillState mSkillState = SkillState.NormalSkill;
}
CD描述
public class SkillDescribleWindow : BaseWindow
{
public SkillDescribleWindow()
{
mScenesType = EScenesType.EST_Play;
mResName = GameConstDefine.SkillDestribe;
mResident = false;
}
继承接口/
//类对象初始化
public override void Init()
{
EventCenter.AddListener<bool, SkillType, Iplayer >(EGameEvent.eGameEvent_SkillDescribleType, ShowDescribleByType);
EventCenter.AddListener<bool, int, Iplayer>(EGameEvent.eGameEvent_SkillDescribleId, ShowDescribleById);
EventCenter.AddListener(EGameEvent.eGameEvent_GamePlayExit, Hide);
}
//类对象释放
public override void Realse()
{
EventCenter.RemoveListener<bool, SkillType, Iplayer>(EGameEvent.eGameEvent_SkillDescribleType, ShowDescribleByType);
EventCenter.RemoveListener<bool, int, Iplayer>(EGameEvent.eGameEvent_SkillDescribleId, ShowDescribleById);
EventCenter.RemoveListener(EGameEvent.eGameEvent_GamePlayExit, Hide);
}
//窗口控件初始化
protected override void InitWidget()
{
mSkillCd = mRoot.FindChild("Skill_Cooldown").GetComponent<UILabel>();
mSkillDes = mRoot.FindChild("Skill_Describe").GetComponent<UILabel>();
mSkillLv = mRoot.FindChild("Skill_Level").GetComponent<UILabel>();
mSkillName = mRoot.FindChild("Skill_Name").GetComponent<UILabel>();
mSkillDis = mRoot.FindChild("Skill_Distance").GetComponent<UILabel>();
mSkillMpCost = mRoot.FindChild("Skill_MP").GetComponent<UILabel>();
mSkillHpCost = mRoot.FindChild("Skill_HP").GetComponent<UILabel>();
mSkillCpCost = mRoot.FindChild("Skill_CP").GetComponent<UILabel>();
}
//窗口控件释放
protected override void RealseWidget()
{
}
//游戏事件注册
protected override void OnAddListener()
{
EventCenter.AddListener(EGameEvent.eGameEvent_SkillDescribleUpdate, UpdateDescrible);
}
//游戏事件注消
protected override void OnRemoveListener()
{
EventCenter.RemoveListener(EGameEvent.eGameEvent_SkillDescribleUpdate, UpdateDescrible);
}
//显示
public override void OnEnable()
{
currentSkill = SkillType.SKILL_NULL;
}
//隐藏
public override void OnDisable()
{
}
public override void Update(float deltaTime)
{
}
public SkillType currentSkill
{
private set;
get;
}
private UILabel mSkillName = null;
private UILabel mSkillDes = null;
private UILabel mSkillCd = null;
private UILabel mSkillDis = null;
private UILabel mSkillLv = null;
private UILabel mSkillMpCost = null;
private UILabel mSkillCpCost = null;
private UILabel mSkillHpCost = null;
//显示技能描述
private void ShowDescribleByType(bool show, SkillType skillType, Iplayer player)
{
if (show)
{
Show();
SetSkillDestribe(skillType, (Iselfplayer)player);
currentSkill = skillType;
}
else
{
Hide();
currentSkill = SkillType.SKILL_NULL;
}
}
public void ShowDescribleById(bool show, int skillId, Iplayer player)
{
if (show)
{
Show();
SetSkillDestribe(skillId, player);
}
else
{
Hide();
currentSkill = SkillType.SKILL_NULL;
}
}
private void UpdateDescrible()
{
if (currentSkill != SkillType.SKILL_NULL)
{
UpdateDestribe(currentSkill, PlayerManager.Instance.LocalPlayer);
}
}
public void UpdateDestribe(SkillType skillType, Iselfplayer player)
{
int skillId = player.SkillIdDic[skillType];
UpdateDestribe(skillId, (Iplayer)player);
}
//更新技能描述
public void UpdateDestribe(int skillId, Iplayer player)
{
SkillManagerConfig skillconfig = ConfigReader.GetSkillManagerCfg(skillId);
if (skillconfig == null)
{
return;
}
mSkillCd.text = (skillconfig.coolDown / 1000f).ToString();
mSkillDes.text = DestribeWithAttribue(skillconfig.info, player);
int bet = skillconfig.id % 10;
if (bet == 0)
bet = 1;
mSkillLv.text = bet.ToString();
mSkillName.text = skillconfig.name;
mSkillDis.text = "(" + skillconfig.range.ToString() + "施法距离)";
ShowCost(skillconfig);
}
void ShowCost(SkillManagerConfig skillconfig)
{
mSkillHpCost.transform.gameObject.SetActive(false);
mSkillCpCost.transform.gameObject.SetActive(false);
mSkillMpCost.transform.gameObject.SetActive(false);
if (skillconfig.mpUse != 0)
{
mSkillMpCost.text = skillconfig.mpUse.ToString();
mSkillMpCost.transform.gameObject.SetActive(true);
}
else if (skillconfig.hpUse != 0)
{
mSkillHpCost.text = skillconfig.hpUse.ToString();
mSkillHpCost.transform.gameObject.SetActive(true);
}
else if (skillconfig.cpUse != 0)
{
mSkillCpCost.text = skillconfig.cpUse.ToString();
mSkillCpCost.transform.gameObject.SetActive(true);
}
}
//设置技能描述
public void SetSkillDestribe(SkillType skillType, Iselfplayer player)
{
if (!player.SkillIdDic.ContainsKey(skillType) || !player.BaseSkillIdDic.ContainsKey(skillType))
return;
int skillId = player.SkillIdDic[skillType];
SetSkillDestribe(skillId, (Iplayer)player);
}
public void SetSkillDestribe(int skillId, Iplayer player)
{
//配置表中读取技能信息
SkillManagerConfig skillconfig = ConfigReader.GetSkillManagerCfg(skillId);
if (skillconfig == null)
{
return;
}
UpdateDestribe(skillId, player);
}
string DestribeWithAttribue(string str, Iplayer player)
{
string tempStr = "";
tempStr = str;
if (!(str.Contains("mag") || str.Contains("phy")))
return str;
for (int i = 0; i < tempStr.Length; i++)
{
if (tempStr[i] != ']')
{
continue;
}
int index = tempStr.LastIndexOf('[', i);
string addStr = tempStr.Substring(index, i - index + 1);
string[] strArray;
if (addStr.Contains("mag") || addStr.Contains("phy"))
{
strArray = addStr.Split(',');
strArray[1] = strArray[1].Remove(strArray[1].Length - 1, 1);
float attr = float.Parse(strArray[1]);
if (player == null)
{
return null;
}
float phyAttr = player.PhyAtk;
float magAttr = player.MagAtk;
attr = addStr.Contains("mag") ? (attr * magAttr) : (attr * phyAttr);
string attrAdd = attr >= 0 ? ("+" + attr.ToString()) : ("-" + attr.ToString());
attrAdd = "[00FF00]" + attrAdd + "[-]";
tempStr = tempStr.Replace(addStr, attrAdd);
}
}
return tempStr;
}
}
技能CD
public class CdCountDown : MonoBehaviour
{
public UISprite cdSlider;
private float timeLimit;
private bool canCountCd = false;
private DateTime StartCountTime;
public Action<CdCountDown> CdCountDownEvent;
float start = 0f;
void Start()
{
//if(cdSlider == null)
// cdSlider = transform.FindChild("Progress Bar").GetComponent<UISlider>();
SetCdShow(false);
}
void Update()
{
DoCdCount();
}
public void SetCdShow(bool visiable)
{
cdSlider.fillAmount = 1;
if (cdSlider.gameObject.activeInHierarchy != visiable)
{
cdSlider.gameObject.SetActive(visiable);
}
}
public void StartCdCountDown(float time, float last)
{
if (canCountCd)
return;
timeLimit = time;
start = time - last;
SetCdShow(true);
StartCountTime = DateTime.Now;
canCountCd = true;
}
public void EndCdCountDown()
{
if (cdSlider.gameObject.activeInHierarchy)
{
cdSlider.gameObject.SetActive(false);
}
cdSlider.fillAmount = 0;
canCountCd = false;
if (CdCountDownEvent != null)
CdCountDownEvent(this);
}
void DoCdCount()
{
if (!canCountCd)
return;
TimeSpan endtime = DateTime.Now - StartCountTime;
if (endtime.TotalSeconds >= (timeLimit - start))
{
EndCdCountDown();
return;
}
cdSlider.fillAmount = 1f - (start / timeLimit) - ((float)endtime.TotalSeconds / timeLimit);
}
}