技能系统界面

窗口初始化

 

按下技能

监听到消息

 执行显示方法

更新技能描述

读技能表 

表中的内容

按下技能

使用技能

技能接口

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值