WXMC/.svn/pristine/5b/5b0b30fab0f781a927a923aae78686e4d2da35ae.svn-base

171 lines
5.2 KiB
Plaintext
Raw Normal View History

2024-12-04 16:18:46 +08:00
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PHomeFirer_Common : PHomeFirer
{
[SerializeField]
private float m_radius;
[SerializeField]
protected ShootType m_shootType;
public override bool CanFire()
{
if (NeedTargetUnit(m_shootType))
{
var targets = GetTargetUnits();
if (targets.Any())
{
//units = new List<PHomeUnit>(targets);
return true;
}
return false;
}
return true;
}
public override IEnumerator Fire(int count)
{
List<PHomeUnit> targets = null;
float interval = 1 / m_shootRate;
for (int j = 0; j < count; j++)
{
switch (m_shootType)
{
case ShootType.NearestTarget:
{
targets = new List<PHomeUnit>(GetTargetUnits());
if (targets.Count == 0)
{
yield break;
}
PHomeUnit target;
if (targets.Count == 1)
{
target = targets[0];
}
else
{
target = targets.Aggregate((a, b) =>
{
float distA = Vector2.Distance(a.transform.position, transform.position);
float distB = Vector2.Distance(b.transform.position, transform.position);
return distA < distB ? a : b;
});
}
if (target == null)
{
break;
}
ShootData shootData = GetShootData();
shootData.SetTargetUnitWithPos(target);
ShootProjectiles(shootData);
}
break;
case ShootType.NearbyRandomPoint:
{
Vector2 dest = AreaUtils.GetRandomPoint(transform.position, m_radius);
ShootData shootData = GetShootData();
shootData.EndPoint = dest;
ShootProjectiles(shootData);
}
break;
case ShootType.NearbyRandomTarget:
{
targets = new List<PHomeUnit>(GetTargetUnits());
if (targets.Count == 0)
{
yield break;
}
var target = targets[UnityEngine.Random.Range(0, targets.Count)];
ShootData shootData = GetShootData();
shootData.SetTargetUnitWithPos(target);
ShootProjectiles(shootData);
}
break;
case ShootType.NearbyAllTarget:
break;
case ShootType.ScreenRandomPoint:
{
Vector2 dest = PHomeGameMode.main.PlayerUnit.PlayerScreen.GetRandomPoint();
ShootData shootData = GetShootData();
shootData.EndPoint = dest;
ShootProjectiles(shootData);
}
break;
case ShootType.UnitPos:
break;
case ShootType.None:
break;
default:
break;
}
yield return new WaitForSeconds(interval);
}
}
private bool NeedTargetUnit(ShootType type)
{
switch (type)
{
case ShootType.NearestTarget:
case ShootType.NearbyRandomTarget:
case ShootType.NearbyAllTarget:
return true;
case ShootType.NearbyRandomPoint:
case ShootType.ScreenRandomPoint:
case ShootType.UnitPos:
case ShootType.None:
return false;
default:
return default;
}
}
private IEnumerable<PHomeUnit> GetTargetUnits()
{
var units = AreaUtils.FindUnits(transform.position, m_radius);
return units.Where(unit => PHomeGameMode.IsEnemy(Unit, unit));
}
#region Debug
private void OnDrawGizmosSelected()
{
switch (m_shootType)
{
case ShootType.NearestTarget:
Gizmos.color = Color.red;
GizmosUtils.DrawCircle(transform.position, m_radius);
break;
case ShootType.NearbyRandomPoint:
break;
case ShootType.NearbyRandomTarget:
break;
case ShootType.NearbyAllTarget:
break;
case ShootType.ScreenRandomPoint:
break;
case ShootType.UnitPos:
break;
case ShootType.None:
break;
default:
break;
}
}
#endregion
}