using UdonSharp; using UnityEngine; using VRC.SDKBase; [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class Microphone : UdonSharpBehaviour { [SerializeField] private PermissionsPanel _PermissionsPanel; [SerializeField] private float _MikedVoiceDistanceNear = 30.0f; [SerializeField] private float _MikedVoiceDistanceFar = 60.0f; [UdonSynced] private bool _MicrophoneEnabled = false; private VRCPlayerApi[] _EnteredPlayers = new VRCPlayerApi[MAX_PLAYERS]; private const float DEFAULT_VOICE_DISTANCE_NEAR = 0.0f; private const float DEFAULT_VOICE_DISTANCE_FAR = 25.0f; private const int MAX_PLAYERS = 100; public override void OnPlayerTriggerEnter(VRCPlayerApi Player) { for (int i = 0; i < _EnteredPlayers.Length; i++) { if (_EnteredPlayers[i] == null) { _EnteredPlayers[i] = Player; break; } } if (_MicrophoneEnabled && _LocalPlayerIsAllowedToSetMicrophone()) { Debug.Log("[Microphone] Microphone " + gameObject.name + " is now changing volume settings for player " + Player.displayName); Player.SetVoiceDistanceNear(_MikedVoiceDistanceNear); Player.SetVoiceDistanceFar(_MikedVoiceDistanceFar); } base.OnPlayerTriggerEnter(Player); } public override void OnPlayerTriggerExit(VRCPlayerApi Player) { if (Player != null && Player.IsValid()) { for (int i = 0; i < _EnteredPlayers.Length; i++) { if (_EnteredPlayers[i] == Player) { _EnteredPlayers[i] = null; break; } } if (_MicrophoneEnabled && _LocalPlayerIsAllowedToSetMicrophone()) { Debug.Log("[Microphone] Microphone " + gameObject.name + " is now changing volume settings for player " + Player.displayName); 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) { for (int i = 0; i < _EnteredPlayers.Length; i++) { if (_EnteredPlayers[i] == Player) { _EnteredPlayers[i] = null; break; } } base.OnPlayerLeft(Player); } public void EnableMicrophone(bool Enable) { _MicrophoneEnabled = Enable; Debug.Log("[Microphone] Microphone is now " + (Enable ? "en" : "dis") + "abled"); if (_LocalPlayerIsAllowedToSetMicrophone()) { for (int i = 0; i < _EnteredPlayers.Length; i++) { if (_EnteredPlayers[i] != null && _EnteredPlayers[i].IsValid()) { Debug.Log("[Microphone] Microphone " + gameObject.name + " is now " + (_MicrophoneEnabled ? "en" : "dis") + "abled; changing volume settings for player " + _EnteredPlayers[i].displayName); _EnteredPlayers[i].SetVoiceDistanceNear(_MicrophoneEnabled ? _MikedVoiceDistanceNear : DEFAULT_VOICE_DISTANCE_NEAR); _EnteredPlayers[i].SetVoiceDistanceFar(_MicrophoneEnabled ? _MikedVoiceDistanceFar : DEFAULT_VOICE_DISTANCE_FAR); } } } RequestSerialization(); } private bool _LocalPlayerIsAllowedToSetMicrophone() { return _PermissionsPanel.IsPlayerHost(Networking.LocalPlayer) && Networking.IsOwner(gameObject); } }