根據聲音獲取物件

星塵發表於2014-05-16
// 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;
    }

 

相關文章