public void ToAttackByIndex(AttackType attackType, int index)
    {
        if (m_RoleFSMMgr == null)
        {
            return;
        }
        if (m_StateAttak == null)
        {
            m_StateAttak = (RoleStateAttack)m_RoleFSMMgr.GetState(RoleState.Attack);
            if (m_StateAttak == null)
            {
                return;
            }
        }
        m_RoleFSMMgr.CurRoleCtrl.CurAttackInfo = m_RoleFSMMgr.CurRoleCtrl.Attack.GetAttackInfoByIndex(attackType, index);
        m_StateAttak.AnimatorCondition         = (attackType == AttackType.PhyAttack ? ToAnimatorCondition.ToPhyAttack.ToString() : ToAnimatorCondition.ToSkillAttack.ToString());
        m_StateAttak.AnimatorConditionValue    = index;
        KeyValuePair <string, int> stateValue = GetAnimatorName(attackType, index);

        m_StateAttak.CurAnimatorName   = stateValue.Key;
        m_StateAttak.CurrentStateValue = stateValue.Value;
        //必须能进去
        m_RoleFSMMgr.ChangeState(RoleState.Attack);
    }
示例#2
0
    public void ToAttack(RoleAttackType type, int skillId)
    {
        if (m_CurrRoleFSMMgr == null || m_CurrRoleFSMMgr.CurrRoleCtrl.IsRigidity)
        {
            if (type == RoleAttackType.SkillAttack)
            {
                m_NextSkillId = skillId;
            }
            return;
        }
        m_NextSkillId = -1;
        //1.角色类型只有玩家和怪才参与技能数值计算

        if (m_CurrRoleCtrl.CurrRoleType == RoleType.MainPlayer || m_CurrRoleCtrl.CurrRoleType == RoleType.Monster)
        {
            //2.获取技能信息
            SkillEntity skillEntity = SkillDBModel.Instance.Get(skillId);
            if (skillEntity == null)
            {
                return;
            }
            int skillLevel = m_CurrRoleCtrl.CurrRoleInfo.GetSkillLevel(skillId);
            //技能所需魔法值
            int spendMP = skillEntity.SpendMP + skillEntity.SpendMPLevelUp * (skillLevel - 1);
            //3.如果是主角
            if (m_CurrRoleCtrl.CurrRoleType == RoleType.MainPlayer && type == RoleAttackType.SkillAttack)
            {
                if (GlobalInit.Instance.SkillSlotsItem != null)
                {
                    if (spendMP > GlobalInit.Instance.PlayerInfo.CurrMP)
                    {
                        TipsUtil.ShowTextTips(1000504);
                        return;
                    }
                    GlobalInit.Instance.PlayerInfo.CurrMP -= spendMP;
                    GlobalInit.Instance.PlayerInfo.SetSkillCDEndTime(skillId);
                    if (m_CurrRoleCtrl.OnMPChange != null)
                    {
                        m_CurrRoleCtrl.OnMPChange(ValueChnageType.Reduce);
                    }
                    GlobalInit.Instance.SkillSlotsItem.AddTimer();
                    GlobalInit.Instance.SkillSlotsItem = null;
                }
            }
            m_EnemyList.Clear();
            //4.找敌人 如果是主角才找敌人 怪找敌人使用AI
            if (m_CurrRoleCtrl.CurrRoleType == RoleType.MainPlayer)
            {
                int attackTargetCount = skillEntity.AttackTargetCount;
                if (attackTargetCount == 1)
                {
                    #region ------ 单体攻击 ------
                    //单体攻击 必须有锁定敌人
                    if (m_CurrRoleCtrl.LockEnemy != null)
                    {
                        m_EnemyList.Add(m_CurrRoleCtrl.LockEnemy);
                    }
                    else
                    {
                        m_SearchList.Clear();
                        //没有锁定敌人
                        //发射射线去找 离当前攻击者最近的 就是锁定敌人
                        Collider[] searchList = Physics.OverlapSphere(m_CurrRoleCtrl.transform.position, skillEntity.AreaAttackRadius, 1 << LayerMask.NameToLayer("Role"));
                        if (searchList != null && searchList.Length > 0)
                        {
                            for (int i = 0; i < searchList.Length; i++)
                            {
                                if (searchList[i].GetComponent <RoleCtrl>().CurrRoleType != RoleType.MainPlayer)
                                {
                                    m_SearchList.Add(searchList[i]);
                                }
                            }
                        }
                        m_SearchList.Sort((c1, c2) =>
                        {
                            int ret = 0;
                            if (Vector3.Distance(c1.transform.position, m_CurrRoleCtrl.transform.position) <
                                Vector3.Distance(c2.transform.position, m_CurrRoleCtrl.transform.position))
                            {
                                ret = -1;
                            }
                            else
                            {
                                ret = 1;
                            }
                            return(ret);
                        });
                        if (m_SearchList.Count > 0)
                        {
                            m_CurrRoleCtrl.LockEnemy = m_SearchList[0].GetComponent <RoleCtrl>();
                            m_EnemyList.Add(m_CurrRoleCtrl.LockEnemy);
                        }
                    }
                    #endregion
                }
                else
                {
                    #region ------ 群体攻击 ------

                    int needAttackCount = attackTargetCount;
                    m_SearchList.Clear();
                    //没有锁定敌人
                    //发射射线去找 离当前攻击者最近的 就是锁定敌人
                    Collider[] searchList = Physics.OverlapSphere(m_CurrRoleCtrl.transform.position, skillEntity.AreaAttackRadius, 1 << LayerMask.NameToLayer("Role"));
                    if (searchList != null && searchList.Length > 0)
                    {
                        for (int i = 0; i < searchList.Length; i++)
                        {
                            if (searchList[i].GetComponent <RoleCtrl>().CurrRoleType != RoleType.MainPlayer)
                            {
                                m_SearchList.Add(searchList[i]);
                            }
                        }
                    }
                    m_SearchList.Sort((c1, c2) =>
                    {
                        int ret = 0;
                        if (Vector3.Distance(c1.transform.position, m_CurrRoleCtrl.transform.position) <
                            Vector3.Distance(c2.transform.position, m_CurrRoleCtrl.transform.position))
                        {
                            ret = -1;
                        }
                        else
                        {
                            ret = 1;
                        }
                        return(ret);
                    });

                    //群体攻击 如果有锁定敌人 锁定敌人必须是攻击目标之一
                    if (m_CurrRoleCtrl.LockEnemy != null)
                    {
                        m_EnemyList.Add(m_CurrRoleCtrl.LockEnemy);
                        needAttackCount--;
                        for (int i = 0; i < m_SearchList.Count; i++)
                        {
                            RoleCtrl ctrl = m_SearchList[i].GetComponent <RoleCtrl>();
                            if (ctrl.CurrRoleInfo.RoleId != m_CurrRoleCtrl.CurrRoleInfo.RoleId)
                            {
                                if ((i + 1) > needAttackCount)
                                {
                                    break;
                                }
                                m_EnemyList.Add(m_SearchList[i].GetComponent <RoleCtrl>());
                            }
                        }
                    }
                    else
                    {
                        if (m_SearchList.Count > 0)
                        {
                            m_CurrRoleCtrl.LockEnemy = m_SearchList[0].GetComponent <RoleCtrl>();
                            for (int i = 0; i < m_SearchList.Count; i++)
                            {
                                RoleCtrl ctrl = m_SearchList[i].GetComponent <RoleCtrl>();
                                if ((i + 1) > needAttackCount)
                                {
                                    break;
                                }
                                m_EnemyList.Add(ctrl);
                            }
                        }
                    }


                    #endregion
                }
            }
            else if (m_CurrRoleCtrl.CurrRoleType == RoleType.Monster)
            {
                if (m_CurrRoleCtrl.LockEnemy != null)
                {
                    m_EnemyList.Add(m_CurrRoleCtrl.LockEnemy);
                }
            }
            //Debug.Log(m_EnemyList.Count);
            //5.让敌人受伤
            for (int i = 0; i < m_EnemyList.Count; i++)
            {
                m_EnemyList[i].ToHurt(CalculateHurtValue(m_EnemyList[i], skillEntity));
            }
        }

        #region ------ 动画特效相关 ------
        RoleAttackInfo info = GetRoleAttackInfo(type, skillId);
        if (info == null)
        {
            return;
        }

        GlobalInit.Instance.StartCoroutine(PlayerEffect(info));
        //EffectManager.Instance.DestroyEffect(trans, info.EffectLifeTime);
        //if (info.IsDoCameraShake && CameraCtrl.Instance != null)
        //{
        //    CameraCtrl.Instance.CameraShake(info.CameraShakeDelay);
        //}

        if (m_RoleStateAttack == null)
        {
            m_RoleStateAttack = m_CurrRoleFSMMgr.GetRoleState(RoleState.Attack) as RoleStateAttack;
        }

        m_RoleStateAttack.AnimatorCondition      = type == RoleAttackType.PhyAttack ? "ToPhyAttack" : "ToSkill";
        m_RoleStateAttack.AnimatorConditionValue = info.Index;
        m_RoleStateAttack.AnimatorCurrState      = GameUtil.GetRoleAnimatorState(type, info.Index);

        #endregion

        m_CurrRoleFSMMgr.ChangeState(RoleState.Attack);
    }
    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);
    }