166 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			166 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | 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<int, List<SoldierUnit>> mSoldierGroupDic; | |||
|  |     protected List<SoldierUnit> mSoldierList; | |||
|  |     protected int mSoldierCount = 0; | |||
|  | 
 | |||
|  |     protected int mTotalDamage = 0; | |||
|  | 
 | |||
|  |     private void Awake() | |||
|  |     { | |||
|  |         mSoldierGroupDic = new Dictionary<int, List<SoldierUnit>>(); | |||
|  |         mSoldierList = new List<SoldierUnit>(); | |||
|  |     } | |||
|  | 
 | |||
|  |     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<SoldierUnit>(); | |||
|  |         } | |||
|  | 
 | |||
|  |         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<SoldierUnit> 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(); | |||
|  |         //    } | |||
|  |         //} | |||
|  |     } | |||
|  | } |