214 lines
6.9 KiB
C#
214 lines
6.9 KiB
C#
|
|
using System.Net.NetworkInformation;
|
|
using UdonSharp;
|
|
using UnityEngine;
|
|
using VRC.SDK3.UdonNetworkCalling;
|
|
using VRC.SDKBase;
|
|
using VRC.Udon;
|
|
|
|
public enum MusicEventType
|
|
{
|
|
None,
|
|
TheChase,
|
|
ThinkAboutIt,
|
|
RecoverTheLoot,
|
|
WhereInTheWorld,
|
|
RockapellaIdent
|
|
}
|
|
|
|
public enum SFXEventType
|
|
{
|
|
None,
|
|
Ding,
|
|
Buzzer,
|
|
|
|
TheLoot,
|
|
TheWarrant,
|
|
InJail,
|
|
|
|
MapCorrect,
|
|
MapIncorrect
|
|
}
|
|
|
|
|
|
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
|
|
public class AudioManager : UdonSharpBehaviour
|
|
{
|
|
[SerializeField] private AudioSource _MusicPlayer = null;
|
|
[SerializeField] private AudioSource _SFXPlayer = null;
|
|
|
|
[Header("Music")]
|
|
[SerializeField] private AudioClip _TheChase = null;
|
|
[SerializeField] private AudioClip _ThinkAboutIt = null;
|
|
[SerializeField] private AudioClip _RecoverTheLoot = null;
|
|
[SerializeField] private AudioClip _WhereInTheWorld = null;
|
|
[SerializeField] private AudioClip _RockapellaIdent = null;
|
|
|
|
[Header("SFX")]
|
|
[SerializeField] private AudioClip _Ding = null;
|
|
[SerializeField] private AudioClip _Buzzer = null;
|
|
|
|
[SerializeField] private AudioClip _TheLoot = null;
|
|
[SerializeField] private AudioClip _TheWarrant = null;
|
|
[SerializeField] private AudioClip _InJail = null;
|
|
|
|
[SerializeField] private AudioClip _MapCorrect = null;
|
|
[SerializeField] private AudioClip _MapIncorrect = null;
|
|
|
|
[Header("Crook Themes")]
|
|
[SerializeField] private AudioClip _CrookTheme_Contessa = null;
|
|
[SerializeField] private AudioClip _CrookTheme_DoubleTrouble = null;
|
|
[SerializeField] private AudioClip _CrookTheme_EarthaBrute = null;
|
|
[SerializeField] private AudioClip _CrookTheme_Kneemoi = null;
|
|
[SerializeField] private AudioClip _CrookTheme_PattyLarceny = null;
|
|
[SerializeField] private AudioClip _CrookTheme_Robocrook = null;
|
|
[SerializeField] private AudioClip _CrookTheme_SarahNade = null;
|
|
[SerializeField] private AudioClip _CrookTheme_TopGrunge = null;
|
|
[SerializeField] private AudioClip _CrookTheme_VicTheSlick = null;
|
|
[SerializeField] private AudioClip _CrookTheme_WonderRat = null;
|
|
|
|
|
|
[NetworkCallable]
|
|
public void PlayMusic(MusicEventType MusicEvent)
|
|
{
|
|
_PlayMusic_Internal(MusicEvent, false);
|
|
}
|
|
|
|
[NetworkCallable]
|
|
public void PlayMusicLoop(MusicEventType MusicEvent)
|
|
{
|
|
_PlayMusic_Internal(MusicEvent, true);
|
|
}
|
|
|
|
[NetworkCallable]
|
|
public void StopMusic()
|
|
{
|
|
_PlayMusic_Internal(MusicEventType.None, false);
|
|
}
|
|
|
|
private void _PlayMusic_Internal(MusicEventType MusicEvent, bool Loop)
|
|
{
|
|
_MusicPlayer.Stop();
|
|
|
|
switch (MusicEvent)
|
|
{
|
|
case MusicEventType.TheChase: _MusicPlayer.clip = _TheChase; break;
|
|
case MusicEventType.ThinkAboutIt: _MusicPlayer.clip = _ThinkAboutIt; break;
|
|
case MusicEventType.RecoverTheLoot: _MusicPlayer.clip = _RecoverTheLoot; break;
|
|
case MusicEventType.WhereInTheWorld: _MusicPlayer.clip = _WhereInTheWorld; break;
|
|
case MusicEventType.RockapellaIdent: _MusicPlayer.clip = _RockapellaIdent; break;
|
|
default: _MusicPlayer.clip = null; break;
|
|
}
|
|
|
|
_MusicPlayer.loop = Loop;
|
|
|
|
if (_MusicPlayer.clip != null)
|
|
_MusicPlayer.Play();
|
|
}
|
|
|
|
|
|
[NetworkCallable]
|
|
public void PlaySFX(SFXEventType SFXEvent)
|
|
{
|
|
_PlaySFX_Internal(SFXEvent);
|
|
}
|
|
|
|
[NetworkCallable]
|
|
public void PlaySFXAtPitch(SFXEventType SFXEvent, float Pitch)
|
|
{
|
|
_PlaySFX_Internal(SFXEvent, Pitch);
|
|
}
|
|
|
|
private void _PlaySFX_Internal(SFXEventType SFXEvent, float Pitch = 1.0f)
|
|
{
|
|
_SFXPlayer.Stop();
|
|
|
|
switch (SFXEvent)
|
|
{
|
|
case SFXEventType.Ding: _SFXPlayer.clip = _Ding; break;
|
|
case SFXEventType.Buzzer: _SFXPlayer.clip = _Buzzer; break;
|
|
|
|
case SFXEventType.TheLoot: _SFXPlayer.clip = _TheLoot; break;
|
|
case SFXEventType.TheWarrant: _SFXPlayer.clip = _TheWarrant; break;
|
|
case SFXEventType.InJail: _SFXPlayer.clip = _InJail; break;
|
|
|
|
case SFXEventType.MapCorrect: _SFXPlayer.clip = _MapCorrect; break;
|
|
case SFXEventType.MapIncorrect: _SFXPlayer.clip = _MapIncorrect; break;
|
|
|
|
default: _SFXPlayer.clip = null; break;
|
|
}
|
|
|
|
if (_SFXPlayer.clip != null)
|
|
{
|
|
_SFXPlayer.pitch = Pitch;
|
|
_SFXPlayer.Play();
|
|
}
|
|
}
|
|
|
|
|
|
[NetworkCallable]
|
|
public void PlayCrookTheme(AccusedCrook Crook)
|
|
{
|
|
_PlayCrookTheme_Internal(Crook);
|
|
}
|
|
|
|
private void _PlayCrookTheme_Internal(AccusedCrook Crook)
|
|
{
|
|
_SFXPlayer.Stop();
|
|
|
|
switch (Crook)
|
|
{
|
|
case AccusedCrook.Contessa: _SFXPlayer.clip = _CrookTheme_Contessa; break;
|
|
case AccusedCrook.DoubleTrouble: _SFXPlayer.clip = _CrookTheme_DoubleTrouble; break;
|
|
case AccusedCrook.EarthaBrute: _SFXPlayer.clip = _CrookTheme_EarthaBrute; break;
|
|
case AccusedCrook.Kneemoi: _SFXPlayer.clip = _CrookTheme_Kneemoi; break;
|
|
case AccusedCrook.PattyLarceny: _SFXPlayer.clip = _CrookTheme_PattyLarceny; break;
|
|
case AccusedCrook.Robocrook: _SFXPlayer.clip = _CrookTheme_Robocrook; break;
|
|
case AccusedCrook.SarahNade: _SFXPlayer.clip = _CrookTheme_SarahNade; break;
|
|
case AccusedCrook.TopGrunge: _SFXPlayer.clip = _CrookTheme_TopGrunge; break;
|
|
case AccusedCrook.VicTheSlick: _SFXPlayer.clip = _CrookTheme_VicTheSlick; break;
|
|
case AccusedCrook.WonderRat: _SFXPlayer.clip = _CrookTheme_WonderRat; break;
|
|
|
|
default: _SFXPlayer.clip = null; break;
|
|
}
|
|
|
|
_SFXPlayer.pitch = 1.0f;
|
|
if (_SFXPlayer.clip != null)
|
|
{
|
|
_SFXPlayer.Play();
|
|
}
|
|
}
|
|
|
|
// A messy group of variables that are used for pitch correction of sound effects
|
|
// Since Udon doesn't support accessing public static values in structs, we're doing it here
|
|
// As5 = 932.33 Hz, PitchShift = TargetNoteFreq / As5Freq
|
|
public const float As4 = 0.49999463709201677517617152724894f;
|
|
public const float B4 = 0.52972659895101519848122445915073f;
|
|
public const float C5 = 0.56122832044447781364967339890382f;
|
|
public const float Cs5 = 0.5946070597320691171580878015295f;
|
|
public const float D5 = 0.62995934915748715583538017654693f;
|
|
public const float Ds5 = 0.66741389851232932545343386998166f;
|
|
public const float E5 = 0.70709941758819302178413222785923f;
|
|
public const float F5 = 0.74915534199264209024701554170734f;
|
|
public const float Fs5 = 0.79369965570130747696631021204938f;
|
|
public const float G5 = 0.84089324595368592665687042141731f;
|
|
public const float Gs5 = 0.89089699998927418403355035234305f;
|
|
public const float A5 = 0.94387180504756899381120418735855f;
|
|
public const float As5 = 1.0f;
|
|
public const float B5 = 1.0594639237179968466101058638036f;
|
|
public const float C6 = 1.1224566408889556272993467978076f;
|
|
public const float Cs6 = 1.1892033936481717846685186575569f;
|
|
public const float D6 = 1.2599186983149743116707603530939f;
|
|
public const float Ds6 = 1.3348385228406251005545246854654f;
|
|
public const float E6 = 1.4142095609923524932159214012206f;
|
|
public const float F6 = 1.4982999581693177308463741379125f;
|
|
public const float Fs6 = 1.5873993114026149539326204240988f;
|
|
public const float G6 = 1.6817864919073718533137408428346f;
|
|
public const float Gs6 = 1.7817939999785483680671007046861f;
|
|
public const float A6 = 1.8877436100951379876224083747171f;
|
|
public const float As6 = 2.0f;
|
|
public const float B6 = 2.1183486533738054122467366704922f;
|
|
public const float C7 = 2.2449132817779112545986935956153f;
|
|
public const float Cs7 = 2.3784067872963435693370373151137f;
|
|
}
|