1. 程式人生 > >Unity 扇形區域檢測物品

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