示例#1
0
 public void GetCaught(HurtType hurtType, Rigidbody2D targetRigidBody)
 {
     isJumping            = isDoubleJump = isHeadBlocked = isCrouching = isAttacking = isHanging = isClimbing = isHooked = false;
     this.hurtType        = hurtType;
     this.targetRigidBody = targetRigidBody;
     isHurt = true;
 }
示例#2
0
    public void SetShuxing(HurtType hurtType)
    {
        switch (hurtType)
        {
        case HurtType.Fire:
            shuxingIcon.spriteName = "shuxing_huo";
            break;

        case HurtType.Water:
            shuxingIcon.spriteName = "shuxing_shui";
            break;

        case HurtType.Earth:
            shuxingIcon.spriteName = "shuxing_tu";
            break;

        case HurtType.Light:
            shuxingIcon.spriteName = "shuxing_guong";
            break;

        case HurtType.Dark:
            shuxingIcon.spriteName = "shuxing_fa";
            break;

        default:
            shuxingIcon.enabled = false;
            break;
        }
    }
示例#3
0
 /// <summary>
 /// 初始化
 /// </summary>
 /// <param name="gameObj"></param>
 /// <param name="totalHp"></param>
 /// <param name="currentHp"></param>
 /// <param name="changeValue"></param>
 /// <param name="hurtType"></param>
 /// <param name="objType"></param>
 public HealthChangePacker(GameObject gameObj, float totalHp, float currentHp, float changeValue,
                           HurtType hurtType, ObjectID.ObjectType objType)
 {
     GameObj     = gameObj;
     TotalHp     = totalHp;
     CurrentHp   = currentHp;
     ChangeValue = changeValue;
     HurtType    = hurtType;
     ObjType     = objType;
 }
示例#4
0
 public void Repulse(Vector2 repulseDistantion, float dazedTime)
 {
     isJumping          = isDoubleJump = isHeadBlocked = isCrouching = isAttacking = isHanging = isClimbing = isHooked = false;
     rigidBody.bodyType = RigidbodyType2D.Dynamic;
     rigidBody.velocity = Vector2.zero;
     isHurt             = true;
     hurtType           = HurtType.Repulsion;
     rigidBody.AddForce(repulseDistantion, ForceMode2D.Impulse);
     curDazedTime = dazedTime + Time.time;
 }
示例#5
0
 /// <summary>
 /// 计算护盾吸收伤害
 /// </summary>
 public static int CaculateHudun(int hurtNum, FightUnit target, HurtType hurtType)
 {
     for (int i = target.OnHudunList.Count - 1; i >= 0; i--)
     {
         if (target.OnHudunList[i] != null)
         {
             hurtNum = target.OnHudunList[i](hurtNum, hurtType);
         }
     }
     return(hurtNum);
 }
示例#6
0
    /// <summary>
    /// buff造成伤害
    /// </summary>
    public static void BuffAttackDamage(Buff buff, HurtType hurtType)
    {
        if (buff.target.isInvincible)
        {
            return;
        }
        FightUnit target  = buff.target;
        int       hurtNum = 0;

        if (hurtType == HurtType.True)
        {
            hurtNum = Mathf.RoundToInt(buff.buffValue * (1 - target.fightAttribute.allDefenseRate));
        }
        else
        {
            float elementDefenseFactor = 0;
            switch (hurtType)
            {
            case HurtType.Fire:
                elementDefenseFactor = target.fightAttribute.fireDefenseRate;
                break;

            case HurtType.Water:
                elementDefenseFactor = target.fightAttribute.waterDefenseRate;
                break;

            case HurtType.Earth:
                elementDefenseFactor = target.fightAttribute.eathDefenseRate;
                break;

            case HurtType.Light:
                elementDefenseFactor = target.fightAttribute.lightDefeneseRate;
                break;

            case HurtType.Dark:
                elementDefenseFactor = target.fightAttribute.darkDefenseRate;
                break;
            }
            hurtNum = Mathf.RoundToInt(buff.buffValue * (1 - target.fightAttribute.allDefenseRate) * (1 - elementDefenseFactor));
        }
        hurtNum = Mathf.Max(0, hurtNum);
        //护盾计算
        hurtNum = CaculateHudun(hurtNum, target, hurtType);
        //伤血
        HealthUIManager.instance.DisplayHurtNum(target, hurtNum.ToString(), true, false);
        target.health -= hurtNum;
        if (target.health == 0)
        {
            FightManager.GetInstance().UnitDead(buff.source, target);
        }
    }
示例#7
0
    void OnFantan(params object[] objs)
    {
        int      hurtNum     = (int)objs[0];
        Skill    skill       = (Skill)objs[1];
        HurtType damangeType = (HurtType)objs[2];

        if (damangeType != hurtType || skill == null)
        {
            return;
        }
        int fantanNum = Mathf.Max(1, Mathf.RoundToInt(hurtNum * buffValue));

        FightRule.FantanDamage(fantanNum, target, skill.mineUnit);
    }
        /// <summary>
        /// 受到伤害并播放伤害文字动画
        /// </summary>
        /// <param name="hurt">Hurt.</param>
        /// <param name="type">Type.</param>
        /// <param name="specialAttack">Special attack.</param>
        public void AddHurtAndShow(int hurt, HurtType type, MyTowards textTowards)
        {
            // 至少有1点伤害值
            if (hurt == 0)
            {
                hurt = 1;
            }

            string hurtString = string.Empty;

            agent.health -= hurt;

            string colorText = string.Empty;

            // 根据伤害类型添加颜色富文本
            switch (type)
            {
            case HurtType.Physical:
                if (this is BattlePlayerController)
                {
                    colorText = "red";
                }
                else
                {
                    colorText = "white";
                }
                hurtString = string.Format("<color={0}>{1}</color>", colorText, hurt);
                break;

            case HurtType.Magical:
                if (this is BattlePlayerController)
                {
                    colorText = "cyan";
                }
                else
                {
                    colorText = "lightblue";
                }
                hurtString = string.Format("<color={0}>{1}</color>", colorText, hurt);
                break;
            }

            // 加入到伤害文本队列
            AddHurtTextToQueue(hurtString, textTowards);
        }
示例#9
0
    /// <summary>
    /// Damage with catching
    /// </summary>
    public int TakeDamage(int damage, HurtType hurtType, Transform anchorPoint, Rigidbody2D rigidBody, Element element)
    {
        if (isInvulnerable)
        {
            return(0);
        }

        if (damage > 0 || element.value > 0)
        {
            health -= damage + element.value;
            timeOfLastTakenDamage = Time.time;
            statusBar.HealthChange(health);
            //Decrease energy
            //float _percentageConversionToEnergy = .05f;
            //Energy -= (damage + element.value) * _percentageConversionToEnergy;

            DamageText(damage, element);
        }

        if (health <= 0)
        {
            movement.isDead = true;
            isInvulnerable  = true;
            movement.bodyCollider.sharedMaterial = null;
            AudioManager.PlayDeathAudio();

            return(damage + element.value);
        }
        else
        {
            movement.transform.position = anchorPoint.position;
            movement.GetCaught(hurtType, rigidBody);
            AudioManager.PlayHurtAudio();
        }

        //Camera shake
        float _maxAmplitude   = 8f;
        float _shakeAmplitude = (damage + element.value) / (float)maxHealth * _maxAmplitude;

        cameraShake.Shake(_shakeAmplitude, 1f, .25f);

        return(damage + element.value);
    }
示例#10
0
    /// <summary>
    /// Damage with stun
    /// </summary>
    public int TakeDamage(int damage, HurtType hurtType, float dazedTime, Element element)
    {
        if (isInvulnerable)
        {
            return(0);
        }

        if (damage > 0 || element.value > 0)
        {
            health -= damage + element.value;
            timeOfLastTakenDamage = Time.time;
            statusBar.HealthChange(health);
            DamageText(damage, element);
            //Decrease energy
            //float _percentageConversionToEnergy = .05f;
            //Energy -= (damage + element.value) * _percentageConversionToEnergy;
        }

        if (health <= 0)
        {
            movement.isDead = true;
            isInvulnerable  = true;
            movement.bodyCollider.sharedMaterial = null;
            AudioManager.PlayDeathAudio();

            return(damage + element.value);
        }
        else
        {
            AudioManager.PlayHurtAudio();
        }

        movement.hurtType = hurtType;
        movement.Stunned(dazedTime);

        //Camera shake
        float _maxAmplitude   = 8f;
        float _shakeAmplitude = (damage + element.value) / (float)maxHealth * _maxAmplitude;

        cameraShake.Shake(_shakeAmplitude, 1f, .25f);

        return(damage + element.value);
    }
示例#11
0
    int OnHudun(params object[] objs)
    {
        int      hurtNum    = (int)objs[0];
        HurtType damageType = (HurtType)objs[1];

        if (damageType != hurtType || hurtNum == 0)
        {
            return(hurtNum);
        }
        healthHudun -= hurtNum;
        if (healthHudun <= 0)
        {
            Clear();
            return(-healthHudun);
        }
        else
        {
            return(0);
        }
    }
        private HurtType GetHurtTypeWithString(string str)
        {
            HurtType type = HurtType.None;

            switch (str)
            {
            case "":
                type = HurtType.None;
                break;

            case "物理":
                type = HurtType.Physical;
                break;

            case "魔法":
                type = HurtType.Magical;
                break;
            }

            return(type);
        }
示例#13
0
    /// <summary>
    /// Effect damage
    /// </summary>
    public int TakeDamage(int damage, HurtType hurtType, Effect effect)
    {
        if (movement.isDead)
        {
            return(0);
        }

        if (damage > 0)
        {
            health -= damage;
            statusBar.HealthChange(health);
            //Decrease energy
            //float _percentageConversionToEnergy = .05f;
            //Energy -= damage * _percentageConversionToEnergy;

            DamageText(damage, effect);
        }

        if (health <= 0)
        {
            movement.isDead = true;
            isInvulnerable  = true;
            movement.bodyCollider.sharedMaterial = null;        //Delete collider material for turn on friction
            AudioManager.PlayDeathAudio();

            return(damage);
        }
        else
        {
            AudioManager.PlayHurtAudio();
        }

        //Camera shake
        float _maxAmplitude   = 8f;
        float _shakeAmplitude = damage / (float)maxHealth * _maxAmplitude;

        cameraShake.Shake(_shakeAmplitude, 1f, .25f);

        return(damage);
    }
示例#14
0
    void Hurt()
    {
        if (curDazedTime != 0f && curDazedTime <= Time.time)
        {
            canFlip                     = true;
            curDazedTime                = 0f;
            isHurt                      = false;
            hurtType                    = HurtType.None;
            targetRigidBody             = null;
            bodyCollider.sharedMaterial = physicMaterial;

            if (rigidBody.gravityScale == 0f)
            {
                rigidBody.gravityScale = 1f;
            }
        }
        else
        {
            SpellCastEnd();
            bodyCollider.sharedMaterial = null;
            canFlip = false;

            if (isHealing)
            {
                HealingEnd();
            }

            //Follow for catch source
            if (hurtType == HurtType.Catch)
            {
                rigidBody.velocity = targetRigidBody.velocity;
            }
            else if (hurtType == HurtType.Stun)
            {
                rigidBody.velocity     = Vector2.zero;
                rigidBody.gravityScale = 0f;
            }
        }
    }
示例#15
0
文件: Buff.cs 项目: foolishfool/Spine
    public static Buff AddNewBuff(FightUnit target, FightUnit source, BuffData buffData, float buffValue, float lastTime, HurtType hurtType)
    {
        BuffLogicType type = (BuffLogicType)buffData.effectType;
        Buff          buff = null;

        switch (type)
        {
        case BuffLogicType.Yunxuan:
            buff = NGUITools.AddChild <YunxuanBuff>(target.gameObject);
            break;

        case BuffLogicType.Jiansu:
            buff = NGUITools.AddChild <JiansuBuff>(target.gameObject);
            break;

        case BuffLogicType.Jinzu:
            buff = NGUITools.AddChild <JinzuBuff>(target.gameObject);
            break;

        case BuffLogicType.Chenmo:
            buff = NGUITools.AddChild <ChenmoBuff>(target.gameObject);
            break;

        case BuffLogicType.Hunluan:
            buff = NGUITools.AddChild <HunluanBuff>(target.gameObject);
            break;

        case BuffLogicType.Meihuo:
            buff = NGUITools.AddChild <MeihuoBuff>(target.gameObject);
            break;

        case BuffLogicType.Bingdong:
            buff = NGUITools.AddChild <BingdongBuff>(target.gameObject);
            break;

        case BuffLogicType.Mabi:
            buff = NGUITools.AddChild <MabiBuff>(target.gameObject);
            break;

        case BuffLogicType.Shihua:
            buff = NGUITools.AddChild <ShihuaBuff>(target.gameObject);
            break;

        case BuffLogicType.Zhongdu:
            buff = NGUITools.AddChild <ZhongduBuff>(target.gameObject);
            break;

        case BuffLogicType.Xchixu:
            buff = NGUITools.AddChild <XchixuBuff>(target.gameObject);
            break;

        case BuffLogicType.Huifu:
            buff = NGUITools.AddChild <HuifuBuff>(target.gameObject);
            break;

        case BuffLogicType.Falihuifu:
            buff = NGUITools.AddChild <FalihuifuBuff>(target.gameObject);
            break;

        case BuffLogicType.Faliranshao:
            buff = NGUITools.AddChild <FaliranshaoBuff>(target.gameObject);
            break;

        case BuffLogicType.Cuozhi:
            buff = NGUITools.AddChild <Cuozhibuff>(target.gameObject);
            break;

        case BuffLogicType.Kuangbao:
            buff = NGUITools.AddChild <KuangbaoBuff>(target.gameObject);
            break;

        case BuffLogicType.Xjianmian:
            buff = NGUITools.AddChild <XjianmianBuff>(target.gameObject);
            break;

        case BuffLogicType.Xfantan:
            buff = NGUITools.AddChild <XfantanBuff>(target.gameObject);
            break;

        case BuffLogicType.Xixue:
            buff = NGUITools.AddChild <XixueBuff>(target.gameObject);
            break;

        case BuffLogicType.Zuzhou:
            buff = NGUITools.AddChild <ZuzhouBuff>(target.gameObject);
            break;

        case BuffLogicType.Zhufu:
            buff = NGUITools.AddChild <ZhufuBuff>(target.gameObject);
            break;

        case BuffLogicType.Xhudun:
            buff = NGUITools.AddChild <XhudunBuff>(target.gameObject);
            break;

        case BuffLogicType.Kuangye:
            buff = NGUITools.AddChild <KuangyeBuff>(target.gameObject);
            break;

        case BuffLogicType.Shanbi:
            buff = NGUITools.AddChild <ShanbiBuff>(target.gameObject);
            break;

        case BuffLogicType.Canbao:
            buff = NGUITools.AddChild <CanbaoBuff>(target.gameObject);
            break;

        case BuffLogicType.Yingyong:
            buff = NGUITools.AddChild <YingyongBuff>(target.gameObject);
            break;

        case BuffLogicType.Chihuan:
            buff = NGUITools.AddChild <ChihuanBuff>(target.gameObject);
            break;

        case BuffLogicType.Zhimang:
            buff = NGUITools.AddChild <ZhimangBuff>(target.gameObject);
            break;

        case BuffLogicType.Wudi:
            buff = NGUITools.AddChild <WudiBuff>(target.gameObject);
            break;

        case BuffLogicType.Mianyikongzhi:
            buff = NGUITools.AddChild <MianyikongzhiBuff>(target.gameObject);
            break;

        case BuffLogicType.Xyishang:
            buff = NGUITools.AddChild <XyishangBuff>(target.gameObject);
            break;

        case BuffLogicType.Pojia:
            buff = NGUITools.AddChild <PojiaBuff>(target.gameObject);
            break;

        default:
            buff = NGUITools.AddChild <Buff>(target.gameObject);
            break;
        }
        buff.target    = target;
        buff.source    = source;
        buff.buffData  = buffData;
        buff.buffValue = buffValue;
        buff.lastTime  = lastTime;
        buff.id        = (int)buffData.id;
        buff.hurtType  = hurtType;
        return(buff);
    }
示例#16
0
    ///// <summary>
    ///// 获取排头兵位置
    ///// </summary>
    ///// <param name="camp">阵营</param>
    ///// <returns>排头兵位置</returns>
    //public Vector3 GetFirstSoldierPos(int camp)
    //{
    //    Vector3 result = Vector3.zero;
    //}


    // ----------------------战斗抛事件相关----------------------

    /// <summary>
    /// 伤害类型
    /// </summary>
    /// <param name="obj">被变更单位</param>
    /// <param name="currentHp">当前血量</param>
    /// <param name="changeValue">变更血量</param>
    /// <param name="type">生命变更类型</param>
    /// <param name="totalHp">总血量</param>
    /// <param name="objType">单位类型</param>
    public void DoHealthChangeAction(GameObject obj, float totalHp, float currentHp, float changeValue, HurtType type, ObjectID.ObjectType objType)
    {
        if (healthChangeAction != null)
        {
            healthChangeAction(new HealthChangePacker(obj, totalHp, currentHp, changeValue, type, objType));
        }
    }
示例#17
0
    /// <summary>
    /// 普通攻击伤害
    /// 普通攻击伤害=攻击方最终攻击*防御效果*攻击方伤害加成效果系数*防御方对应属性免伤系数*防御方全免伤系数*属性相克系数*暴击伤害系数*random(0.95,1.05)
    /// 防御效果=1/(1+防御系数*防御方最终防御)
    /// 防御效果必须介于20%和100%之间,这两个参数由策划配置
    /// 防御常数为常量,由策划配置,下同
    /// 普通攻击的属性和单位自身的属性相同
    /// </summary>
    public static void NormalAttackDamage(FightUnit attacker, FightUnit target, NormalAttack skill, SpecialEffect hitEffect)
    {
        if (target == null || attacker == null || target.isInvincible)
        {
            return;
        }

        //判断命中
        if (IsMiss(attacker, target))
        {
            HealthUIManager.instance.DisplayHurtNum(target, "Miss", true, false);
            //触发闪避事件
            if (target.OnDodge != null)
            {
                target.OnDodge();
            }
            return;
        }

        //判断无敌
        if (target.isInvincible)
        {
            HealthUIManager.instance.DisplayHurtNum(target, "Invincible", true, false);
            return;
        }

        //判断暴击
        bool  isCrit    = false;
        float critScale = 1f;

        if (IsCritical(attacker, target))
        {
            isCrit    = true;
            critScale = Const.CONST_BASIC_CRIT_DMG + attacker.fightAttribute.criticalImprove;
            //当普通攻击暴击时
            if (attacker.OnNormalAttackCritil != null)
            {
                attacker.OnNormalAttackCritil(target);
            }
            //当被暴击时
            if (target.OnGotCritil != null)
            {
                attacker.OnGotCritil();
            }
        }

        //受击特效
        skill.StartCoroutine(skill.DisplayHitEffect(target, hitEffect));

        //计算数值
        float defense = (float)1 / (1 + Const.CONST_DEF_FACTOR * target.fightAttribute.Defence);//防御效果

        defense = Mathf.Clamp(defense, Const.CONST_MIN_DEF_EFFECT, Const.CONST_MAX_DEF_EFFECT);
        float    elementDefenseFactor = 0;
        HurtType hurtType             = (HurtType)attacker.fightAttribute.elementType;

        switch (hurtType)
        {
        case HurtType.Fire:
            elementDefenseFactor = target.fightAttribute.fireDefenseRate;
            break;

        case HurtType.Water:
            elementDefenseFactor = target.fightAttribute.waterDefenseRate;
            break;

        case HurtType.Earth:
            elementDefenseFactor = target.fightAttribute.eathDefenseRate;
            break;

        case HurtType.Light:
            elementDefenseFactor = target.fightAttribute.lightDefeneseRate;
            break;

        case HurtType.Dark:
            elementDefenseFactor = target.fightAttribute.darkDefenseRate;
            break;
        }
        float elementFactor = ElementFactorDic[(int)attacker.fightAttribute.elementType * 10 + (int)target.fightAttribute.elementType].factor;
        int   hurtNum       = Mathf.RoundToInt(attacker.fightAttribute.attack * defense
                                               * (1 + attacker.fightAttribute.allDamageRate) * (1 - elementDefenseFactor) * (1 - target.fightAttribute.allDefenseRate) * elementFactor * critScale * Random.Range(0.95f, 1.05f));

        hurtNum = Mathf.Max(0, hurtNum);

        //触发普通攻击命中事件
        if (attacker.OnNoramlAttackHit != null)
        {
            attacker.OnNoramlAttackHit(hurtNum);
        }
        //触发反弹事件
        if (target.OnFantan != null)
        {
            target.OnFantan(hurtNum, skill, hurtType);
        }
        //护盾计算
        hurtNum = CaculateHudun(hurtNum, target, hurtType);

        //伤血
        if (hurtNum == 0)
        {
            return;
        }
        HealthUIManager.instance.DisplayHurtNum(target, hurtNum.ToString(), true, isCrit);
        target.health -= hurtNum;
        if (target.health == 0)
        {
            FightManager.GetInstance().UnitDead(attacker, target);
        }
    }
示例#18
0
 /// <summary>
 /// 技能附加buff
 /// </summary>
 public static void SkillAttachBuff(FightUnit attacker, FightUnit target, List <Skill.buffConfig> buffConfigList, HurtType hurtType)
 {
     if (buffConfigList.Count == 0)
     {
         return;
     }
     for (int i = 0; i < buffConfigList.Count; i++)
     {
         ActiveSkill.buffConfig buffConfig = buffConfigList[i];
         BuffData buffData = BuffDataDic[buffConfig.id];
         //判断免疫
         if (!IsBuffAttachable(target, buffData))
         {
             continue;
         }
         //判断控制buff的命中
         if (buffData.controlDebuff == 1 && Random.value > 1 - Mathf.Max(0, (target.fightAttribute.level - buffConfig.level)) * Const.CONST_RESIST_FACTOR)
         {
             continue;
         }
         float buffValue = Mathf.RoundToInt(attacker.fightAttribute.attack * buffConfig.percent) + buffConfig.value;
         Buff  buff      = Buff.AddNewBuff(target, attacker, buffData, buffValue, buffConfig.time, hurtType);
         buff.bindSkill = buffConfig.bindSkill;
     }
 }
示例#19
0
    public static void UniqueSkillDamage(FightUnit attacker, FightUnit target, UniqueSkill skill)
    {
        if (target == null || attacker == null || target.isInvincible)
        {
            return;
        }
        //判断命中
        if (IsMiss(attacker, target))
        {
            HealthUIManager.instance.DisplayHurtNum(target, "Miss", true, false);
            //当闪避攻击时
            if (target.OnDodge != null)
            {
                target.OnDodge();
            }
            return;
        }
        //判断无敌
        if (target.isInvincible)
        {
            HealthUIManager.instance.DisplayHurtNum(target, "Invincible", true, false);
            return;
        }
        //判断暴击
        bool  isCrit    = false;
        float critScale = 1f;

        if (IsCritical(attacker, target))
        {
            isCrit    = true;
            critScale = Const.CONST_BASIC_CRIT_DMG + attacker.fightAttribute.criticalImprove;
            //当被暴击时
            if (target.OnGotCritil != null)
            {
                target.OnGotCritil();
            }
        }
        float defense = (float)1 / (1 + Const.CONST_DEF_FACTOR * target.fightAttribute.Defence);//防御效果

        defense = Mathf.Clamp(defense, Const.CONST_MIN_DEF_EFFECT, Const.CONST_MAX_DEF_EFFECT);
        int      hurtNum  = 1;
        HurtType hurtType = (HurtType)skill.specialSkill.attackAttribute;

        if (hurtType != HurtType.True)
        {
            float elementFactor        = ElementFactorDic[skill.specialSkill.attackAttribute * 10 + (int)target.fightAttribute.elementType].factor;//属性伤害系数
            float elementDefenseFactor = 0;
            switch (hurtType)
            {
            case HurtType.Fire:
                elementDefenseFactor = target.fightAttribute.fireDefenseRate;
                break;

            case HurtType.Water:
                elementDefenseFactor = target.fightAttribute.waterDefenseRate;
                break;

            case HurtType.Earth:
                elementDefenseFactor = target.fightAttribute.eathDefenseRate;
                break;

            case HurtType.Light:
                elementDefenseFactor = target.fightAttribute.lightDefeneseRate;
                break;

            case HurtType.Dark:
                elementDefenseFactor = target.fightAttribute.darkDefenseRate;
                break;
            }
            hurtNum = Mathf.RoundToInt((float)(attacker.fightAttribute.attack * skill.specialSkillLvUp.percent + skill.specialSkillLvUp.additional) * defense
                                       * (1 + attacker.fightAttribute.allDamageRate) * (1 - elementDefenseFactor) * (1 - target.fightAttribute.allDefenseRate) * elementFactor * critScale * Random.Range(0.95f, 1.05f));
        }
        else
        {
            hurtNum = Mathf.RoundToInt((float)(attacker.fightAttribute.attack * skill.specialSkillLvUp.percent + skill.specialSkillLvUp.additional)
                                       * (1 + attacker.fightAttribute.allDamageRate) * (1 - target.fightAttribute.allDefenseRate) * critScale * Random.Range(0.95f, 1.05f));
        }
        hurtNum = Mathf.Max(0, hurtNum);

        //受击特效
        skill.StartCoroutine(skill.DisplayHitEffect(target));
        //触发技能命中事件
        if (attacker.OnSkillHit != null)
        {
            attacker.OnSkillHit(hurtNum);
        }
        //触发反弹事件
        if (target.OnFantan != null)
        {
            target.OnFantan(hurtNum, skill, hurtType);
        }
        //护盾计算
        hurtNum = CaculateHudun(hurtNum, target, hurtType);
        //附加buff
        SkillAttachBuff(attacker, target, skill.buffConfigList, (HurtType)skill.specialSkill.attackAttribute);
        //附加效果
        AttachExtension(attacker, target, hurtNum, skill.attachExtension, skill.attachExtensionParam);
        //伤血
        if (hurtNum == 0)
        {
            return;
        }
        HealthUIManager.instance.DisplayHurtNum(target, hurtNum.ToString(), true, isCrit);
        target.health -= hurtNum;
        if (target.health == 0)
        {
            FightManager.GetInstance().UnitDead(attacker, target);
        }
    }