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