Unity 扇形区域检测物品

Unity检测一定范围内的物品,显示物品图标是游戏的常见功能了,一般有三种方法,第一种是通过触发器去检测常见用:

Physics.OverlapSphere(target.position, searchRadius, 1 << LayerMask.NameToLayer(layMaskName));相交球。

参数1,是相交球的原点位置,第二个是球的半径,第三个参数是可选参数可以是不同层级的物品。它返回一个Collider[]数组

然后从近到远排序的,所以通过索引直接可以得到最近的可见物品。

第二种是通过射线检测的方式有通过Physics.Raycast()函数检测是否有相关的 CompareTag标签。

第三种就是我今天要说的重点了,通过扇形区域去检测,没有用到触发器纯粹的去比较是否在扇形区域里。


        Vector3 newPos = target.transform.forward * 10f;
        float distance = Vector3.Distance(target.transform.position, newPos);


        Quaternion right = target.transform.rotation * Quaternion.AngleAxis(30, Vector3.up);
        Quaternion left = target.transform.rotation * Quaternion.AngleAxis(30, Vector3.down);


        Vector3 n = target.transform.position + (Vector3.forward * distance);
        Vector3 leftPoint = left * n;
        Vector3 rightPoint = right * n;


        Debug.DrawLine(target.transform.position, leftPoint, Color.red);

        Debug.DrawLine(target.transform.position, rightPoint, Color.red);

先画一个扇形区域,然后直接通过比较物品是否在区域之中

  //检测扇形范围区域

float minDistance ;

float minAngle;

    private bool CheackScope(float _distance, Vector3 _avatarPos, Vector3 _enemyPos)
    {
        Vector3 srcVect = _enemyPos - _avatarPos;
        Vector3 fowardPos = target.transform.forward * 1 + _avatarPos;
        Vector3 fowardVect = fowardPos - _avatarPos;
        fowardVect.y = 0;
        float angle = Vector3.Angle(srcVect, fowardVect);
        if (_distance < minDistance && angle < minAngle / 2)
        {
            Debug.Log("进入了检测范围");
            return true;
        }
        return false;

    }

有很多中点是否在区域里面检测方法。这里有两种方法参考:http://www.xuanyusong.com/archives/1977和通过差乘来判断http://gad.qq.com/article/detail/25312

猜你喜欢

转载自blog.csdn.net/martins1994/article/details/80988814