using UdonSharp; using UnityEngine; using VRC.SDKBase; using VRC.Udon.Common; [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class Microphone : UdonSharpBehaviour { [SerializeField] private float _MikedVoiceDistanceNear = 30.0f; [SerializeField] private float _MikedVoiceDistanceFar = 60.0f; [UdonSynced] private bool _Enabled = false; private VRCPlayerApi[] _QueuedPlayers = new VRCPlayerApi[MAX_PLAYERS]; private const int MAX_PLAYERS = 100; private const float DEFAULT_VOICE_DISTANCE_NEAR = 0.0f; private const float DEFAULT_VOICE_DISTANCE_FAR = 25.0f; public override void OnDeserialization(DeserializationResult Result) { _EnableMicrophone_Synced(); base.OnDeserialization(Result); } public override void OnPlayerTriggerEnter(VRCPlayerApi Player) { for (int i = 0; i < _QueuedPlayers.Length; i++) { if (_QueuedPlayers[i] == null) { _QueuedPlayers[i] = Player; break; } } if (_Enabled) { Player.SetVoiceDistanceNear(_MikedVoiceDistanceNear); Player.SetVoiceDistanceFar(_MikedVoiceDistanceFar); } base.OnPlayerTriggerEnter(Player); } public override void OnPlayerTriggerExit(VRCPlayerApi Player) { for (int i = 0; i < _QueuedPlayers.Length; i++) { if (_QueuedPlayers[i] == Player) { _QueuedPlayers[i] = null; break; } } if (_Enabled) { Player.SetVoiceDistanceNear(DEFAULT_VOICE_DISTANCE_NEAR); Player.SetVoiceDistanceFar(DEFAULT_VOICE_DISTANCE_FAR); } base.OnPlayerTriggerExit(Player); } public override void OnPlayerJoined(VRCPlayerApi Player) { Player.SetVoiceDistanceNear(DEFAULT_VOICE_DISTANCE_NEAR); Player.SetVoiceDistanceFar(DEFAULT_VOICE_DISTANCE_FAR); base.OnPlayerJoined(Player); } public override void OnPlayerLeft(VRCPlayerApi Player) { Player.SetVoiceDistanceNear(DEFAULT_VOICE_DISTANCE_NEAR); Player.SetVoiceDistanceFar(DEFAULT_VOICE_DISTANCE_FAR); base.OnPlayerLeft(Player); } public void EnableMicrophone(bool Enable) { if (Networking.IsOwner(gameObject)) { _Enabled = Enable; _EnableMicrophone_Synced(); RequestSerialization(); } } private void _EnableMicrophone_Synced() { for (int i = 0; i < _QueuedPlayers.Length; i++) { if (_QueuedPlayers[i] != null) { _QueuedPlayers[i].SetVoiceDistanceNear(_Enabled ? _MikedVoiceDistanceNear : DEFAULT_VOICE_DISTANCE_NEAR); _QueuedPlayers[i].SetVoiceDistanceFar(_Enabled ? _MikedVoiceDistanceFar : DEFAULT_VOICE_DISTANCE_FAR); break; } } } }