/// <summary>
/// 矩形攻击
/// 判断npc是否在player的攻击距离内
/// </summary>
/// <param name="player">player</param>
/// <param name="npc">npc</param>
/// <param name="width">攻击区域的宽</param>
/// <param name="height">攻击区域的高</param>
/// <returns></returns>
public bool ReckAtc(Transform player,Transform npc,int width,int height)
{
Vector3 deltaVect = npc.position - player.position;
//点乘得到是否在前方,如果大于0,就是在前方。
//同时的到的也是npc位于player前方的相对位置。
float aDotForward = Vector3.Dot(deltaVect, player.forward);
//npc位于player前方的相对位置<height,代表在攻击距离内
if (aDotForward > 0&&aDotForward<height)
{
float aDotRight = Vector3.Dot(deltaVect, player.right);
if (Mathf.Abs(aDotRight) < width)
{
return true;
}
}
return false;
}
/// <summary>
/// 判断是否在三型区域伞形区域
/// </summary>
/// <param name="player"></param>
/// <param name="npc"></param>
/// <param name="angle">给定的角度,不能超过这个角度的一半</param>
/// <param name="radius">给定的伞形半径</param>
/// <returns></returns>
public bool UmbrellaAtc(Transform player,Transform npc,float angle,int radius)
{
//player指向npc的向量
Vector3 deltaVect = npc.position - player.position;
//拿到两个向量间的夹角
float tmpAngle = Vector3.Angle(deltaVect,player.forward);
//拿到a向量在forward的膜
float aDotForward = Vector3.Dot(deltaVect, player.forward);
//判断如果两个向量间的夹角小于给定角度的一般并且a向量的膜小于伞形的半径return true否则false
if (tmpAngle < (angle / 2) && aDotForward < radius)
{
return true;
}
return false;
}
网友评论