예제 #1
0
    public IEnumerator ToHurt(RoleTransferAttackInfo attackInfo)
    {
        if (m_RoleFSMMgr == null)
        {
            yield break;
        }
        SkillEntity      skillEntity      = SkillDBModel.Instance.Get(attackInfo.SkillId);
        SkillLevelEntity skillLevelEntity = SkillLevelDBModel.Instance.GetEnityBySkillIdAndSkillLevel(attackInfo.SkillId, attackInfo.SkillLevel);

        if (skillEntity == null || skillLevelEntity == null)
        {
            yield break;
        }
        yield return(new WaitForSeconds(skillEntity.ShowHurtEffectDelaySecond));

        //¼õѪ
        m_RoleFSMMgr.CurRoleCtrl.CurRoleInfo.CurrentHP -= attackInfo.HurtValue;
        if (OnHurt != null)
        {
            OnHurt();
        }
        if (m_RoleFSMMgr.CurRoleCtrl.CurRoleInfo.CurrentHP < 0)
        {
            m_RoleFSMMgr.CurRoleCtrl.CurRoleInfo.CurrentHP = 0;
            m_RoleFSMMgr.CurRoleCtrl.ToDie();
            yield break;
        }
        //²¥·ÅÊÜÉËÌØЧ
        int   fontSize = 1;
        Color color    = Color.red;

        if (attackInfo.IsCri)
        {
            fontSize = 2;
            color    = Color.yellow;
        }
        UISceneCtrl.Instance.CurrentUIScene.HUD.NewText("- " + attackInfo.HurtValue.ToString(), m_RoleFSMMgr.CurRoleCtrl.transform, color, fontSize, 15f, -1f, 2.2f, UnityEngine.Random.Range(0, 2) == 1 ? bl_Guidance.LeftDown : bl_Guidance.RightDown);
        if (!m_RoleFSMMgr.CurRoleCtrl.IsRigibody)
        {
            m_RoleFSMMgr.ChangeState(RoleState.Hurt);
        }
    }
예제 #2
0
    /// <summary> 计算攻击信息 </summary>
    /// <param name="enemy"></param>
    /// <param name="entity"></param>
    /// <returns></returns>
    private RoleTransferAttackInfo CalculateHurtValue(RoleCtrl enemy, SkillEntity entity)
    {
        if (enemy == null || entity == null)
        {
            return(null);
        }
        int skillLevel = m_CurrRoleCtrl.CurrRoleInfo.GetSkillLevel(entity.Id);
        RoleTransferAttackInfo attackInfo = new RoleTransferAttackInfo();

        attackInfo.AttackRoleId   = m_CurrRoleCtrl.CurrRoleInfo.RoleId;
        attackInfo.AttackRolePos  = m_CurrRoleCtrl.transform.position;
        attackInfo.BeAttackRoleId = enemy.CurrRoleInfo.RoleId;
        attackInfo.SkillId        = entity.Id;
        attackInfo.SkillLevel     = skillLevel;
        attackInfo.IsAbnormal     = entity.AbnormalState == 1;

        //1.攻击数值 = 攻击者综合战斗力 * (技能伤害倍率 * 0.001f)
        float attackValue = (int)(m_CurrRoleCtrl.CurrRoleInfo.Fighting * (entity.HurtValueRate + entity.HurtValueRateUp * (skillLevel - 1)) * 0.001f);
        //2.基础伤害 = 攻击数值 * 攻击数值/(攻击数值+被攻击者的防御)
        float baseHurt = attackValue * attackValue / (attackValue + enemy.CurrRoleInfo.Defense);
        //3.暴击率 = 攻击方暴击/(被攻击方暴击*5);
        float criValue = m_CurrRoleCtrl.CurrRoleInfo.GetFinalCri() / (float)enemy.CurrRoleInfo.GetFinalCri();

        //暴击率的最大值为50%
        criValue = criValue > 0.5f ? 0.5f : criValue;
        //4.是否暴击
        bool isCri = UnityEngine.Random.Range(0f, 1f) <= criValue;
        //5.暴击伤害倍率 = 暴击?1.5f:1f
        float criHurt = isCri ? 1.5f : 1f;
        //6.随机数 = 0.9f-1.1f
        float random = UnityEngine.Random.Range(0.9f, 1.1f);
        //7.最终伤害 = 基础伤害 * 暴击伤害倍率 * 随机数
        int finalHurt = Mathf.RoundToInt(baseHurt * criHurt * random);

        finalHurt            = finalHurt < 1 ? 1 : finalHurt;
        attackInfo.HurtValue = finalHurt;
        attackInfo.IsCri     = isCri;

        return(attackInfo);
    }
예제 #3
0
    private RoleTransferAttackInfo CalculationHurtValue(RoleCtrl enemy, SkillEntity skillEntity, SkillLevelEntity skillLevelEntity)
    {
        if (enemy == null || skillEntity == null || skillLevelEntity == null)
        {
            return(null);
        }
        RoleTransferAttackInfo t = new RoleTransferAttackInfo();

        t.AttackRoleID   = m_RoleCtrl.CurRoleInfo.RoleId;
        t.AttackRolePos  = m_RoleCtrl.transform.position;
        t.BeAttaclRoleID = enemy.CurRoleInfo.RoleId;
        t.SkillId        = skillEntity.Id;
        t.SkillLevel     = skillLevelEntity.Level;
        t.IsAbnormal     = skillEntity.AbnormalState == 1;

        //计算伤害
        //1.攻击数值=攻击方的综合战斗力*(技能的伤害倍率*0.01f)
        float attackValue = m_RoleCtrl.CurRoleInfo.Fighting * (skillLevelEntity.HurtValueRate * 0.01f);
        //2.基础伤害=g攻击数值*攻击数值/(攻击数值+被攻击方的防御)
        float baseHurt = attackValue * attackValue / (attackValue * enemy.CurRoleInfo.Defense);
        //3.暴击概率=0.05f+(攻击方的暴击/(攻击方的暴击+防御方的抗性))*0.1f
        float cri = 0.05f + (m_RoleCtrl.CurRoleInfo.Cri / (m_RoleCtrl.CurRoleInfo.Cri / (float)enemy.CurRoleInfo.Res)) * 0.1f;

        cri = cri > 0.5f ? 0.5f : cri;
        //4.是否暴击=0-1随机数<=随机数
        bool isCri = Random.Range(0f, 1f) <= cri;
        //5.暴击伤害倍率=有暴击?1.5f:1f
        float criHurt = isCri ? 1.5f : 1f;
        //6.随机数 0.9f-1.1f
        float random = Random.Range(0.9f, 1.1f);
        //7.最终伤害 =基础伤害*暴击伤害倍率*随机数
        int hurtValue = (int)(baseHurt * criHurt * random);

        hurtValue   = hurtValue < 1 ? 1 : hurtValue;
        t.IsCri     = isCri;
        t.HurtValue = hurtValue;
        return(t);
    }
예제 #4
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="attackValue">受到的攻击力</param>
 /// <param name="delay">延迟时间</param>
 public void ToHurt(RoleTransferAttackInfo attackInfo)
 {
     StartCoroutine(m_Hurt.ToHurt(attackInfo));
 }
예제 #5
0
    public bool ToAttackBySkillId(AttackType attackType, int skillId)
    {
        if (m_RoleFSMMgr == null || m_RoleCtrl.IsRigibody)
        {
            if (attackType == AttackType.SkillAttack)
            {
                m_FollowSkillId = skillId;
            }
            return(false);
        }
        m_FollowSkillId = -1;
        #region
        //只有主角和怪参与数值计算
        if (m_RoleCtrl.CurRoleType == RoleType.MainPlayer || m_RoleCtrl.CurRoleType == RoleType.Monster)
        {
            SkillEntity skillEntity = SkillDBModel.Instance.Get(skillId);
            if (skillEntity == null)
            {
                return(false);
            }
            int skillLevel = 1;
            if (m_RoleCtrl.CurRoleType == RoleType.MainPlayer)
            {
                skillLevel = ((RoleInfoMainPlayer)m_RoleCtrl.CurRoleInfo).GetSkillLevel(skillId);
            }
            SkillLevelEntity skillLevelEnity = SkillLevelDBModel.Instance.GetEnityBySkillIdAndSkillLevel(skillId, skillLevel);
            //主角
            if (m_RoleCtrl.CurRoleType == RoleType.MainPlayer)
            {
                if (skillLevelEnity.SpendMP > m_RoleCtrl.CurRoleInfo.CurrentMP)
                {
                    return(false);
                }
                m_RoleCtrl.CurRoleInfo.CurrentMP -= skillLevelEnity.SpendMP;
                if (m_RoleCtrl.CurRoleInfo.CurrentMP < 0)
                {
                    m_RoleCtrl.CurRoleInfo.CurrentMP = 0;
                }
                if (m_RoleCtrl.OnMPChange != null)
                {
                    m_RoleCtrl.OnMPChange(ValueChangeType.Reduce);
                }
            }
            //暂时 只有玩家才寻找敌人
            m_EnemyList.Clear();
            if (m_RoleCtrl.CurRoleType == RoleType.MainPlayer)
            {
                int attackTargetCount = skillEntity.AttackTargetCount;
                if (attackTargetCount == 1)
                {
                    //单体攻击
                    if (m_RoleCtrl.LockEnemy != null)
                    {
                        //有锁定敌人
                        m_EnemyList.Add(m_RoleCtrl.LockEnemy);
                    }
                    else
                    {
                        //没有锁定敌人
                        SearchAndSortEnemys(skillEntity.AreaAttackRadius);
                        bool isFind = false;
                        for (int i = 0; i < m_SearchEnemyList.Count; i++)
                        {
                            RoleCtrl lockEnemy = m_SearchEnemyList[i].GetComponent <RoleCtrl>();
                            if (lockEnemy.CurRoleType == RoleType.MainPlayer || lockEnemy.FSM.CurrentRoleStateEnum == RoleState.Die)
                            {
                                continue;
                            }
                            m_EnemyList.Add(lockEnemy);
                            m_RoleCtrl.LockEnemy = lockEnemy;
                            break;
                        }
                        if (!isFind)
                        {
                            //找不到敌人
                            return(false);
                        }
                    }
                }
                else
                {
                    //群体攻击
                    int needCount = attackTargetCount;
                    if (m_RoleCtrl.LockEnemy != null)
                    {
                        //有锁定敌人
                        m_EnemyList.Add(m_RoleCtrl.LockEnemy);
                        needCount--;
                        SearchAndSortEnemys(skillEntity.AreaAttackRadius);
                        //循环加入搜索到的敌人
                        for (int i = 0; i < m_SearchEnemyList.Count; i++)
                        {
                            RoleCtrl lockEnemy = m_SearchEnemyList[i].GetComponent <RoleCtrl>();
                            if (lockEnemy.CurRoleInfo.RoleId == m_RoleCtrl.LockEnemy.CurRoleInfo.RoleId || lockEnemy.CurRoleType == RoleType.MainPlayer || lockEnemy.FSM.CurrentRoleStateEnum == RoleState.Die)
                            {
                                continue;
                            }
                            if (i + 1 > needCount)
                            {
                                break;
                            }
                            m_EnemyList.Add(lockEnemy);
                        }
                    }
                    else
                    {
                        //没有锁定敌人
                        SearchAndSortEnemys(skillEntity.AreaAttackRadius);
                        if (m_SearchEnemyList.Count > 0)
                        {
                            for (int i = 0; i < m_SearchEnemyList.Count; i++)
                            {
                                if (i + 1 > needCount)
                                {
                                    break;
                                }
                                RoleCtrl lockEnemy = m_SearchEnemyList[i].GetComponent <RoleCtrl>();
                                if (lockEnemy.CurRoleType == RoleType.MainPlayer || lockEnemy.FSM.CurrentRoleStateEnum == RoleState.Die)
                                {
                                    continue;
                                }
                                if (i == 0)
                                {
                                    m_RoleCtrl.LockEnemy = lockEnemy;
                                }
                                m_EnemyList.Add(lockEnemy);
                            }
                        }
                        else
                        {
                            return(false);
                        }
                    }
                }
            }
            else
            {
                m_EnemyList.Add(m_RoleCtrl.LockEnemy);
            }

            for (int i = 0; i < m_EnemyList.Count; i++)
            {
                RoleTransferAttackInfo t = CalculationHurtValue(m_EnemyList[i], skillEntity, skillLevelEnity);
                if (t == null)
                {
                    return(false);
                }
                m_EnemyList[i].ToHurt(t);
            }
        }


        #endregion

        #region 动画相关
        if (m_StateAttak == null)
        {
            m_StateAttak = (RoleStateAttack)m_RoleFSMMgr.GetState(RoleState.Attack);
            if (m_StateAttak == null)
            {
                return(false);
            }
        }
        m_RoleFSMMgr.CurRoleCtrl.CurAttackInfo = GetAttackInfoBySkillId(attackType, skillId);
        m_StateAttak.AnimatorCondition         = (attackType == AttackType.PhyAttack ? ToAnimatorCondition.ToPhyAttack.ToString() : ToAnimatorCondition.ToSkillAttack.ToString());
        m_StateAttak.AnimatorConditionValue    = m_RoleFSMMgr.CurRoleCtrl.CurAttackInfo.Index;
        KeyValuePair <string, int> stateValue = GetAnimatorName(attackType, m_RoleFSMMgr.CurRoleCtrl.CurAttackInfo.Index);
        m_StateAttak.CurAnimatorName   = stateValue.Key;
        m_StateAttak.CurrentStateValue = stateValue.Value;
        m_RoleFSMMgr.ChangeState(RoleState.Attack);
        #endregion
        return(true);
    }
예제 #6
0
    /// <summary> 角色受伤 </summary>
    /// <param name="attackInfo"></param>
    public IEnumerator ToHurt(RoleTransferAttackInfo attackInfo)
    {
        if (m_CurrRoleFSMMgr == null)
        {
            yield break;
        }
        //如果角色已经死亡了 直接返回
        if (m_CurrRoleFSMMgr.CurrRoleStateEnum == RoleState.Die)
        {
            yield break;
        }
        SkillEntity skillEntity = SkillDBModel.Instance.Get(attackInfo.SkillId);

        if (skillEntity == null)
        {
            yield break;
        }

        yield return(new WaitForSeconds(skillEntity.ShowHurtEffectDelaySecond));

        //1.减血

        m_CurrRoleFSMMgr.CurrRoleCtrl.CurrRoleInfo.CurrHP -= attackInfo.HurtValue;
        int   fontSize = 15;
        Color color    = Color.red;

        if (attackInfo.IsCri)
        {
            fontSize = 30;
            color    = Color.yellow;
        }
        UISceneCtrl.Instance.CurrentUIScene.HUDText.NewText("- " + attackInfo.HurtValue, m_CurrRoleFSMMgr.CurrRoleCtrl.transform, color, fontSize, 15f, -1f, 2.2f, UnityEngine.Random.Range(0, 2) == 1? bl_Guidance.RightDown:bl_Guidance.LeftDown);
        if (OnRoleHurt != null)
        {
            OnRoleHurt();
        }
        if (m_CurrRoleFSMMgr.CurrRoleCtrl.CurrRoleInfo.CurrHP <= 0)
        {
            //角色死亡
            m_CurrRoleFSMMgr.CurrRoleCtrl.CurrRoleInfo.CurrHP = 0;
            m_CurrRoleFSMMgr.CurrRoleCtrl.ToDie();

            yield break;
        }
        //2.播放受伤特效
        Transform hurtTrans = EffectManager.Instance.PlayEffect("Effect_Hurt", "Common");

        //TODO 设置特效位置
        hurtTrans.position = m_CurrRoleFSMMgr.CurrRoleCtrl.transform.position;
        hurtTrans.rotation = m_CurrRoleFSMMgr.CurrRoleCtrl.transform.rotation;
        EffectManager.Instance.DestroyEffect(hurtTrans, 2f);


        //3.弹出受伤数字 HUDText(包括暴击效果)

        //4.屏幕泛红

        //不是僵直状态才播放受伤动画
        if (!m_CurrRoleFSMMgr.CurrRoleCtrl.IsRigidity)
        {
            m_CurrRoleFSMMgr.ChangeState(RoleState.Hurt);
        }
    }