天天看点

技能系统界面

技能系统界面

窗口初始化

技能系统界面

按下技能

技能系统界面

监听到消息

技能系统界面

 执行显示方法

技能系统界面
技能系统界面

更新技能描述

技能系统界面

读技能表 

技能系统界面

表中的内容

技能系统界面

按下技能

技能系统界面

使用技能

技能系统界面

技能接口

技能系统界面

技能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);
    }
}