124 lines
3.2 KiB
C#
124 lines
3.2 KiB
C#
|
|
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);
|
|
}
|
|
}
|