fix issues with beataction/multisound and pausing

This commit is contained in:
minenice55 2023-11-10 16:54:46 -05:00
parent 1e41d57546
commit 94ac850016
2 changed files with 31 additions and 8 deletions

View file

@ -52,9 +52,9 @@ namespace HeavenStudio.Util
int idx = 0;
while (idx < actions.Count)
{
await UniTask.WaitUntil(() => Conductor.instance.songPositionInBeatsAsDouble >= actions[idx].beat || (!Conductor.instance.isPlaying) || behaviour == null, cancellationToken: token);
await UniTask.WaitUntil(() => Conductor.instance.songPositionInBeatsAsDouble >= actions[idx].beat || !(Conductor.instance.isPlaying || Conductor.instance.isPaused) || behaviour == null, cancellationToken: token);
if (behaviour == null || !Conductor.instance.isPlaying)
if (behaviour == null || !(Conductor.instance.isPlaying || Conductor.instance.isPaused))
return;
actions[idx].function.Invoke();

View file

@ -24,7 +24,6 @@ namespace HeavenStudio.Util
private AudioSource audioSource;
private Conductor cond;
private int pauseTimes = 0;
private double startTime;
@ -34,6 +33,7 @@ namespace HeavenStudio.Util
bool playInstant = false;
bool played = false;
bool paused = false;
bool queued = false;
public bool available = true;
@ -110,9 +110,9 @@ namespace HeavenStudio.Util
{
cond = Conductor.instance;
double dspTime = AudioSettings.dspTime;
if (!available)
if (!(available || played))
{
if (!Conductor.instance.isPlaying)
if (!(cond.isPlaying || cond.isPaused))
{
GameManager.instance.SoundObjects.Release(this);
return;
@ -140,8 +140,8 @@ namespace HeavenStudio.Util
}
if (scheduledPitch != 0 && dspTime > startTime)
{
played = true;
StartCoroutine(NotRelyOnBeatSound());
played = true;
}
else
{
@ -169,6 +169,28 @@ namespace HeavenStudio.Util
}
}
if (played)
{
if (cond.isPaused || cond.SongPitch == 0)
{
if (!paused)
{
// Debug.Log($"Pausing {gameObject.name}");
audioSource.Pause();
paused = true;
}
}
else
{
if (paused)
{
// Debug.Log($"Unpausing {gameObject.name}");
audioSource.UnPause();
paused = false;
}
}
}
if (loopIndex < 1)
{
if (looping && loopEndBeat != -1) // Looping sounds play forever unless params are set.
@ -184,12 +206,12 @@ namespace HeavenStudio.Util
IEnumerator NotRelyOnBeatSound()
{
if (!Conductor.instance.isPlaying)
if (!(Conductor.instance.isPlaying || Conductor.instance.isPaused))
{
GameManager.instance.SoundObjects.Release(this);
yield break;
}
WaitUntil yieldIsAudioPlaying = new WaitUntil(() => !audioSource.isPlaying || !Conductor.instance.isPlaying);
WaitUntil yieldIsAudioPlaying = new WaitUntil(() => !(paused || audioSource.isPlaying || Conductor.instance.isPlaying || Conductor.instance.isPaused));
if (played && !looping) // Looping sounds are destroyed manually.
{
yield return yieldIsAudioPlaying;
@ -219,6 +241,7 @@ namespace HeavenStudio.Util
{
available = true;
played = false;
paused = false;
queued = false;
playInstant = false;
looping = false;