Simple audio player for Unity
Lucid Audio is a library that handles audio playback in Unity. You can easily describe how to play and stop sounds, set callbacks, etc. using method chaining.
- Simple description method using method chaining
- Advanced settings such as delays and callbacks
- Play/stop timing can be linked to GameObject
- Unity 2019.4 or higher
- Open the Package Manager from Window > Package Manager
- "+" button > Add package from git URL
- Enter the following to install
or open Packages/manifest.json and add the following to the dependencies block.
{
"dependencies": {
"com.annulusgames.lucid-audio": "https://github.com/AnnulusGames/LucidAudio.git?path=/Assets/LucidAudio"
}
}
When using Lucid Audio, add the following line at the beginning of the file.
using AnnulusGames.LucidTools.Audio;
Use LucidAudio class to play audio.
public Audioclip clip;
private void Start()
{
// play sound effect
LucidAudio.PlaySE(clip);
}
Use method chaining to set delays, callbacks, etc.
// After waiting for 1 second, play BGM with Volume 0.7 and display "Complete!"
LucidAudio.PlayBGM(clip)
.SetVolume(0.7f)
.SetDelay(1f)
.OnComplete(() => Debug.Log("Complete!"));
These methods have an AudioPlayer class as a return value. If you want to pause the audio or change settings during playback, call AudioPlayer methods.
AudioPlayer player = LucidAudio.PlaySE(clip);
// pause/resume audio
player.Pause();
player.UnPause();
// play audio from beginning
player.Restart();
Use FadeVolume or add an argument when playing/stopping to fade the volume.
// fade the first second
AudioPlayer player = LucidAudio.PlayBGM(clip, 1f);
// Change volume to 0.7 over 1 second
player.FadeVolume(0.7f, 1f);
// stop after 2 seconds fade out
player.Stop(2f);
AudioPlayer dispose its internal AudioSource when you call Stop, so it cannot be used again after stopping. Attempting to call Play or Restart on a stopped AudioPlayer will throw InvalidOperationException.
AudioPlayer player = LucidAudio.PlayBGM(clip);
// stop playing audio
player.Stop();
// InvalidOperationException: A stopped AudioPlayer is not allowed to play again. You need to create a new AudioPlayer.
player.Restart();
If you want to play the stopped AudioPlayer again, use Pause instead of Stop.
Also, in the default setting, Stop is automatically called at the end. By setting SetAutoStop to false, you can set the AudioPlayer to return to its pre-play state when playback ends.
AudioPlayer player = LucidAudio.PlayBGM(clip)
.SetAutoPause(false);
// Play, UnPause, and Restart can be used even after termination
player.Play();
// Explicitly call Stop when finished, as it is not automatically disposed
player.Stop();
Lucid Audio makes it easy to set callbacks using methods. Below is a list of callbacks that can be set on the AudioPlayer.
Called at the moment the audio starts playing. If a delay is set with SetDelay, it will be called when the delay ends.
Called every frame while audio is playing. Not called while paused.
Called when the audio is paused.
Called when the audio has finished playing. It is not called if you stop playback with Stop.
Called when the audio has stopped. Also called on completion if SetAutoStop is not set.
By setting the value with SetSpatialBlend, you can play audio considering the distance to the sound source.
// Set Spatial Blend to 1
LucidAudio.PlaySE(clip)
.SetSpatialBlend(1f);
Use SetPosition to specify the position of the sound source.
// play sound effect at position (1, 2, 3)
LucidAudio.PlaySE(clip)
.SetSpatialBlend(1f)
.SetPosition(new Vector3(1f, 2f, 3f));
Parameters such as Rolloff Mode and Max Distance can also be set using methods.
LucidAudio.PlaySE(clip)
.SetSpatialBlend(1f)
.SetPosition(new Vector3(1f, 2f, 3f))
.SetMaxDistanc(10f)
.SetRolloffMode(AudioRolloffMode.Logarithmic);
By setting an ID for AudioPlayer, multiple AudioPlayers can be handled collectively. Use SetID to set the ID.
// Set ID to AudioPlayer
LucidAudio.PlaySE(clip)
.SetID("GroupName");
If you want to collectively manipulate audios with IDs, add the IDs to the arguments of the LucidAudio class methods.
// Stop all AudioPlayers whose ID is set to "GroupName"
LucidAudio.StopAll("GroupName");
Also, by using GetPlayersByID, you can get all AudioPlayers with matching IDs.
// Get all AudioPlayers whose ID is set to "GroupName"
AudioPlayer[] players = LucidAudio.GetPlayersByID("GroupName");
// Set Volume to 0.5
foreach (AudioPlayer player in players)
{
player.SetVolume(0.5f);
}
By using SetLink, it is possible to link the audio playback/stop timing to the state of the GameObject.
// Call Stop when gameObject is destroyed
LucidAudio.PlayBGM(clip)
.SetLink(gameObject);
By specifying AudioLinkBehaviour as an argument, detailed behavior can be set. (Stop is called at OnDestroy regardless of which option is specified.)
// pause when inactive, play when active
LucidAudio.PlayBGM(clip)
.SetLink(gameObject, AudioLinkBehaviour.PauseOnDisableUnPauseOnEnable);
Available options are:
- StopOnDestroy
- StopOnDisable
- PlayOnEnable
- RestartOnEnable
- PauseOnDisable
- PauseOnDisableUnPauseOnEnable
- PauseOnDisableRestartOnEnable
You can also use coroutines or async/await to wait for audio to finish. To use AudioPlayer in coroutine, call WaitForCompletion.
IEnumerator Coroutine()
{
// wait until playback ends
yield return LucidAudio.PlaySE(clip).WaitForCompletion();
}
It is also possible to convert to Task by using WaitForCompletionAsync.
async void MethodAsync()
{
// Convert to Task, wait until playback ends
await LucidAudio.PlaySE(clip).WaitForCompletionAsync();
}
LucidAudio supports UniTask. ToUniTask becomes available by introducing UniTask to the project from Package Manager.
async UniTask MethodAsync(CancellationToken token = default)
{
try
{
// Convert to UniTask, wait until playback ends
await LucidAudio.PlaySE(clip).ToUniTask(cancellationToken: token);
}
catch (OperationCanceledException ex)
{
Debug.Log("Canceled");
}
}
Also, you can set the behavior when canceling by specifying AudioCancelBehaviour as an argument. (Stop is set by default)
async UniTask MethodAsync(CancellationToken token = default)
{
try
{
// Pause AudioPlayer on cancel
await LucidAudio.PlaySE(clip).ToUniTask(AudioCancelBehaviour.Pause, cancellationToken: token);
}
catch (OperationCanceledException ex)
{
Debug.Log("Canceled");
}
}