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); }