mergemilitary/Assets/Scripts/Game/Wars/GroupManager/GroupManager.cs

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();
// }
//}
}
}