using ActionGameFramework.Health; using Core.Health; using Core.Utilities; using DG.Tweening; using KTGMGemClient; using System; using System.Collections.Generic; using TowerDefense.Agents; using TowerDefense.Targetting; using TowerDefense.UI.HUD; using UnityEngine; using UnityEngine.AI; using TowerDefense.Level; using TowerDefense.Towers; /// /// 基于兵线的Agent Instance管理器 /// public class WaveLineAgentInsMgr { /// /// 当前WaveID对应到的所有Agent实例 /// protected List agentInsList; protected Vector3 targetPosition; /// /// 对应的WaveLineID. /// public int waveLineID { get; set; } public WaveLineAgentInsMgr(int waveID) { waveLineID = waveID; agentInsList = new List(); } /// /// 添加一个AgentIns. /// /// public void addAgentIns(Agent ag) { agentInsList.Add(ag); } /// /// 删除一个AgentIns. /// /// public void delAgentIns(Agent ag) { agentInsList.Remove(ag); } /// /// 当前列对应的怪物数目 /// /// public int getAgentInsNum() { int ret = 0; for (int i = 0; i < agentInsList.Count; ++i) { if (agentInsList[i].AgentType == SpawnAgentType.Normal) ++ret; } return ret; } /// /// 获取当前管理对应的listAgent. /// public List listAgent { get { return this.agentInsList; } } // /// // /// 获取距目标结点最近的Agent. // /// // /// // 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() { Agent ret = null; float minDistance = -1f; WaveLineAgentInsMgr[] waveLineAgentIns = AgentInsManager.instance.GetWaveLineList(); WaveLineAgentInsMgr waveLineAgentInsMgr = waveLineAgentIns[waveLineID]; List agents = waveLineAgentInsMgr.listAgent; Vector3 endPos = EndlessLevelManager.instance.GetHomeBasePosition(waveLineID + 1); for (int i = 0; i < agents.Count; ++i) { float distance = Mathf.Abs(agents[i].transform.position.z - endPos.z); if (minDistance < 0 || distance < minDistance) { minDistance = distance; ret = agents[i]; } } return ret; } } /// /// Wave刷新出来的每一个AgentInstance加进来,统一管理。Targetter不再管理每一个细节。 /// 每一个关卡统一管理在场景内出现的AgentInstance. /// public class AgentInsManager : Singleton { protected readonly int MAX_ATTCNT = 5; public static bool bBossCreateState = false; /// /// Agent位置重设的特效. /// public GameObject posResetFx; /// /// Agent之间的电弧特效,两个Agent之间发生 /// public GameObject lightBoltFx; /// /// 被电弧击中的效果. /// public GameObject lightHitFx; /// /// 所有Agent往中间移动的时候,播放的粒子特效 /// public ParticleSystem centMovEffect; /// /// 战场上所有存活的Agent的列表,遍历这个列表,提取出所有的数据 /// protected List agentInsList; protected Agent agentMinDis = null; protected List agentInRange = null; /// /// 存储Agent已方的最高血量数据 /// protected List agentListMaxHp = null; protected Agent agentMaxHp = null; /// /// 对手方要处理的Agent列表 /// protected List oppoAgentInsList; protected Agent oppoAgentMinDis = null; protected List oppoAgentInRange = null; /// /// 存储Agent最高血量数据. /// protected List oppoAgentListMaxHp = null; protected Agent oppoAgentMaxHp = null; /// /// 随机种子. /// protected System.Random mRand; /// /// 正方兵线Agent管理数组 /// protected WaveLineAgentInsMgr[] agentWaveLineArray; /// /// 反方兵线Agent管理数组 /// protected WaveLineAgentInsMgr[] oppoAgentWaveLineArray; /// /// 用于排序的Buf. /// protected Agent[] agentTmpArr = new Agent[3]; int deathCount = 0;//被火技能杀死的怪物 // Start is called before the first frame update void Start() { agentInsList = new List(); agentInRange = new List(); agentListMaxHp = new List(); oppoAgentInsList = new List(); oppoAgentInRange = new List(); oppoAgentListMaxHp = new List(); agentWaveLineArray = new WaveLineAgentInsMgr[5]; for (int ti = 0; ti < agentWaveLineArray.Length; ti++) agentWaveLineArray[ti] = new WaveLineAgentInsMgr(ti); oppoAgentWaveLineArray = new WaveLineAgentInsMgr[5]; for (int ti = 0; ti < oppoAgentWaveLineArray.Length; ti++) oppoAgentWaveLineArray[ti] = new WaveLineAgentInsMgr(ti); mRand = new System.Random(); } public WaveLineAgentInsMgr[] getOppoWaveLineList() { return this.oppoAgentWaveLineArray; } public WaveLineAgentInsMgr[] GetWaveLineList() { return agentWaveLineArray; } /// /// 设置某条兵线的所有小兵的移动状态 /// /// 兵线id 1~5, 如果是-1则设置所有兵线的状态 /// 是否可以移动 /// 是否是敌方 public void SetWaveLineCanMove(int waveLineId, bool canMove, bool isOppo) { WaveLineAgentInsMgr[] waveLineAgents = isOppo ? getOppoWaveLineList() : GetWaveLineList(); for (int i = 0; i < waveLineAgents.Length; ++i) { if (i == waveLineId - 1 || waveLineId == -1) { List list = waveLineAgents[i].listAgent; for (int j = 0; j < list.Count; ++j) { list[j].CanMove = canMove; } } } } /// /// 根据赛道获得该赛道的所有敌人 /// /// 赛道id (1~5) /// 是否是对手的赛道 /// public List GetAgentsByTunel(int tunel, bool isOppo = false) { WaveLineAgentInsMgr[] waveLineAgents = isOppo ? getOppoWaveLineList() : GetWaveLineList(); List ret = new List(); for (int i = 0; i < waveLineAgents.Length; ++i) { if (i == tunel - 1) { for (int j = 0; j < waveLineAgents[i].listAgent.Count; ++j) { if (waveLineAgents[i].listAgent[j].AgentType == SpawnAgentType.Normal) ret.Add(waveLineAgents[i].listAgent[j]); } return ret; } } return null; } public List agentList { get { return this.agentInsList; } } public List oppoAgentList { get { return this.oppoAgentInsList; } } /// /// 获取距离最短的Agent. /// public Agent MinDisAgent { get { return this.agentMinDis; } } /// /// 获取距离最近的Agents /// /// /// public Agent GetMinDisAgent(int lineid, bool oppo, bool forceGet = false, bool noPoison = false) { if (lineid >= agentWaveLineArray.Length) return null; if (lineid < 0) return null; Agent ag; if (oppo) // ag = oppoAgentWaveLineArray[lineid].getMinDisAgent(noPoison); ag = oppoAgentWaveLineArray[lineid].GetMinDistanceAgent(); else // ag = agentWaveLineArray[lineid].getMinDisAgent(noPoison); ag = agentWaveLineArray[lineid].GetMinDistanceAgent(); // 这一行防止无限的循环下去。 if (forceGet) return ag; agentTmpArr[0] = ag; if (!EndlessLevelManager.instanceExists) { Agent agLeft = GetMinDisAgent(lineid - 1, oppo, true, noPoison); Agent agRight = GetMinDisAgent(lineid + 1, oppo, true, noPoison); agentTmpArr[1] = agLeft; agentTmpArr[2] = agRight; } else { agentTmpArr[1] = null; agentTmpArr[2] = null; } float minDis = 100000000f; int idx = -1; for (int ti = 0; ti < agentTmpArr.Length; ti++) { if ((agentTmpArr[ti] != null) && (agentTmpArr[ti].distanceToDest < minDis)) { idx = ti; minDis = agentTmpArr[ti].distanceToDest; } } // // 返回最近的Agent数据指针. if (idx < 0) { // 如果是查找无中毒状态的Agent,再查一次: if (noPoison) return GetMinDisAgent(lineid, oppo, forceGet); return null; } else return agentTmpArr[idx]; } public List AgentInRange { get { return this.agentInRange; } } public Agent oppoMinDisAgent { get { return this.oppoAgentMinDis; } } /// /// 获取血量最大的数据 /// /// /// public Agent getMaxHpAgent(bool opponent) { if (opponent) return this.oppoAgentMaxHp; else return this.agentMaxHp; } public List getAgentListMaxHp(bool opponent) { if (opponent) return oppoAgentListMaxHp; else return agentListMaxHp; } /// /// 获取随机的AgentList. /// /// /// public List getAgentListRandom(bool opponent) { List tlist; List resList = new List(); if (opponent) tlist = oppoAgentInsList; else tlist = agentInsList; int maxCnt = MAX_ATTCNT; if (tlist.Count < maxCnt) maxCnt = tlist.Count; for (int ti = 0; ti < maxCnt; ti++) { int idx = mRand.Next(0, tlist.Count); if (tlist[idx].opponentAgent != opponent) continue; resList.Add(tlist[idx]); } return resList; } /// /// 返回一个随机的Agent. /// /// /// public Agent getRandomAgent(bool opponent) { List tlist; if (opponent) tlist = oppoAgentInsList; else tlist = agentInsList; if (tlist.Count == 0) return null; int idx = mRand.Next(0, tlist.Count); return tlist[idx]; } public List OppoAgentInRange { get { return this.oppoAgentInRange; } } protected void updateAgent() { this.agentInRange.Clear(); this.agentListMaxHp.Clear(); this.agentMinDis = null; this.agentMaxHp = null; if (agentInsList.Count == 0) return; // 用闭包函数先对血量进行排序. agentInsList.Sort((left, right) => { if (left.healthVal < right.healthVal) return 1; else if (left.healthVal == right.healthVal) return 0; else return -1; }); agentMaxHp = agentInsList[0]; int maxCnt = MAX_ATTCNT; if (agentInsList.Count < maxCnt) maxCnt = agentInsList.Count; for (int ti = 0; ti < maxCnt; ti++) { if (agentInsList[ti].opponentAgent) continue; this.agentListMaxHp.Add(agentInsList[ti]); } // 直接使用闭包函数来进行排序: agentInsList.Sort((left, right) => { if (left.distanceToDest > right.distanceToDest) { return 1; } else if (left.distanceToDest == right.distanceToDest) { return 0; } else { return -1; } }); agentMinDis = agentInsList[0]; //maxCnt = MAX_ATTCNT; //if (agentInsList.Count < maxCnt) // maxCnt = agentInsList.Count; for (int ti = 0; ti < maxCnt; ti++) { if (agentInsList[ti].opponentAgent) continue; this.agentInRange.Add(agentInsList[ti]); } return; } /// /// 场景内所有的Agent移动到中心坐标。 /// public void moveAllAgentToCenter() { float moveTime = 0.9f; Targetter.bSearchTarget = false; bBossCreateState = true; int cnt = this.agentInsList.Count; Vector3 cpos = this.GetCenterPos(false); for (int ti = 0; ti < cnt; ti++) { agentInsList[ti].SetNode(null, -1); NavMeshAgent ag = agentInsList[ti].navMeshAgent; ag.transform.DOMoveX(cpos.x, moveTime); ag.transform.DOMoveZ(cpos.z, moveTime); } // 播放特效 ParticleSystem tpar = Instantiate(centMovEffect); tpar.transform.position = cpos; tpar.Simulate(0.0f); tpar.Play(); cnt = this.oppoAgentInsList.Count; cpos = this.GetCenterPos(true); for (int ti = 0; ti < cnt; ti++) { oppoAgentInsList[ti].SetNode(null, -1); NavMeshAgent ag = oppoAgentInsList[ti].navMeshAgent; ag.transform.DOMoveX(cpos.x, moveTime); ag.transform.DOMoveZ(cpos.z, moveTime); } // 播放特效: tpar = Instantiate(centMovEffect); tpar.transform.position = cpos; tpar.Simulate(0.0f); tpar.Play(); // // 1.25秒之后消失掉所有的小怪: Invoke("releaseAllCenterAgent", moveTime + 0.1f); } public void restartLevel() { bBossCreateState = false; return; } /// /// 获取WaveManager相关的中心点 /// /// public Vector3 GetCenterPos(bool oppo) { Vector3 cpos = Vector3.zero; return cpos; } protected void updateOpponentAgent() { this.oppoAgentInRange.Clear(); this.oppoAgentListMaxHp.Clear(); this.oppoAgentMinDis = null; this.oppoAgentMaxHp = null; if ((oppoAgentInsList.Count == 0)) return; // 根据血量进行排序: oppoAgentInsList.Sort((left, right) => { if (left.healthVal < right.healthVal) return 1; else if (left.healthVal == right.healthVal) return 0; else return -1; }); this.oppoAgentMaxHp = oppoAgentInsList[0]; int maxCnt = MAX_ATTCNT; if (oppoAgentInsList.Count < MAX_ATTCNT) maxCnt = oppoAgentInsList.Count; for (int ti = 0; ti < maxCnt; ti++) { if (!oppoAgentInsList[ti].opponentAgent) continue; oppoAgentListMaxHp.Add(oppoAgentInsList[ti]); } // 离目标的距离进行排序: oppoAgentInsList.Sort((left, right) => { if (left.distanceToDest > right.distanceToDest) { return 1; } else if (left.distanceToDest == right.distanceToDest) { return 0; } else { return -1; } }); oppoAgentMinDis = oppoAgentInsList[0]; for (int ti = 0; ti < maxCnt; ti++) { if (!oppoAgentInsList[ti].opponentAgent) continue; oppoAgentInRange.Add(oppoAgentInsList[ti]); } } /// /// 再次更新opponentManager /// /// public void updateInsMgrPos(bool opponent) { if (opponent) this.updateOpponentAgent(); else this.updateAgent(); } /// /// 处理战场上的Bomb伤害.以Bomb中心的为单位对战场上的怪物进行伤害。 /// /// /// /// /// public void ExecBombAttack(Vector3 pos, int sid, int slevel, bool opponent) { skilllevelinfo slinfo = JsonDataCenter.GetSkillLevelInfo(sid, slevel + 1); if (slinfo == null) return; WaveLineAgentInsMgr[] mgrList; if (opponent) mgrList = oppoAgentWaveLineArray; else mgrList = agentWaveLineArray; pos.y = 0; if (slinfo.atcmod.Count < 2) return; float radius = slinfo.atcmod[1]; int deathCount = 0; for (int ti = 0; ti < mgrList.Length; ti++) { WaveLineAgentInsMgr mgr = mgrList[ti]; 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) { buffinfo bufdata = JsonDataCenter.GetBuffFromId(3); if (bufdata != null) { if (bufdata.buff_func[0] == 3) EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBubbleBombBeDizzinessed, (eag as BubbleBombAgent).Id, bufdata.last); } } else { 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); } if (!isDeath && eag.isDead) ++deathCount; if (eag.isDead) continue; else eag.SetAgentBuffEffect(3); } } } if (deathCount > 1) EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessOneTimeKillCount, deathCount); return; } /// /// 处理战场上的兵线伤害,以兵线为单位对怪物进行伤害 /// /// /// /// /// public void ExecWavelineAttack(int waveline, int sid, int slevel, bool opponent) { skilllevelinfo slinfo = JsonDataCenter.GetSkillLevelInfo(sid, slevel + 1); if (slinfo == null) return; WaveLineAgentInsMgr wavelineIns; if (opponent) wavelineIns = oppoAgentWaveLineArray[waveline]; else wavelineIns = agentWaveLineArray[waveline]; if (wavelineIns == null) return; List listAg = wavelineIns.listAgent; // 统计被火技能直接烧死的数量 int deathCount = 0; 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; } } if (deathCount > 1) EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessOneTimeKillCount, deathCount); } /// /// 处理战场上的兵线伤害,以兵线为单位对怪物进行伤害---所有兵线 /// /// /// /// /// 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 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; } } } /// /// 每一帧更新,更新之后获取几个刚性数据: /// 1:血量最多的AgentInstance. /// 2:最前面的AgentInstance. /// void Update() { this.updateAgent(); this.updateOpponentAgent(); UpdateWoodAim(); } /// /// 更新木属性精灵瞄准 /// private void UpdateWoodAim() { if (!EndlessLevelManager.instanceExists) return; WaveLineAgentInsMgr[] mgrs = GetWaveLineList(); for (int i = 0; i < 5; ++i) { List agents = mgrs[i].listAgent; // 是否发现有正在蓄力的木属性精灵 bool findCharge = false; Tower tower = null; if (agents.Count == 0) continue; for (int j = 2; j <= 3; ++j) { tower = EndlessGameUI.instance.FindTowerWithGridIdx(i, j); if (!tower || !tower.gameObject.activeInHierarchy || tower.ElfId != 301) continue; if (tower.IsWoodCharge) { findCharge = true; break; } } if (!findCharge) { for (int j = 0; j < agents.Count; ++j) { agents[j].StopWoodAimEffect(); } } } } /// /// 对当前Agent同一列内一定区域内的怪物进行攻击: /// /// public int StartExplodeAttack(Agent ag, float damage) { WaveLineAgentInsMgr tmgr; if (!ag.opponentAgent) tmgr = this.agentWaveLineArray[ag.waveLineID]; else tmgr = this.oppoAgentWaveLineArray[ag.waveLineID]; if (tmgr.getAgentInsNum() <= 1) return 0; List listAg = tmgr.listAgent; Vector3 tpos = ag.transform.position; int deathCount = 0; for (int ti = listAg.Count - 1; ti >= 0; ti--) { Agent eag = listAg[ti]; if (eag == ag) continue; Vector3 fpos = eag.transform.position; tpos.y = 0; fpos.y = 0; 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); // else if (EndlessGameUI.instanceExists) // EndlessGameUI.instance.generateBloodText(fpos, damage); } if (eag.isDead) ++deathCount; } } return deathCount; /* foreach (Agent eag in listAg) { if (eag == ag) continue; Vector3 fpos = eag.transform.position; tpos.y = 0; fpos.y = 0; if (Vector3.Distance(tpos, fpos) < 8) { eag.TakeDamage(damage, fpos, null); GameUI.instance.generateBloodText(fpos, damage, false, false); } }*/ } /// /// 开启链式攻击. /// /// public void StartChainAttack(Agent chainStart, IAlignmentProvider alignment, float chainAttackHurt) { List opList = null; if (chainStart.opponentAgent) opList = oppoAgentInsList; else opList = agentInsList; int maxCnt = opList.Count; List listBlood = new List(); for (int ti = 0; ti < maxCnt - 1; ti++) { if (opList[ti] != chainStart) continue; int chainAttackNum = 0; for (int tj = ti + 1; tj < maxCnt; tj++) { var lightBolt = opList[tj].GetComponent(); if (lightBolt == null) { lightBolt = opList[tj].gameObject.AddComponent(); lightBolt.Initialize(2, lightBoltFx, lightHitFx, opList[tj], opList[tj - 1]); listBlood.Add(opList[tj]); } // 最多两个受到影响: chainAttackNum++; if (chainAttackNum >= 3) break; } } // TEST CODE: 最终应该是由服务器说了算的伤害. // 每一个被链式攻击的怪物,飘血. foreach (Agent ag in listBlood) { if (ag.AgentType != SpawnAgentType.Normal) continue; int tid = ag.liveID; Damager damager = ag.GetComponent(); ag.TakeDamage(chainAttackHurt, ag.position, alignment); // 处理飘字效果: // 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(); } protected void addWaveLineAgent(Agent ag) { if (ag.opponentAgent) oppoAgentWaveLineArray[ag.waveLineID].addAgentIns(ag); else agentWaveLineArray[ag.waveLineID].addAgentIns(ag); } protected void delWaveLineAgent(Agent ag) { if (ag.opponentAgent) oppoAgentWaveLineArray[ag.waveLineID].delAgentIns(ag); else agentWaveLineArray[ag.waveLineID].delAgentIns(ag); } /// /// 管理器增加Agent. /// /// public void addAgent(Agent ag) { addWaveLineAgent(ag); if (!ag.opponentAgent) { this.agentInsList.Add(ag); } else { this.oppoAgentInsList.Add(ag); } } /// /// 更新当前管理器内所有怪物的移动速度 /// /// public void ScaleAgentSpeed(float fscale) { for (int ti = 0; ti < agentInsList.Count; ti++) agentInsList[ti].SetMoveSpeedScale(fscale); for (int ti = 0; ti < oppoAgentInsList.Count; ti++) oppoAgentInsList[ti].SetMoveSpeedScale(fscale); } /// /// 管理器减少一个Agent,临时缓存队列也需要更新数据 /// /// public void removeAgent(Agent ag) { delWaveLineAgent(ag); if (!ag.opponentAgent) { this.agentInsList.Remove(ag); this.agentListMaxHp.Remove(ag); if (agentMaxHp == ag) agentMaxHp = null; } else { this.oppoAgentInsList.Remove(ag); this.oppoAgentListMaxHp.Remove(ag); if (oppoAgentMaxHp) oppoAgentMaxHp = null; } } /// /// 获取最前面的Agent. /// /// public Agent getMostFrontAgent() { return null; } /// /// 获取血量最多的Agent. /// /// public Agent getMostHealthAgent() { return null; } }