public List <RoleAttackInfo> GetSkillAttakInfoList(int monsterId) { if (SkillAttackInfoDic.ContainsKey(monsterId)) { return(SkillAttackInfoDic[monsterId]); } List <RoleAttackInfo> list = new List <RoleAttackInfo>(); int[] skillAttakIdArray = Get(monsterId).PhyAttackIdArray; for (int i = 0; i < skillAttakIdArray.Length; i++) { SkillEntity skillEntity = SkillDBModel.Instance.Get(skillAttakIdArray[i]); RoleAttackInfo info = new RoleAttackInfo(); info.Index = i + 1; info.SkillId = skillAttakIdArray[i]; info.EffectName = skillEntity.EffectName; info.ShowEffectDelay = skillEntity.ShowEffectDelay; info.EffectLifeTime = skillEntity.EffectLifeTime; info.AttackRange = skillEntity.AttackRange; info.HurtDelayTime = skillEntity.ShowHurtEffectDelaySecond; info.IsDoCameraShake = skillEntity.IsDoCameraShake > 0; info.CameraShakeDelay = skillEntity.CameraShakeDelay; list.Add(info); } SkillAttackInfoDic[monsterId] = list; return(SkillAttackInfoDic[monsterId]); }
public List <RoleAttackInfo> GetSkillAttakInfoList(int jobId) { if (SkillAttackInfoDic.ContainsKey(jobId)) { return(SkillAttackInfoDic[jobId]); } List <RoleAttackInfo> list = new List <RoleAttackInfo>(); int[] skillAttakIdArray = GlobalInit.Instance.PlayerInfo.SkillIdArrayBySlots; for (int i = 0; i < skillAttakIdArray.Length; i++) { SkillEntity skillEntity = Get(skillAttakIdArray[i]); RoleAttackInfo info = new RoleAttackInfo(); //info.Index = i + 1; info.Index = GetIndex(jobId, skillAttakIdArray[i]); info.SkillId = skillAttakIdArray[i]; info.EffectName = skillEntity.EffectName; info.ShowEffectDelay = skillEntity.ShowEffectDelay; info.EffectLifeTime = skillEntity.EffectLifeTime; info.AttackRange = skillEntity.AttackRange; info.HurtDelayTime = skillEntity.ShowHurtEffectDelaySecond; info.IsDoCameraShake = skillEntity.IsDoCameraShake > 0; info.CameraShakeDelay = skillEntity.CameraShakeDelay; list.Add(info); } SkillAttackInfoDic[jobId] = list; return(SkillAttackInfoDic[jobId]); }
private IEnumerator PlayerEffect(RoleAttackInfo info) { yield return(new WaitForSeconds(info.ShowEffectDelay)); Transform trans = EffectManager.Instance.PlayEffect(info.EffectName); //TODO 设置特效位置 trans.position = m_CurrRoleFSMMgr.CurrRoleCtrl.transform.position; trans.rotation = m_CurrRoleFSMMgr.CurrRoleCtrl.transform.rotation; EffectManager.Instance.DestroyEffect(trans, info.EffectLifeTime); if (info.IsDoCameraShake && CameraCtrl.Instance != null) { CameraCtrl.Instance.CameraShake(info.CameraShakeDelay); } }
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); }