128 lines
3.0 KiB
C#
128 lines
3.0 KiB
C#
|
|
using UdonSharp;
|
|
using UnityEngine;
|
|
using VRC.SDK3.UdonNetworkCalling;
|
|
using VRC.Udon.Common.Interfaces;
|
|
using VRC.SDKBase;
|
|
using System.Linq;
|
|
|
|
public enum MusicEventType
|
|
{
|
|
None,
|
|
WhereInTheWorld,
|
|
RockapellaIdent
|
|
}
|
|
|
|
public enum SFXEventType
|
|
{
|
|
None,
|
|
Buzzer
|
|
}
|
|
|
|
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
|
|
public class GameManager : UdonSharpBehaviour
|
|
{
|
|
[Header("Player Data")]
|
|
public PlayerPodium[] PlayerPodiums;
|
|
|
|
[Header("Audio")]
|
|
[SerializeField] private AudioClip BuzzerSound = null;
|
|
|
|
[SerializeField] private AudioClip WhereInTheWorld = null;
|
|
[SerializeField] private AudioClip RockapellaIdent = null;
|
|
|
|
[SerializeField] private AudioSource MusicPlayer = null;
|
|
[SerializeField] private AudioSource SFXPlayer = null;
|
|
|
|
[UdonSynced] private bool BuzzInAllowed = true;
|
|
[UdonSynced] private bool[] PlayerBuzzInAllowed;
|
|
[UdonSynced] private int _BuzzedInPlayer = -1;
|
|
|
|
void Start()
|
|
{
|
|
PlayerBuzzInAllowed = new bool[PlayerPodiums.Length];
|
|
}
|
|
|
|
|
|
[NetworkCallable]
|
|
public void PlayerBuzzedIn(int PlayerNumber)
|
|
{
|
|
int PlayerIndex = PlayerNumber - 1;
|
|
if (!BuzzInAllowed || !PlayerBuzzInAllowed[PlayerIndex]) { return; }
|
|
|
|
// Prevent new buzz-ins and store which player is currently buzzed in.
|
|
BuzzInAllowed = false;
|
|
PlayerBuzzInAllowed[PlayerIndex] = false;
|
|
_BuzzedInPlayer = PlayerNumber;
|
|
RequestSerialization();
|
|
|
|
NetworkCalling.SendCustomNetworkEvent(
|
|
(IUdonEventReceiver)PlayerPodiums[PlayerIndex],
|
|
NetworkEventTarget.All,
|
|
"EnableBuzzInEffect", true);
|
|
|
|
// Play the buzzer sound globally.
|
|
SendCustomNetworkEvent(NetworkEventTarget.All, nameof(PlaySFX), SFXEventType.Buzzer);
|
|
}
|
|
public void CancelPlayerBuzzIn() {
|
|
BuzzInAllowed = true;
|
|
NetworkCalling.SendCustomNetworkEvent(
|
|
(IUdonEventReceiver)PlayerPodiums[_BuzzedInPlayer - 1],
|
|
NetworkEventTarget.All,
|
|
"EnableBuzzInEffect", false);
|
|
_BuzzedInPlayer = -1;
|
|
RequestSerialization();
|
|
}
|
|
|
|
|
|
public void ResetBuzzers()
|
|
{
|
|
BuzzInAllowed = true;
|
|
for (int i = 0; i < PlayerPodiums.Length; i++) { PlayerBuzzInAllowed[i] = true; }
|
|
_BuzzedInPlayer = -1;
|
|
}
|
|
|
|
|
|
public void PlayWhereInTheWorld()
|
|
{
|
|
SendCustomNetworkEvent(NetworkEventTarget.All, nameof(PlayMusic), MusicEventType.WhereInTheWorld);
|
|
}
|
|
|
|
public void PlayRockapellaIdent()
|
|
{
|
|
SendCustomNetworkEvent(NetworkEventTarget.All, nameof(PlayMusic), MusicEventType.RockapellaIdent);
|
|
}
|
|
|
|
[NetworkCallable]
|
|
public void PlayMusic(MusicEventType MusicEvent)
|
|
{
|
|
MusicPlayer.Stop();
|
|
|
|
switch (MusicEvent)
|
|
{
|
|
case MusicEventType.WhereInTheWorld: MusicPlayer.clip = WhereInTheWorld; break;
|
|
case MusicEventType.RockapellaIdent: MusicPlayer.clip = RockapellaIdent; break;
|
|
default: MusicPlayer.clip = null; break;
|
|
}
|
|
|
|
if (MusicPlayer.clip != null)
|
|
MusicPlayer.Play();
|
|
}
|
|
|
|
|
|
[NetworkCallable]
|
|
public void PlaySFX(SFXEventType SFXEvent)
|
|
{
|
|
SFXPlayer.Stop();
|
|
|
|
switch (SFXEvent)
|
|
{
|
|
case SFXEventType.Buzzer: SFXPlayer.clip = BuzzerSound; break;
|
|
default: SFXPlayer.clip = null; break;
|
|
}
|
|
|
|
if (SFXPlayer.clip != null)
|
|
SFXPlayer.Play();
|
|
}
|
|
}
|