| | |
| | | using UnityEngine; |
| | | using UnityEngine.AI; |
| | | using TowerDefense.Level; |
| | | using TowerDefense.Towers; |
| | | |
| | | /// <summary> |
| | | /// 基于兵线的Agent Instance管理器 |
| | |
| | | /// </summary> |
| | | public List<Agent> listAgent { get { return this.agentInsList; } } |
| | | |
| | | /// <summary> |
| | | /// 获取距目标结点最近的Agent. |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public Agent getMinDisAgent(bool _noPoison = false) |
| | | // /// <summary> |
| | | // /// 获取距目标结点最近的Agent. |
| | | // /// </summary> |
| | | // /// <returns></returns> |
| | | // public Agent getMinDisAgent(bool _noPoison = false) |
| | | // { |
| | | // if (agentInsList.Count == 0) return null; |
| | | |
| | | // // 排序,然后返回对应的数据 |
| | | // // 直接使用闭包函数来进行排序: |
| | | // agentInsList.Sort((left, right) => |
| | | // { |
| | | // if (left.distanceToDest > right.distanceToDest) |
| | | // { |
| | | // return 1; |
| | | // } |
| | | // else if (left.distanceToDest == right.distanceToDest) |
| | | // { |
| | | // return 0; |
| | | // } |
| | | // else |
| | | // { |
| | | // return -1; |
| | | // } |
| | | // }); |
| | | |
| | | // if (_noPoison) |
| | | // { |
| | | // for (int ti = 0; ti < agentInsList.Count; ti++) |
| | | // { |
| | | // if (!agentInsList[ti].bInPoison) |
| | | // return agentInsList[ti]; |
| | | // } |
| | | |
| | | // return null; |
| | | // } |
| | | // else |
| | | // return agentInsList[0]; |
| | | // } |
| | | |
| | | public Agent GetMinDistanceAgent() |
| | | { |
| | | if (agentInsList.Count == 0) return null; |
| | | Agent ret = null; |
| | | float minDistance = -1f; |
| | | |
| | | // 排序,然后返回对应的数据 |
| | | // 直接使用闭包函数来进行排序: |
| | | agentInsList.Sort((left, right) => |
| | | WaveLineAgentInsMgr[] waveLineAgentIns = AgentInsManager.instance.GetWaveLineList(); |
| | | WaveLineAgentInsMgr waveLineAgentInsMgr = waveLineAgentIns[waveLineID]; |
| | | List<Agent> agents = waveLineAgentInsMgr.listAgent; |
| | | Vector3 endPos = EndlessLevelManager.instance.GetHomeBasePosition(waveLineID + 1); |
| | | |
| | | for (int i = 0; i < agents.Count; ++i) |
| | | { |
| | | if (left.distanceToDest > right.distanceToDest) |
| | | { |
| | | return 1; |
| | | } |
| | | else if (left.distanceToDest == right.distanceToDest) |
| | | { |
| | | return 0; |
| | | } |
| | | else |
| | | { |
| | | return -1; |
| | | } |
| | | }); |
| | | float distance = Mathf.Abs(agents[i].transform.position.z - endPos.z); |
| | | |
| | | if (_noPoison) |
| | | { |
| | | for (int ti = 0; ti < agentInsList.Count; ti++) |
| | | if (minDistance < 0 || distance < minDistance) |
| | | { |
| | | if (!agentInsList[ti].bInPoison) |
| | | return agentInsList[ti]; |
| | | minDistance = distance; |
| | | ret = agents[i]; |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | else |
| | | return agentInsList[0]; |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | } |
| | |
| | | /// 用于排序的Buf. |
| | | /// </summary> |
| | | protected Agent[] agentTmpArr = new Agent[3]; |
| | | int deathCount = 0;//被火技能杀死的怪物 |
| | | |
| | | |
| | | |
| | |
| | | |
| | | Agent ag; |
| | | if (oppo) |
| | | ag = oppoAgentWaveLineArray[lineid].getMinDisAgent(noPoison); |
| | | // ag = oppoAgentWaveLineArray[lineid].getMinDisAgent(noPoison); |
| | | ag = oppoAgentWaveLineArray[lineid].GetMinDistanceAgent(); |
| | | else |
| | | ag = agentWaveLineArray[lineid].getMinDisAgent(noPoison); |
| | | // ag = agentWaveLineArray[lineid].getMinDisAgent(noPoison); |
| | | ag = agentWaveLineArray[lineid].GetMinDistanceAgent(); |
| | | |
| | | // 这一行防止无限的循环下去。 |
| | | if (forceGet) return ag; |
| | |
| | | return; |
| | | } |
| | | |
| | | |
| | | |
| | | protected void releaseAllCenterAgent() |
| | | { |
| | | int cnt = this.agentInsList.Count; |
| | | for (int ti = cnt - 1; ti >= 0; ti--) |
| | | { |
| | | if (agentInsList[ti].bBoss) |
| | | continue; |
| | | agentInsList[ti].Remove(); |
| | | } |
| | | |
| | | cnt = this.oppoAgentInsList.Count; |
| | | for (int ti = cnt - 1; ti >= 0; ti--) |
| | | { |
| | | if (oppoAgentInsList[ti].bBoss) |
| | | continue; |
| | | oppoAgentInsList[ti].Remove(); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取WaveManager相关的中心点 |
| | | /// </summary> |
| | |
| | | Vector3 cpos = Vector3.zero; |
| | | return cpos; |
| | | } |
| | | |
| | | |
| | | protected void updateOpponentAgent() |
| | | { |
| | |
| | | for (int idx = 0; idx < mgr.listAgent.Count; idx++) |
| | | { |
| | | Agent eag = mgr.listAgent[idx]; |
| | | Vector3 fpos = eag.transform.position; |
| | | fpos.y = 0; |
| | | float dist = Vector3.Distance(fpos, pos); |
| | | |
| | | if (radius < dist) |
| | | continue; |
| | | |
| | | bool isDeath = eag.isDead; |
| | | |
| | | if (eag.AgentType == SpawnAgentType.BubbleBomb) |
| | |
| | | } |
| | | else |
| | | { |
| | | Vector3 fpos = eag.transform.position; |
| | | fpos.y = 0; |
| | | float dist = Vector3.Distance(fpos, pos); |
| | | if (radius < dist) |
| | | continue; |
| | | |
| | | float damage = slinfo.skilleffect[2]; |
| | | damage += (slinfo.skilleffect[1] / 100.0f * eag.configuration.maxHealth); |
| | | damage = (float)Math.Floor(damage); |
| | |
| | | eag.TakeDamage(damage, fpos, null); |
| | | if (!eag.opponentAgent) |
| | | { |
| | | if (GameUI.instanceExists) |
| | | GameUI.instance.generateBloodText(fpos, damage, false, false); |
| | | else if (EndlessGameUI.instanceExists) |
| | | EndlessGameUI.instance.generateBloodText(fpos, damage, false, false); |
| | | // if (GameUI.instanceExists) |
| | | // GameUI.instance.generateBloodText(fpos, damage); |
| | | // else if (EndlessGameUI.instanceExists) |
| | | // EndlessGameUI.instance.generateBloodText(fpos, damage); |
| | | } |
| | | |
| | | if (!isDeath && eag.isDead) |
| | |
| | | eag.TakeDamage(damage, fpos, null); |
| | | if (!eag.opponentAgent) |
| | | { |
| | | if (GameUI.instanceExists) |
| | | GameUI.instance.generateBloodText(fpos, damage, false, false); |
| | | else if (EndlessGameUI.instanceExists) |
| | | EndlessGameUI.instance.generateBloodText(fpos, damage, false, false); |
| | | // if (GameUI.instanceExists) |
| | | // GameUI.instance.generateBloodText(fpos, damage); |
| | | // else if (EndlessGameUI.instanceExists) |
| | | // EndlessGameUI.instance.generateBloodText(fpos, damage); |
| | | } |
| | | |
| | | eag.PlayFireSkillHit(); |
| | |
| | | EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessOneTimeKillCount, deathCount); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 处理战场上的兵线伤害,以兵线为单位对怪物进行伤害---所有兵线 |
| | | /// </summary> |
| | | /// <param name="waveline"></param> |
| | | /// <param name="sid"></param> |
| | | /// <param name="slevel"></param> |
| | | /// <param name="opponent"></param> |
| | | public void ExecAllWavelineAttack(int sid, int slevel, bool opponent) |
| | | { |
| | | skilllevelinfo slinfo = JsonDataCenter.GetSkillLevelInfo(sid, slevel + 1); |
| | | if (slinfo == null) return; |
| | | |
| | | WaveLineAgentInsMgr wavelineIns; |
| | | if (opponent) |
| | | { |
| | | for (int i = 0; i < oppoAgentWaveLineArray.Length; i++) |
| | | { |
| | | wavelineIns = oppoAgentWaveLineArray[i]; |
| | | CalculateWavelineAttack(slinfo, wavelineIns, sid, slevel); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | deathCount = 0; |
| | | for (int i = 0; i < agentWaveLineArray.Length; i++) |
| | | { |
| | | wavelineIns = agentWaveLineArray[i]; |
| | | CalculateWavelineAttack(slinfo, wavelineIns, sid, slevel); |
| | | } |
| | | |
| | | if (deathCount >= 10) |
| | | EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessOneTimeKillCount, deathCount); |
| | | } |
| | | |
| | | } |
| | | |
| | | private void CalculateWavelineAttack(skilllevelinfo slinfo, WaveLineAgentInsMgr wavelineIns, int sid, int slevel) |
| | | { |
| | | if (wavelineIns == null) return; |
| | | |
| | | List<Agent> listAg = wavelineIns.listAgent; |
| | | // 统计被火技能直接烧死的数量 |
| | | |
| | | for (int ti = listAg.Count - 1; ti >= 0; ti--) |
| | | { |
| | | Agent eag = listAg[ti]; |
| | | |
| | | if (eag.isDead) continue; |
| | | |
| | | if (eag.AgentType == SpawnAgentType.BubbleBomb) |
| | | { |
| | | EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessFireSkillKillBubbleBomb, (eag as BubbleBombAgent).Id); |
| | | // 泡泡炸弹是直接就被火技能秒杀的 |
| | | ++deathCount; |
| | | } |
| | | else |
| | | { |
| | | Vector3 fpos = eag.transform.position; |
| | | float damage = slinfo.skilleffect[2]; |
| | | damage += (slinfo.skilleffect[1] / 100.0f * eag.configuration.maxHealth); |
| | | damage = (float)Math.Floor(damage); |
| | | |
| | | eag.TakeDamage(damage, fpos, null); |
| | | if (!eag.opponentAgent) |
| | | { |
| | | // if (GameUI.instanceExists) |
| | | // GameUI.instance.generateBloodText(fpos, damage); |
| | | // else if (EndlessGameUI.instanceExists) |
| | | // EndlessGameUI.instance.generateBloodText(fpos, damage); |
| | | } |
| | | |
| | | eag.PlayFireSkillHit(); |
| | | |
| | | if (eag.isDead) |
| | | ++deathCount; |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 每一帧更新,更新之后获取几个刚性数据: |
| | | /// 1:血量最多的AgentInstance. |
| | | /// 2:最前面的AgentInstance. |
| | | /// 3: |
| | | /// </summary> |
| | | void Update() |
| | | { |
| | | this.updateAgent(); |
| | | this.updateOpponentAgent(); |
| | | UpdateWoodAim(); |
| | | } |
| | | |
| | | // 测试重设最前面的Agent到初始化位置: |
| | | if (Input.GetKeyDown(KeyCode.A)) |
| | | /// <summary> |
| | | /// 更新木属性精灵瞄准 |
| | | /// </summary> |
| | | private void UpdateWoodAim() |
| | | { |
| | | if (!EndlessLevelManager.instanceExists) return; |
| | | |
| | | WaveLineAgentInsMgr[] mgrs = GetWaveLineList(); |
| | | |
| | | for (int i = 0; i < 5; ++i) |
| | | { |
| | | // 测试数据,重设Agent到开始位置 |
| | | if (agentInsList.Count >= 2) |
| | | List<Agent> agents = mgrs[i].listAgent; |
| | | // 是否发现有正在蓄力的木属性精灵 |
| | | bool findCharge = false; |
| | | Tower tower = null; |
| | | |
| | | if (agents.Count == 0) continue; |
| | | |
| | | for (int j = 2; j <= 3; ++j) |
| | | { |
| | | /* var posResetEff = MinDisAgent.GetComponent<AgentResetPosEffect>(); |
| | | if (posResetEff == null) |
| | | { |
| | | posResetEff = MinDisAgent.gameObject.AddComponent<AgentResetPosEffect>(); |
| | | } |
| | | posResetEff.Initialize(4, posResetFx );*/ |
| | | var lightBolt = agentInsList[1].GetComponent<LightBoltEffect>(); |
| | | if (lightBolt == null) |
| | | tower = EndlessGameUI.instance.FindTowerWithGridIdx(i, j); |
| | | |
| | | if (!tower || !tower.gameObject.activeInHierarchy || tower.ElfId != 301) continue; |
| | | |
| | | if (tower.IsWoodCharge) |
| | | { |
| | | lightBolt = agentInsList[1].gameObject.AddComponent<LightBoltEffect>(); |
| | | findCharge = true; |
| | | break; |
| | | } |
| | | lightBolt.Initialize(2, lightBoltFx, lightHitFx, agentInsList[1], agentInsList[0]); |
| | | } |
| | | |
| | | if (!findCharge) |
| | | { |
| | | for (int j = 0; j < agents.Count; ++j) |
| | | { |
| | | agents[j].StopWoodAimEffect(); |
| | | } |
| | | } |
| | | } |
| | | /* |
| | | // TEST CODE TO DELETE: |
| | | if( Input.GetKeyDown( KeyCode.S )) |
| | | { |
| | | this.moveAllAgentToCenter(); |
| | | } |
| | | if( Input.GetKeyDown( KeyCode.D)) |
| | | { |
| | | Targetter.bSearchTarget = !Targetter.bSearchTarget; |
| | | }*/ |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | { |
| | | Agent eag = listAg[ti]; |
| | | if (eag == ag) continue; |
| | | |
| | | Vector3 fpos = eag.transform.position; |
| | | tpos.y = 0; |
| | | fpos.y = 0; |
| | | if (Vector3.Distance(tpos, fpos) < 8) |
| | | if (Vector3.Distance(tpos, fpos) > 12) continue; |
| | | |
| | | if (eag.AgentType == SpawnAgentType.BubbleBomb) |
| | | { |
| | | EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBossSkillBubbleBombGetHit, (eag as BubbleBombAgent).Id); |
| | | } |
| | | else |
| | | { |
| | | eag.TakeDamage(damage, fpos, null); |
| | | if (!eag.opponentAgent) |
| | | { |
| | | if (GameUI.instanceExists) |
| | | GameUI.instance.generateBloodText(fpos, damage, false, false); |
| | | else if (EndlessGameUI.instanceExists) |
| | | EndlessGameUI.instance.generateBloodText(fpos, damage, false, false); |
| | | // if (GameUI.instanceExists) |
| | | // GameUI.instance.generateBloodText(fpos, damage); |
| | | // else if (EndlessGameUI.instanceExists) |
| | | // EndlessGameUI.instance.generateBloodText(fpos, damage); |
| | | } |
| | | if (eag.isDead) |
| | | ++deathCount; |
| | |
| | | // 每一个被链式攻击的怪物,飘血. |
| | | foreach (Agent ag in listBlood) |
| | | { |
| | | if (ag.AgentType != SpawnAgentType.Normal) continue; |
| | | int tid = ag.liveID; |
| | | Damager damager = ag.GetComponent<Damager>(); |
| | | ag.TakeDamage(chainAttackHurt, ag.position, alignment); |
| | | // 处理飘字效果: |
| | | if ((ag.liveID == tid) && (!ag.opponentAgent)) |
| | | { |
| | | if (GameUI.instanceExists) |
| | | GameUI.instance.generateBloodText(ag.position, chainAttackHurt, false, false); |
| | | else if (EndlessGameUI.instanceExists) |
| | | EndlessGameUI.instance.generateBloodText(ag.position, chainAttackHurt, false, false); |
| | | } |
| | | // if ((ag.liveID == tid) && (!ag.opponentAgent)) |
| | | // { |
| | | // if (GameUI.instanceExists) |
| | | // GameUI.instance.generateBloodText(ag.position, chainAttackHurt); |
| | | // else if (EndlessGameUI.instanceExists) |
| | | // EndlessGameUI.instance.generateBloodText(ag.position, chainAttackHurt); |
| | | // } |
| | | } |
| | | listBlood.Clear(); |
| | | |