예제 #1
0
    /// <summary>
    /// 计算技能移动
    /// </summary>
    /// <param name="entity"></param>
    /// <param name="skillData"></param>
    private void CalcSkillMove(EntityBase entity, SkillCfg skillData)
    {
        List <int> skillMoveLst = skillData.skillMoveLst;
        int        sum          = 0;

        // 遍历所有的技能位移,一个技能可能会有多段位移
        for (int i = 0; i < skillMoveLst.Count; i++)
        {
            SkillMoveCfg skillMoveCfg = resSvc.GetSkillMoveCfg(skillData.skillMoveLst[i]);
            float        speed        = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f);
            sum += skillMoveCfg.delayTime; // 总的延迟时间
            if (sum > 0)
            {
                int moveID = timeSvc.AddTimeTask((int tid) => {
                    entity.SetSkillMoveState(true, speed);
                    entity.RmvMoveCB(tid); // 移除技能位移的回调 ID
                }, sum);
                // 添加技能位移的回调 ID
                entity.skMoveCBLst.Add(moveID);
            }
            else
            {
                entity.SetSkillMoveState(true, speed);
            }

            sum += skillMoveCfg.moveTime;
            int stopID = timeSvc.AddTimeTask((int tid) => {
                entity.SetSkillMoveState(false);
                entity.RmvMoveCB(tid); // 移除技能位移的回调 ID
            }, sum);
            // 添加技能位移的回调 ID
            entity.skMoveCBLst.Add(stopID);
        }
    }
예제 #2
0
    private void CalcSkillMove(EntityBase entity, SkillCfg skillData)
    {
        var skillMoveLst = skillData.skillMoveLst;
        int sum          = 0;

        //多段位移
        for (int i = 0; i < skillMoveLst.Count; i++)
        {
            SkillMoveCfg skillMoveCfg = resSvc.GetSkillMoveCfg(skillMoveLst[i]);

            float speed = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f);
            sum += skillMoveCfg.delayTime;
            if (sum > 0)
            {
                int moveid = timerSvc.AddTimeTask((int tid) =>
                {
                    entity.SetSkillMoveState(true, speed);
                    entity.RemoveMoveCB(tid);
                }, sum);
                entity.skMoveCBLst.Add(moveid);
            }
            else
            {
                entity.SetSkillMoveState(true, speed);
            }

            sum += skillMoveCfg.moveTime;
            int stopID = timerSvc.AddTimeTask((int tid) =>
            {
                entity.SetSkillMoveState(false);
                entity.RemoveMoveCB(tid);
            }, sum);
            entity.skMoveCBLst.Add(stopID);
        }
    }
예제 #3
0
    /// <summary>
    /// 设置技能移动,并添加回调编号
    /// </summary>
    /// <param name="entity"></param>
    /// <param name="skillData"></param>
    private void CalcSkillMove(EntityBase entity, SkillCfg skillData)
    {
        List <int> skillMoveLst = skillData.skillMoveLst;
        int        delay        = 0;

        for (int i = 0; i < skillMoveLst.Count; i++)
        {
            SkillMoveCfg skillMoveCfg = GameEntry.Res.GetSkillMoveCfg(skillData.skillMoveLst[i]);
            float        speed        = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f);
            delay += skillMoveCfg.delayTime;
            if (delay > 0)
            {
                int moveid = GameEntry.Timer.AddTimeTask((int tid) => {
                    entity.SetSkillMoveState(true, speed);
                    entity.RmvMoveCB(tid);      //移除移动回调编号
                }, delay);
                entity.SkMoveCBLst.Add(moveid); //添加移动回调编号
            }
            else
            {
                entity.SetSkillMoveState(true, speed);
            }

            delay += skillMoveCfg.moveTime;
            int stopid = GameEntry.Timer.AddTimeTask((int tid) => {
                entity.SetSkillMoveState(false);
                entity.RmvMoveCB(tid);      //移除回调编号
            }, delay);
            entity.SkMoveCBLst.Add(stopid); //添加回调编号
        }
    }
예제 #4
0
    private void CalcSkillMove(EntityBase entity, SkillCfg skillCfg)
    {
        List <int> skillMoveLst = skillCfg.skillMoveLst;
        int        sumTime      = 0;

        for (int i = 0; i < skillMoveLst.Count; i++)
        {
            SkillMoveCfg skillMoveCfg = resSvc.GetSkillMoveCfg(skillCfg.skillMoveLst[i]);
            float        speed        = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f);
            sumTime += skillMoveCfg.delayTime;
            if (sumTime > 0)
            {
                int moveid = timerSvc.AddTimeTask((tid) => {
                    entity.SetSkillMoveState(true, speed);
                    entity.RmvMoveCB(tid);
                }, sumTime);
                entity.skMoveCBLst.Add(moveid);
            }
            else
            {
                entity.SetSkillMoveState(true, speed);
            }
            sumTime += skillMoveCfg.moveTime;
            int stopid = timerSvc.AddTimeTask((tid) => {
                entity.SetSkillMoveState(false);
                entity.RmvMoveCB(tid);
            }, sumTime);
            entity.skMoveCBLst.Add(stopid);
        }
    }
예제 #5
0
파일: SkillMgr.cs 프로젝트: RedAWM/DarkGod
    private void CalcSkillMove(EntityBase entity, SkillCfg skillData)
    {
        List <int> skillMoveLst = skillData.skillMoveLst;
        int        sum          = 0;

        for (int i = 0; i < skillMoveLst.Count; i++)
        {
            SkillMoveCfg skillMoveCfg = resSvc.GetSkillMoveCfg(skillData.skillMoveLst[i]);
            float        speed        = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f);
            sum += skillMoveCfg.delayTime;
            if (sum > 0)
            {
                timeSvc.AddTimeTask((int tid) => {
                    entity.SetSkillMoveState(true, speed);
                }, sum);
            }
            else
            {
                entity.SetSkillMoveState(true, speed);
            }

            sum += skillMoveCfg.moveTime;
            timeSvc.AddTimeTask((int tid) => {
                entity.SetSkillMoveState(false);
            }, sum);
        }
    }
예제 #6
0
    private void CalcSkillMove(EntityBase entity, SkillCfg skillCfg)
    {
        int tempDelay = 0;

        for (int i = 0; i < skillCfg.skillMove.Count; i++)
        {
            SkillMoveCfg skillMove = resSev.GetSkillMoveCfg(skillCfg.skillMove[i]);
            float        speed     = skillMove.moveDis / (skillMove.moveTime / 1000f);
            if (skillMove.delayTime > 0f)
            {
                IDPack pack_1 = timerSev.AddTimerTask((tid) =>
                {
                    entity.SetSkillMoveState(true, speed);
                    entity.sklMoveCBSet.Remove(tid);
                }, tempDelay + skillMove.delayTime);
                entity.sklMoveCBSet.Add(pack_1.id);
            }
            else
            {
                entity.SetSkillMoveState(true, speed);
            }

            IDPack pack_2 = timerSev.AddTimerTask((ttid) =>
            {
                entity.SetSkillMoveState(false);
                entity.sklMoveCBSet.Remove(ttid);
            }, tempDelay + skillMove.moveTime + skillMove.delayTime);
            entity.sklMoveCBSet.Add(pack_2.id);

            tempDelay += skillMove.delayTime + skillMove.moveTime;
        }
    }
예제 #7
0
    public SkillMoveCfg GetSkillMoveCfg(int id)
    {
        SkillMoveCfg smc = null;

        skillMoveDic.TryGetValue(id, out smc);

        return(smc);
    }
예제 #8
0
    private void InitSkillMoveCfgData(string xmlPath)
    {
        TextAsset xmlText = Resources.Load <TextAsset>(xmlPath);

        if (!xmlText)
        {
            CommonTools.Log("xml file: " + PathDefine.cPath_RandomNameCfg + "not exits!",
                            LogType.LogType_Error);
            return;
        }

        //开始解析xml文件
        XmlDocument doc = new XmlDocument();

        doc.LoadXml(xmlText.text);

        XmlNodeList nodeList = doc.SelectSingleNode("root").ChildNodes;

        for (int i = 0; i < nodeList.Count; i++)
        {
            XmlElement element = nodeList[i] as XmlElement;

            if (element.GetAttributeNode("ID") == null)
            {
                continue;
            }
            int id = Convert.ToInt32(element.GetAttributeNode("ID").InnerText);

            SkillMoveCfg skillData = new SkillMoveCfg
            {
                ID = id,
            };

            #region 遍历解析
            foreach (XmlElement elem in nodeList[i].ChildNodes)
            {
                switch (elem.Name)
                {
                case "moveTime":
                    skillData.moveTime = int.Parse(elem.InnerText);
                    break;

                case "moveDis":
                    skillData.moveDistance = float.Parse(elem.InnerText);
                    break;

                case "delayTime":
                    skillData.delayTime = int.Parse(elem.InnerText);
                    break;
                }
            }
            #endregion

            dictSkillMoveCfgData.Add(id, skillData);
        }
    }
예제 #9
0
    public SkillMoveCfg GetSkillMoveCfg(int id)
    {
        SkillMoveCfg skillMoveCfg = null;

        if (skillMoveCfgDicts.TryGetValue(id, out skillMoveCfg))
        {
            return(skillMoveCfg);
        }
        return(null);
    }
예제 #10
0
    public SkillMoveCfg GetSkillMoveCfg(int id)
    {
        SkillMoveCfg smc = null;

        if (skillMoveDic.TryGetValue(id, out smc))
        {
            return(smc);
        }
        return(null);
    }
예제 #11
0
    public SkillMoveCfg GetSkillMoveCfgData(int id)
    {
        SkillMoveCfg agc = null;

        if (skillMoveCfgDic.TryGetValue(id, out agc))
        {
            return(agc);
        }
        return(null);
    }
예제 #12
0
    public SkillMoveCfg GetSkillMoveCfg(int id)
    {
        SkillMoveCfg skillData = null;

        if (dictSkillMoveCfgData.TryGetValue(id, out skillData))
        {
            return(skillData);
        }

        return(null);
    }
예제 #13
0
파일: ResSev.cs 프로젝트: WhitePetal/ARPG
    public SkillMoveCfg GetSkillMoveCfg(int id)
    {
        SkillMoveCfg cfg = null;

        if (skillMoveCfgDic.TryGetValue(id, out cfg))
        {
            return(cfg);
        }
        NETCommon.Log("获取 SkillMoveCfg 失败,ID:" + id);
        return(null);
    }
예제 #14
0
    private void InitSkillMoveCfg(string path)
    {
        TextAsset xml = Resources.Load <TextAsset>(path);

        if (xml == false)
        {
            Debug.LogError(GetType() + "/InitTaskRewardCfg()/xml file:" + path + " not exist");
        }
        else
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml.text);

            XmlNodeList nodLst = doc.SelectSingleNode("root").ChildNodes;

            for (int i = 0; i < nodLst.Count; i++)
            {
                XmlElement ele = nodLst[i] as XmlElement;

                if (ele.GetAttributeNode("ID") == null)
                {
                    continue;
                }

                int ID = Convert.ToInt32(ele.GetAttributeNode("ID").InnerText);

                SkillMoveCfg smc = new SkillMoveCfg
                {
                    ID = ID
                };

                foreach (XmlElement e in nodLst[i].ChildNodes)
                {
                    switch (e.Name)
                    {
                    case "moveDis":
                        smc.moveDis = float.Parse(e.InnerText);
                        break;

                    case "moveTime":
                        smc.moveTime = int.Parse(e.InnerText);
                        break;

                    case "delayTime":
                        smc.delayTime = int.Parse(e.InnerText);
                        break;
                    }
                }

                skillMoveDic.Add(ID, smc);
            }
        }
    }
예제 #15
0
    private void InitSkillMoveCfg(string assetName, object asset, float duration, object userData)
    {
        TextAsset xml = asset as TextAsset;

        if (!xml)
        {
            PECommon.Log("xml file:" + assetName + " not exist", LogType.Error);
        }
        else
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml.text);

            XmlNodeList nodLst = doc.SelectSingleNode("root").ChildNodes;

            for (int i = 0; i < nodLst.Count; i++)
            {
                XmlElement ele = nodLst[i] as XmlElement;

                if (ele.GetAttributeNode("ID") == null)
                {
                    continue;
                }
                int          ID  = Convert.ToInt32(ele.GetAttributeNode("ID").InnerText);
                SkillMoveCfg smc = new SkillMoveCfg {
                    ID = ID
                };

                foreach (XmlElement e in nodLst[i].ChildNodes)
                {
                    switch (e.Name)
                    {
                    case "delayTime":
                        smc.delayTime = int.Parse(e.InnerText);
                        break;

                    case "moveTime":
                        smc.moveTime = int.Parse(e.InnerText);
                        break;

                    case "moveDis":
                        smc.moveDis = float.Parse(e.InnerText);
                        break;
                    }
                }
                skillMoveDic.Add(ID, smc);
            }
        }
        GameEntry.Resource.UnloadAsset(asset);
    }
예제 #16
0
    private void InitSkillMoveCfg(string path)
    {
        //TextAsset xml = Resources.Load<TextAsset>(path);
        string streamingXML = Application.streamingAssetsPath + path;
        //if (!xml)
        //{
        //    PECommon.Log("指定文件不存在,路径:" + path, LogType.Error);
        //}
        //else
        //{
        XmlDocument doc = new XmlDocument();

        //doc.LoadXml(xml.text);
        doc.Load(streamingXML);
        //选中子节点集合
        XmlNodeList nodList = doc.SelectSingleNode("root").ChildNodes;

        for (int i = 0; i < nodList.Count; i++)
        {
            XmlElement ele = nodList[i] as XmlElement;
            if (ele.GetAttributeNode("ID") == null)
            {    //不包含ID的节点,直接跳到下一个遍历,安全校验
                continue;
            }
            int          ID = Convert.ToInt32(ele.GetAttributeNode("ID").InnerText);
            SkillMoveCfg SkillMoveCfgData = new SkillMoveCfg();
            SkillMoveCfgData.ID = ID;

            foreach (XmlElement element in nodList[i].ChildNodes)
            {
                switch (element.Name)
                {
                case "moveTime":
                    SkillMoveCfgData.moveTime = int.Parse(element.InnerText);
                    break;

                case "moveDis":
                    SkillMoveCfgData.moveDis = float.Parse(element.InnerText);
                    break;
                }
            }
            skillMoveCfgDic.Add(ID, SkillMoveCfgData);
        }
        //}
    }
예제 #17
0
    private void InitSkillMoveCfg(string path)
    {
        skillMoveDic.Clear();
        XmlNodeList nodList = null;

        if (TryGetRootNodeList(path, out nodList))
        {
            for (int i = 0; i < nodList.Count; i++)
            {
                XmlElement ele = nodList[i] as XmlElement;

                if (ele.GetAttributeNode("ID") == null)
                {
                    continue;
                }
                int ID = Convert.ToInt32(ele.GetAttributeNode("ID").InnerText);

                SkillMoveCfg smc = new SkillMoveCfg()
                {
                    ID = ID
                };

                foreach (XmlElement e in nodList[i].ChildNodes)
                {
                    switch (e.Name)
                    {
                    case "delayTime":
                        smc.delayTime = int.Parse(e.InnerText);
                        break;

                    case "moveTime":
                        smc.moveTime = int.Parse(e.InnerText);
                        break;

                    case "moveDis":
                        smc.moveDis = float.Parse(e.InnerText);
                        break;
                    }
                }
                skillMoveDic.Add(ID, smc);
            }
        }
    }
예제 #18
0
    public void InitSkillMoveCfgs(string path)
    {
        XmlDocument xmlDoc = new XmlDocument();

        xmlDoc.Load(path);

        XmlNode     root     = xmlDoc.SelectSingleNode("root");
        XmlNodeList nodeList = root.ChildNodes;

        foreach (XmlNode node in nodeList)
        {
            int          ID           = int.Parse(node.Attributes["ID"].Value);
            SkillMoveCfg skillMoveCfg = new SkillMoveCfg
            {
                ID = ID,
            };
            XmlNodeList fieldNodeList = node.ChildNodes;
            foreach (XmlNode fieldNode in fieldNodeList)
            {
                switch (fieldNode.Name)
                {
                case "delayTime":
                    skillMoveCfg.delayTime = int.Parse(fieldNode.InnerText);
                    break;

                case "moveTime":
                    skillMoveCfg.moveTime = int.Parse(fieldNode.InnerText);
                    break;

                case "moveDis":
                    skillMoveCfg.moveDis = float.Parse(fieldNode.InnerText);
                    break;
                }
            }
            if (!skillMoveCfgDicts.ContainsKey(ID))
            {
                skillMoveCfgDicts.Add(ID, skillMoveCfg);
            }
        }
    }
예제 #19
0
파일: ResSev.cs 프로젝트: WhitePetal/ARPG
    private void InitSkillMoveCfg()
    {
        string      xml = DeSerializeXML(PathDefine.SkillMoveCfg);
        XmlDocument doc = new XmlDocument();

        doc.LoadXml(xml);
        XmlNode root = doc.SelectSingleNode("root");

        foreach (XmlElement item in root.ChildNodes)
        {
            if (item.GetAttributeNode("ID") == null)
            {
                continue;
            }
            int          id  = int.Parse(item.GetAttributeNode("ID").InnerText);
            SkillMoveCfg cfg = new SkillMoveCfg();
            cfg.ID = id;
            foreach (XmlElement ele in item.ChildNodes)
            {
                string value = ele.InnerText;
                switch (ele.Name)
                {
                case "delayTime":
                    cfg.delayTime = int.Parse(value);
                    break;

                case "moveTime":
                    cfg.moveTime = int.Parse(value);
                    break;

                case "moveDis":
                    cfg.moveDis = float.Parse(value);
                    break;
                }
            }
            skillMoveCfgDic.Add(id, cfg);
        }
    }
예제 #20
0
    private void skillMoveLogical(EntityBase entity, SkillDataCfg skillData)
    {
        int        totalDelayTime = 0;
        List <int> skillMoveList  = skillData.skillMoveList;

        for (int i = 0; i < skillMoveList.Count; i++)
        {
            SkillMoveCfg skillMoveCfg = resSvc.GetSkillMoveCfg(skillMoveList[i]);
            float        spd          = skillMoveCfg.moveDistance / (skillMoveCfg.moveTime / 1000.0f);
            totalDelayTime += skillMoveCfg.delayTime;

            if (totalDelayTime > 0)
            {
                int moveCallbackId = -1;
                moveCallbackId = timeSvc.AddTimeTask((int tid) => {
                    entity.SetSkillMoveState(true, spd);
                    entity.RemoveMoveCallbackID(moveCallbackId);
                }, totalDelayTime);
                entity._listSkillMoveCallback.Add(moveCallbackId);
            }
            else
            {
                entity.SetSkillMoveState(true, spd);
            }

            totalDelayTime += skillMoveCfg.moveTime;

            int stopSkillMoveCallbackID = -1;
            stopSkillMoveCallbackID = timeSvc.AddTimeTask((int tid) =>
            {
                entity.SetSkillMoveState(false);
                entity.RemoveMoveCallbackID(stopSkillMoveCallbackID);
            }, totalDelayTime);
            entity._listSkillMoveCallback.Add(stopSkillMoveCallbackID);
        }
    }
예제 #21
0
    public void CalcSkillMove(EntityBase entity, SkillCfg skillData)
    {
        List <int> skillMoveList = skillData.skillMoveList;

        //多阶段位移
        int sumDelayTime = 0;

        for (int i = 0; i < skillMoveList.Count; i++)
        {
            SkillMoveCfg skillMoveData = resSvc.GetSkillMoveCfg(skillMoveList[i]);
            float        speed         = skillMoveData.moveDis / (skillMoveData.moveTime * 1.0f / 1000);
            sumDelayTime += skillMoveData.delayTime;

            if (sumDelayTime > 0)
            {
                int moveID = timeSvc.AddTimeTask((int tid) =>
                {
                    entity.SetSkillMoveState(true, speed);
                    entity.RemoveMoveCB(tid);
                }, sumDelayTime);
                entity.skillMoveCBList.Add(moveID);
            }
            else
            {
                entity.SetSkillMoveState(true, speed);
            }

            sumDelayTime += skillMoveData.moveTime;
            int stopID = timeSvc.AddTimeTask((int tid) =>
            {
                entity.SetSkillMoveState(false);
                entity.RemoveMoveCB(tid);
            }, sumDelayTime);
            entity.skillMoveCBList.Add(stopID);
        }
    }
예제 #22
0
    //技能特效与位移
    public void AttackEffect(EntityBase entity, int skillId)
    {
        //读取技能配置表
        SkillCfg skillData = resSvc.GetSkillCfg(skillId);

        entity.curtSkillCfg = skillData;
        //判断是否忽略碰撞
        if (!skillData.isCollide)
        {
            //忽略碰撞
            Physics.IgnoreLayerCollision(9, 10);
            timerSvc.AddTimeTask((id) =>
            {
                Physics.IgnoreLayerCollision(9, 10, false);
            }, skillData.skillTime);
        }

        if (skillData.isBreak == false)
        {
            //霸体状态
            entity.entityState = EntityState.BtState;
        }


        if (entity.enitityType == EnitityType.Player)
        {
            //攻击和技能的智能方向锁定
            if (entity.GetMoveDir() == Vector2.zero)
            {
                Vector2 dir = entity.CalcTargetDir();
                //自动攻击最近怪物
                if (dir != Vector2.zero)
                {
                    entity.SetAtkDir(dir, false);
                }
            }
            else
            {
                entity.SetAtkDir(entity.GetMoveDir());
            }
        }



        entity.SetAction(skillData.aniAction);           //播放动画
        entity.SetFx(skillData.fx, skillData.skillTime); //播放特效

        List <int> skillMoveLst = skillData.skillMoveLst;


        //技能位移
        long timeSum = 0;

        entity.SetSkillMove(true);
        entity.SetIsCtrl(false);
        for (int i = 0; i < skillMoveLst.Count; i++)
        {
            SkillMoveCfg skillMoveData = resSvc.GetSkillMoveCfg(skillMoveLst[i]);

            long  delayTime = skillMoveData.delayTime;     //延迟释放时间
            float distance  = skillMoveData.moveDis;       //移动距离
            long  time      = skillMoveData.moveTime;      //消耗时间
            float speed     = distance / (time / 1000.0f); //计算 每秒速度 = 距离 / 时间

            //计算延迟
            //开始位移
            timeSum += delayTime;
            int taskId_1 = timerSvc.AddTimeTask((id) =>
            {
                entity.SetSkillMove(true, speed);
                entity.RemoveMoveTask(id);
            }, timeSum);
            entity.AddMoveTask(taskId_1);

            //计算延迟
            //结束位移
            timeSum += time;
            int taskId_2 = timerSvc.AddTimeTask((id) =>
            {
                entity.SetSkillMove(true, 0);
                entity.RemoveMoveTask(id);
            }, timeSum);
            entity.AddMoveTask(taskId_2);
        }

        //等待技能释放完成回到Idle状态
        entity.skillEndCb = timerSvc.AddTimeTask((taskID) =>
        {
            entity.SetSkillMove(false);
            entity.SetIsCtrl(true);
            entity.Idle();
        }, skillData.skillTime);
    }
예제 #23
0
    /// <summary>
    /// 技能效果表现
    /// </summary>
    /// <param name="entity">。。。</param>
    /// <param name="skillID"></param>
    public void AttackEffect(EntityBase entity, int skillID, Vector3 blackAirPos)
    {
        SkillCfg skillData = resSvc.GetSkillCfgData(skillID);

        //分技能类型调整角色行为
        if (entity.entityType == EntityType.Player)
        {
            /*如果是指向技能,自动转向最近目标,如果是范围技能,朝向区域方向,
             *如果是辅助技能,方向不变,闪避技能被设定为指向技能,因为永远朝向
             *目标并且背向移动*/
            if (skillData.dmgType == DamageType.TargetSkill)
            {
                Vector2 dir = entity.CalculateTargetDir();
                if (dir != Vector2.zero)
                {
                    entity.SetAtkRotation(dir);
                }
            }
            else if (skillData.dmgType == DamageType.AreaSkill)
            {
                Vector2 dir = entity.AreaSkillTargetDir();
                if (dir != Vector2.zero)
                {
                    entity.SetAtkRotation(dir);
                }
                //如果是范围技能,且不是瞬移,在动画播放快结束的时候播放对应延迟特效,持续时间后消失。
                if (skillData.ID != Constants.id_PlayerSkill_Blink)
                {
                    entity.SetAreaSkillFX(skillData.targetFX, skillData.delayFXTime, skillData.delayCloseFXTime);
                }
            }
            else//辅助技能
            {
                if (skillData.ID == Constants.id_PlayerSkill_Heal)//治疗技能
                {
                    entity.Hp += GameRoot.instance.Playerdata.hp / 3;
                    if (entity.Hp > GameRoot.instance.Playerdata.hp)
                    {
                        entity.Hp = GameRoot.instance.Playerdata.hp;
                    }
                }
                else if (skillData.ID == Constants.id_PlayerSkill_Buff)//状态技能,攻击力+50%,进入霸体状态
                {
                    entity.AttackValue += GameRoot.instance.Playerdata.attackValue / 2;
                    entity.unBreakable  = true;
                    TimeService.instance.AddTimeTask((int tid) =>
                    {
                        entity.AttackValue -= GameRoot.instance.Playerdata.attackValue / 2;
                        entity.unBreakable  = false;
                    }, 15f);
                }
            }
            //这里分开的目的是,玩家的部分技能也有延迟时间,但是是另一种特效,不能统一显示
            entity.SetFX(skillData.fx, skillData.skillFXTime);
        }
        else//不是玩家,实际上这部分代码指的是boss的技能表现
        {
            if (skillData.dmgType == DamageType.AreaSkill)
            {
                entity.SetLoopSkill(skillData.fx, blackAirPos);
            }
            entity.SetFX(skillData.fx, skillData.skillFXTime, skillData.delayFXTime);
        }
        entity.SetAction(skillData.aniAction);

        if (skillData.cantStop)
        {
            entity.cantStop = true;
        }
        SkillMoveCfg skillMoveCfg = resSvc.GetSkillMoveCfgData(skillData.skillMove);
        float        speed        = 0;

        if (skillData.ID == Constants.id_PlayerSkill_Blink)//是瞬移技能,不是闪避
        {
            float dis = Vector3.Distance(entity.GetPos(), BattleSys.Instance.playerCtrlWnd.pos);
            speed = dis / (skillMoveCfg.moveTime / 1000f);
            entity.SetSkillMoveState(true, false, false, speed);
        }
        else if (skillData.ID == Constants.id_PlayerSkill_Dodge)            //闪避技能
        {
            speed = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f); //单位是毫秒
            entity.SetSkillMoveState(true, true, false, speed);
        }
        else if (skillData.ID == Constants.id_BossSkill_bladeStorm)         //剑刃风暴,理论上来说可以和闪避技能公用代码
        {
            speed = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f); //单位是毫秒
            entity.SetSkillMoveState(true, true, false, speed);
        }
        else if (skillData.ID == Constants.id_BossSkill_sifangzhen)//四方斩技能要位移到场地中间
        {
            float dis = Vector3.Distance(entity.GetPos(), Constants.sifangzhanPos);
            speed = dis / (skillMoveCfg.moveTime / 1000f);
            entity.SetSkillMoveState(true, false, true, speed);
        }
        timeSvc.AddTimeTask((int tid) =>
        {//技能移动时间到就设置为不能移动
            entity.SetSkillMoveState(false);
        }, skillMoveCfg.moveTime / 1000f);
        timeSvc.AddTimeTask((int tid) =>
        {
            entity.Idle();

            /*不能直接在这里修改action的值是因为,这个攻击可能会被打断,被打断以后不会进入这个状态
             * 这样就无法设置action了,所以是在退出攻击状态的时候设置action*/
        }, skillData.animationTime);
    }