110 lines
2.4 KiB
C#

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;
}
}
}
}