根据声音获取对象

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

 

posted @ 2014-05-16 15:37  星尘  阅读(428)  评论(0编辑  收藏  举报