Ejemplo n.º 1
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);
    }