Featured image of post 矩形攻击与扇形攻击判断

矩形攻击与扇形攻击判断

 /// <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;
    }
Licensed under CC BY-NC-SA 4.0
0