// Cast a sphere with the desired radius. Check each object's audio source to see if audio is playing. If audio is playing // and its audibility is greater than the audibility threshold then return the object heard /// <summary> /// Withins the hearing range. /// </summary> /// <returns>The hearing range.</returns> /// <param name="transform">玩家</param> /// <param name="linearAudibilityThreshold">Linear audibility threshold.</param> /// <param name="hearingRadius">可以听到的范围</param> /// <param name="objectLayerMask">对象层遮罩</param> public static Transform WithinHearingRange(Transform transform, float linearAudibilityThreshold, float hearingRadius, LayerMask objectLayerMask) { Transform objectHeard = null; var hitColliders = Physics.OverlapSphere(transform.position, hearingRadius, objectLayerMask);//获取范围内的对象 if (hitColliders != null) { float maxAudibility = 0; AudioSource colliderAudioSource; for (int i = 0; i < hitColliders.Length; ++i) { // Check to see if the hit agent has an audio source and that audio source is playing if ((colliderAudioSource = hitColliders[i].GetComponent<AudioSource>()) != null && colliderAudioSource.isPlaying) {//对象发出声音 // The audio source is playing. Make sure the sound can be heard from the agent's current position var audibility = colliderAudioSource.volume / Vector3.Distance(transform.position, hitColliders[i].transform.position);//声音衰减 if (audibility > linearAudibilityThreshold) {//声音大于衰减阀值 if (audibility > maxAudibility) {//获取声音最大的那个 maxAudibility = audibility; objectHeard = hitColliders[i].transform; } } } } } return objectHeard; }