矩形攻击
扇形攻击
/// <summary>
/// 矩形攻击
/// </summary>
/// <param name="attacker">攻击者</param>
/// <param name="attacked">被攻击者</param>
/// <param name="forwardDistance">攻击范围的长</param>
/// <param name="rightDistance">攻击范围的宽的一半</param>
/// <returns></returns>
public bool RectAttackJudge(Transform attacker, Transform attacked, float forwardDistance, float rightDistance)
{
//向量A=被攻击者位置减去攻击者位置
Vector3 deltaA = attacked.position - attacker.position;
//投影A=攻击者的前向量 点乘 向量A
float forwardDotA = Vector3.Dot(attacker.forward, deltaA);
//如果投影小于零,则被攻击者在攻击前方,否则后方/如果投影小于等于攻击范围长,则在攻击范围内
if (forwardDotA > 0 && forwardDotA <= forwardDistance)
{
//如果(绝对值(攻击者的左向量 点乘 向量A))小于 攻击范围宽的一半
if (Mathf.Abs(Vector3.Dot(attacker.right, deltaA)) < rightDistance)
{
return true;
}
}
return false;
}
/// <summary>
/// 扇形攻击
/// </summary>
/// <param name="attacker">攻击者</param>
/// <param name="attacked">被攻击者</param>
/// <param name="angle">攻击角度</param>
/// <param name="radius">攻击半径</param>
/// <returns></returns>
public bool UmbrellaAttact(Transform attacker, Transform attacked, float angle, float radius)
{
//向量A=被攻击者位置减去攻击者位置
Vector3 deltaA = attacked.position - attacker.position;
//角度=反余弦值(点乘(向量A的归一化,攻击者前向量))乘以弧度到度的转化常量
float tmpAngle = Mathf.Acos(Vector3.Dot(deltaA.normalized, attacker.forward)) * Mathf.Rad2Deg;
//如果角度小于攻击角度的一半且向量A的长度小于攻击半径
if (tmpAngle < angle * 0.5f && deltaA.magnitude < radius)
{
return true;
}
return false;
}