首页 > 代码库 > 判断对象是否在视线内
判断对象是否在视线内
// 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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。