美文网首页
矩形和扇形攻击

矩形和扇形攻击

作者: 醉酒青牛_fa4e | 来源:发表于2019-04-14 13:43 被阅读0次

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

    相关文章

      网友评论

          本文标题:矩形和扇形攻击

          本文链接:https://www.haomeiwen.com/subject/dwxoiqtx.html