using System; using UdonSharp; using UnityEngine; using VRC.SDKBase; [UdonBehaviourSyncMode(BehaviourSyncMode.NoVariableSync)] public class Microphone : UdonSharpBehaviour { [SerializeField] private float _MikedVoiceDistanceNear = 30.0f; [SerializeField] private float _MikedVoiceDistanceFar = 60.0f; 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) { Player.SetVoiceDistanceNear(_MikedVoiceDistanceNear); Player.SetVoiceDistanceFar(_MikedVoiceDistanceFar); for (int i = 0; i < _EnteredPlayers.Length; i++) { if (_EnteredPlayers[i] == null) { _EnteredPlayers[i] = Player; break; } } base.OnPlayerTriggerEnter(Player); } public override void OnPlayerTriggerExit(VRCPlayerApi Player) { Player.SetVoiceDistanceNear(DEFAULT_VOICE_DISTANCE_NEAR); Player.SetVoiceDistanceFar(DEFAULT_VOICE_DISTANCE_FAR); for (int i = 0; i < _EnteredPlayers.Length; i++) { if (_EnteredPlayers[i] == Player) { _EnteredPlayers[i] = null; break; } } base.OnPlayerTriggerExit(Player); } public void OnDisable() { for (int i = 0; i < _EnteredPlayers.Length; i++) { if (_EnteredPlayers[i] != null && _EnteredPlayers[i].IsValid()) { _EnteredPlayers[i].SetVoiceDistanceNear(DEFAULT_VOICE_DISTANCE_NEAR); _EnteredPlayers[i].SetVoiceDistanceFar(DEFAULT_VOICE_DISTANCE_FAR); } _EnteredPlayers[i] = null; } } }