using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class GroupManager : MonoBehaviour { public Action DelSoldierDie; public Action DelSoldierClear; public int SoldierCount => mSoldierCount; public int TotalDamage => mTotalDamage; protected Dictionary> mSoldierGroupDic; protected List mSoldierList; protected int mSoldierCount = 0; protected int mTotalDamage = 0; private void Awake() { mSoldierGroupDic = new Dictionary>(); mSoldierList = new List(); } public virtual void Init() { } public WarUnit GetNearestTarget(Vector3 pRefPos, float pLimit = -1) { WarUnit tNearestUnit = null; float tMinDisSqr = float.MaxValue; float tCurDisSqr = 0; Vector3 tTargetPos = Vector3.zero; for (int i = 0; i < mSoldierList.Count; i++) { if (!mSoldierList[i].IsDead) { tTargetPos = mSoldierList[i].RelativePos(pRefPos); tCurDisSqr = Mathf.Min(Mathf.Abs(tTargetPos.x - pRefPos.x), Mathf.Abs(tTargetPos.y - pRefPos.y)); if (pLimit > 0 && pLimit < tCurDisSqr ) continue; tCurDisSqr = (pRefPos - tTargetPos).sqrMagnitude; if (pLimit > 0 && (pLimit * pLimit) < tCurDisSqr) continue; if (tCurDisSqr < tMinDisSqr) { tMinDisSqr = tCurDisSqr; tNearestUnit = mSoldierList[i]; } } } return tNearestUnit; } public virtual void AddSoldier(SoldierUnit pUnit, GroupManager pAgainstGroup) { } protected void AddSoldier(SoldierUnit pUnit) { pUnit.DelDie = OnSoldierDie; pUnit.DelHurt = OnSoldierHurt; pUnit.DelSplash = OnSoldierSplash; if (!mSoldierGroupDic.ContainsKey(pUnit.GroupID)) { mSoldierGroupDic[pUnit.GroupID] = new List(); } if(!mSoldierGroupDic[pUnit.GroupID].Contains(pUnit)) { mSoldierGroupDic[pUnit.GroupID].Add(pUnit); } mSoldierList.Add(pUnit); mSoldierCount++; } protected virtual void HandleSoldierClear() { } private void OnSoldierDie(WarUnit pUnit) { if (mSoldierList.Contains(pUnit as SoldierUnit)) { mSoldierList.Remove(pUnit as SoldierUnit); } mSoldierCount--; DelSoldierDie?.Invoke(); if (mSoldierCount <= 0) { HandleSoldierClear(); DelSoldierClear?.Invoke(); } } private void OnSoldierSplash(WarUnit pUnit, int pOverflowDamage) { SoldierUnit tSoldier = pUnit as SoldierUnit; if (mSoldierGroupDic.ContainsKey(tSoldier.GroupID) && mSoldierGroupDic[tSoldier.GroupID] != null && mSoldierGroupDic[tSoldier.GroupID].Count > 1) { List tGroupList = mSoldierGroupDic[tSoldier.GroupID]; int tOverflowDamage = pOverflowDamage; for (int i = 0; i < tGroupList.Count; i++) { if (tOverflowDamage <= 0) break; if (tGroupList[i] == tSoldier || tGroupList[i].IsDead) continue; tOverflowDamage = tGroupList[i].Hurt(tOverflowDamage, false); } } } private void OnSoldierHurt(int pDamage) { mTotalDamage += pDamage; } public void ActiveAllSoldier() { foreach (SoldierUnit tUnit in mSoldierList) { if (tUnit.gameObject.activeSelf && !tUnit.IsDead) { tUnit.Active(); } } } public void Win() { foreach (SoldierUnit tUnit in mSoldierList) { if (tUnit.gameObject.activeSelf && !tUnit.IsDead) { tUnit.Win(); } } } public void Lose() { //foreach (SoldierUnit tUnit in mSoldierList) //{ // if (tUnit.gameObject.activeSelf && !tUnit.IsDead) // { // tUnit.Die(); // } //} } }