142 lines
5.9 KiB
C#
142 lines
5.9 KiB
C#
/************************************************************************************
|
|
Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
|
|
|
Your use of this SDK or tool is subject to the Oculus SDK License Agreement, available at
|
|
https://developer.oculus.com/licenses/oculussdk/
|
|
|
|
Unless required by applicable law or agreed to in writing, the Utilities SDK distributed
|
|
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
ANY KIND, either express or implied. See the License for the specific language governing
|
|
permissions and limitations under the License.
|
|
************************************************************************************/
|
|
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Random = UnityEngine.Random;
|
|
using UnityEngine.Assertions;
|
|
using Oculus.Interaction;
|
|
|
|
namespace Oculus.Interaction
|
|
{
|
|
[RequireComponent(typeof(AudioSource))]
|
|
public class AudioTrigger : MonoBehaviour
|
|
{
|
|
// Private
|
|
private AudioSource _audioSource = null;
|
|
private List<AudioClip> _randomAudioClipPool = new List<AudioClip>();
|
|
private AudioClip _previousAudioClip = null;
|
|
|
|
// Serialized
|
|
[Tooltip("Audio clip arrays with a value greater than 1 will have randomized playback.")]
|
|
[SerializeField]
|
|
private AudioClip[] _audioClips;
|
|
[Tooltip("Volume set here will override the volume set on the attached sound source component.")]
|
|
[Range(0f, 1f)]
|
|
[SerializeField]
|
|
private float _volume = 0.7f;
|
|
[Tooltip("Check the 'Use Random Range' bool to and adjust the min and max slider values for randomized volume level playback.")]
|
|
[SerializeField]
|
|
private MinMaxPair _volumeRandomization;
|
|
[Tooltip("Pitch set here will override the volume set on the attached sound source component.")]
|
|
[SerializeField]
|
|
[Range(-3f,3f)]
|
|
[Space(10)]
|
|
private float _pitch = 1f;
|
|
[Tooltip("Check the 'Use Random Range' bool to and adjust the min and max slider values for randomized volume level playback.")]
|
|
[SerializeField]
|
|
private MinMaxPair _pitchRandomization;
|
|
[Tooltip("True by default. Set to false for sounds to bypass the spatializer plugin. Will override settings on attached audio source.")]
|
|
[SerializeField]
|
|
[Space(10)]
|
|
private bool _spatialize = true;
|
|
[Tooltip("False by default. Set to true to enable looping on this sound. Will override settings on attached audio source.")]
|
|
[SerializeField]
|
|
private bool _loop = false;
|
|
[Tooltip("100% by default. Sets likelyhood sample will actually play when called")]
|
|
[SerializeField]
|
|
private float _chanceToPlay = 100;
|
|
[Tooltip("If enabled, audio will play automatically when this gameobject is enabled")]
|
|
[SerializeField]
|
|
private bool _playOnStart = false;
|
|
protected virtual void Start()
|
|
{
|
|
_audioSource = gameObject.GetComponent<AudioSource>();
|
|
// Validate that we have audio to play
|
|
Assert.IsTrue(_audioClips.Length > 0, "An AudioTrigger instance in the scene has no audio clips.");
|
|
// Add all audio clips in the populated array into an audio clip list for randomization purposes
|
|
for (int i = 0; i < _audioClips.Length; i++)
|
|
{
|
|
_randomAudioClipPool.Add(_audioClips[i]);
|
|
}
|
|
// Copy over values from the audio trigger to the audio source
|
|
_audioSource.volume = _volume;
|
|
_audioSource.pitch = _pitch;
|
|
_audioSource.spatialize = _spatialize;
|
|
_audioSource.loop = _loop;
|
|
Random.InitState((int)Time.time);
|
|
// Play audio on start if enabled
|
|
if (_playOnStart)
|
|
{
|
|
PlayAudio();
|
|
}
|
|
}
|
|
public void PlayAudio()
|
|
{
|
|
// Early out if our audio source is disabled
|
|
if (!_audioSource.isActiveAndEnabled)
|
|
{
|
|
return;
|
|
}
|
|
// Check if random chance is set
|
|
float pick = Random.Range(0.0f, 100.0f);
|
|
if (_chanceToPlay < 100 && pick > _chanceToPlay)
|
|
{
|
|
return;
|
|
}
|
|
// Check if volume randomization is set
|
|
if (_volumeRandomization.UseRandomRange == true)
|
|
{
|
|
_audioSource.volume = Random.Range(_volumeRandomization.Min, _volumeRandomization.Max);
|
|
}
|
|
// Check if pitch randomization is set
|
|
if (_pitchRandomization.UseRandomRange == true)
|
|
{
|
|
_audioSource.pitch = Random.Range(_pitchRandomization.Min, _pitchRandomization.Max);
|
|
}
|
|
// If the audio trigger has one clip, play it. Otherwise play a random without repeat clip
|
|
AudioClip clipToPlay = _audioClips.Length == 1 ? _audioClips[0] : RandomClipWithoutRepeat();
|
|
_audioSource.clip = clipToPlay;
|
|
// Play the audio
|
|
_audioSource.Play();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Choose a random clip without repeating the last clip
|
|
/// </summary>
|
|
private AudioClip RandomClipWithoutRepeat()
|
|
{
|
|
int randomIndex = Random.Range(0, _randomAudioClipPool.Count);
|
|
AudioClip randomClip = _randomAudioClipPool[randomIndex];
|
|
_randomAudioClipPool.RemoveAt(randomIndex);
|
|
if (_previousAudioClip != null) {
|
|
_randomAudioClipPool.Add(_previousAudioClip);
|
|
}
|
|
_previousAudioClip = randomClip;
|
|
return randomClip;
|
|
}
|
|
}
|
|
[System.Serializable]
|
|
public struct MinMaxPair
|
|
{
|
|
[SerializeField]
|
|
private bool _useRandomRange;
|
|
[SerializeField]
|
|
private float _min;
|
|
[SerializeField]
|
|
private float _max;
|
|
public bool UseRandomRange => _useRandomRange;
|
|
public float Min => _min;
|
|
public float Max => _max;
|
|
}
|
|
}
|