// 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;
for (int i = 0; i < hitColliders.Length; ++i) {
// The hit agent needs to be within the field of view of the current agent
if ((angle = Vector3.Angle(transform.position, hitColliders[i].transform.position)) < fieldOfViewAngle) {//获取可视角度内的对象
RaycastHit hit;
// The hit agent needs to be within view of the current agent
if (Physics.Linecast(transform.position, hitColliders[i].transform.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;
}
判断对象是否在视线内
时间: 2024-11-07 11:09:47