diff --git a/Assets/Resources/Sfx/games/forkLifter/zoomFast.ogg.meta b/Assets/Resources/Sfx/games/forkLifter/zoomFast.ogg.meta new file mode 100644 index 00000000..94fbab57 --- /dev/null +++ b/Assets/Resources/Sfx/games/forkLifter/zoomFast.ogg.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: bae94bedea157574fa32d28216adaf01 +AudioImporter: + externalObjects: {} + serializedVersion: 6 + defaultSettings: + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + preloadAudioData: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Games/ForkLifter/Pea.cs b/Assets/Scripts/Games/ForkLifter/Pea.cs index 20d57a37..c62decbf 100644 --- a/Assets/Scripts/Games/ForkLifter/Pea.cs +++ b/Assets/Scripts/Games/ForkLifter/Pea.cs @@ -19,7 +19,12 @@ namespace RhythmHeavenMania.Games.ForkLifter private void Start() { anim = GetComponent(); - Jukebox.PlayOneShotGame("forkLifter/zoom"); + + // SCHEDULING zoom sound so it lines up with when it meets the fork. + var currentDspTime = AudioSettings.dspTime; + var zoomStartTime = currentDspTime + (double)(Conductor.instance.secPerBeat * 2) - 0.317; + Jukebox.PlayOneShotScheduledGame("forkLifter/zoomFast", (double)zoomStartTime); + GetComponentInChildren().sprite = ForkLifter.instance.peaSprites[type]; for (int i = 0; i < transform.GetChild(0).childCount; i++) diff --git a/Assets/Scripts/Util/Jukebox.cs b/Assets/Scripts/Util/Jukebox.cs index 9bb1cae1..50fa63b7 100644 --- a/Assets/Scripts/Util/Jukebox.cs +++ b/Assets/Scripts/Util/Jukebox.cs @@ -57,6 +57,26 @@ namespace RhythmHeavenMania.Util GameManager.instance.SoundObjects.Add(oneShot); } + public static void PlayOneShotScheduled(string name, double targetTime) + { + GameObject oneShot = new GameObject("oneShotScheduled"); + + var audioSource = oneShot.AddComponent(); + audioSource.playOnAwake = false; + + var snd = oneShot.AddComponent(); + + var clip = Resources.Load($"Sfx/{name}"); + audioSource.clip = clip; + snd.clip = clip; + + snd.scheduled = true; + snd.scheduledTime = targetTime; + audioSource.PlayScheduled(targetTime); + + GameManager.instance.SoundObjects.Add(oneShot); + } + public static void PlayOneShotGame(string name, float beat = -1) { if (GameManager.instance.currentGame == name.Split('/')[0]) @@ -64,6 +84,14 @@ namespace RhythmHeavenMania.Util PlayOneShot($"games/{name}", beat); } } + + public static void PlayOneShotScheduledGame(string name, double targetTime) + { + if (GameManager.instance.currentGame == name.Split('/')[0]) + { + PlayOneShotScheduled($"games/{name}", targetTime); + } + } } } \ No newline at end of file diff --git a/Assets/Scripts/Util/Sound.cs b/Assets/Scripts/Util/Sound.cs index defab47e..cb1b0615 100644 --- a/Assets/Scripts/Util/Sound.cs +++ b/Assets/Scripts/Util/Sound.cs @@ -9,6 +9,10 @@ namespace RhythmHeavenMania.Util public AudioClip clip; public float pitch = 1; + // For use with PlayOneShotScheduled + public bool scheduled; + public double scheduledTime; + private AudioSource audioSource; private int pauseTimes = 0; @@ -26,7 +30,7 @@ namespace RhythmHeavenMania.Util audioSource.clip = clip; audioSource.pitch = pitch; - if (beat == -1) + if (beat == -1 && !scheduled) { audioSource.PlayScheduled(Time.time); playInstant = true; @@ -39,12 +43,21 @@ namespace RhythmHeavenMania.Util startTime = Conductor.instance.songPosition; - StartCoroutine(NotRelyOnBeatSound()); + if (!scheduled) + StartCoroutine(NotRelyOnBeatSound()); } private void Update() { - if (!playInstant) + if (scheduled) + { + if (AudioSettings.dspTime > scheduledTime) + { + StartCoroutine(NotRelyOnBeatSound()); + playIndex++; + } + } + else if (!playInstant) { if (Conductor.instance.songPositionInBeats > beat && playIndex < 1) {