矩形和扇形攻击

2019-04-14  本文已影响0人  醉酒青牛_fa4e

/// <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;
}
上一篇下一篇

猜你喜欢

热点阅读