// Cast a sphere with the desired distance. Check each collider hit to see if it is within the field of view. Set objectFound // to the object that is most directly in front of the agent /// <summary> /// Withins the sight. /// </summary> /// <returns>The sight.</returns> /// <param name="transform">玩家</param> /// <param name="fieldOfViewAngle">可視角度</param> /// <param name="viewDistance">可視距離</param> /// <param name="objectLayerMask">物件層</param> public static Transform WithinSight(Transform transform, float fieldOfViewAngle, float viewDistance, LayerMask objectLayerMask)
{
Transform objectFound = null;
var hitColliders = Physics.OverlapSphere(transform.position, viewDistance, objectLayerMask);
if (hitColliders != null) {
float minAngle = Mathf.Infinity;
float angle = 0;
Debug.Log(hitColliders.Length);
for (int i = 0; i < hitColliders.Length; ++i) {
// The hit agent needs to be within the field of view of the current agent
angle = Vector3.Angle( hitColliders[i].transform.position - transform.position , transform.forward);
if (angle < fieldOfViewAngle) {
RaycastHit hit;
// The hit agent needs to be within view of the current agent
Vector3 position = new Vector3(transform.position.x,1f,transform.position.z);
Vector3 targetPosition = new Vector3(hitColliders[i].transform.position.x,1f,hitColliders[i].transform.position.z);
Debug.DrawLine(position, targetPosition - position);
if(Physics.Raycast(position, targetPosition - position, out hit)){
if (hit.transform.Equals(hitColliders[i].transform)) {
// This agent is within sight. Set it to the agentInSight GameObject if the angle is less than any of the other agents
if (angle < minAngle) {
minAngle = angle;
objectFound = hitColliders[i].transform;
}
}
}
}
}
}
return objectFound;
}