首页 > 代码库 > 判断对象是否在视线内

判断对象是否在视线内

// 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;
    }