2022-06-29 14:45:17 +03:00

171 lines
6.1 KiB
C#

namespace Photon.Voice.Unity.Demos.DemoVoiceUI
{
using ExitGames.Client.Photon;
using Unity;
using UnityEngine;
using UnityEngine.UI;
using Realtime;
[RequireComponent(typeof(Speaker))]
public class RemoteSpeakerUI : MonoBehaviour, IInRoomCallbacks
{
#pragma warning disable 649
[SerializeField]
private Text nameText;
[SerializeField]
protected Image remoteIsMuting;
[SerializeField]
private Image remoteIsTalking;
[SerializeField]
private InputField minDelaySoftInputField;
[SerializeField]
private InputField maxDelaySoftInputField;
[SerializeField]
private InputField maxDelayHardInputField;
[SerializeField]
private Text bufferLagText;
#pragma warning restore 649
protected Speaker speaker;
protected VoiceConnection voiceConnection;
protected LoadBalancingClient loadBalancingClient;
protected virtual void Start()
{
this.speaker = this.GetComponent<Speaker>();
this.minDelaySoftInputField.text = this.speaker.PlaybackDelayMinSoft.ToString();
this.minDelaySoftInputField.SetSingleOnEndEditCallback(this.OnMinDelaySoftChanged);
this.maxDelaySoftInputField.text = this.speaker.PlaybackDelayMaxSoft.ToString();
this.maxDelaySoftInputField.SetSingleOnEndEditCallback(this.OnMaxDelaySoftChanged);
this.maxDelayHardInputField.text = this.speaker.PlaybackDelayMaxHard.ToString();
this.maxDelayHardInputField.SetSingleOnEndEditCallback(this.OnMaxDelayHardChanged);
this.SetNickname();
this.SetMutedState();
}
private void OnMinDelaySoftChanged(string newMinDelaySoftString)
{
int newMinDelaySoftValue;
int newMaxDelaySoftValue = this.speaker.PlaybackDelayMaxSoft;
int newMaxDelayHardValue = this.speaker.PlaybackDelayMaxHard;
if (int.TryParse(newMinDelaySoftString, out newMinDelaySoftValue) && newMinDelaySoftValue >= 0 && newMinDelaySoftValue < newMaxDelaySoftValue)
{
this.speaker.SetPlaybackDelaySettings(newMinDelaySoftValue, newMaxDelaySoftValue, newMaxDelayHardValue);
}
else
{
this.minDelaySoftInputField.text = this.speaker.PlaybackDelayMinSoft.ToString();
}
}
private void OnMaxDelaySoftChanged(string newMaxDelaySoftString)
{
int newMinDelaySoftValue = this.speaker.PlaybackDelayMinSoft;
int newMaxDelaySoftValue;
int newMaxDelayHardValue = this.speaker.PlaybackDelayMaxHard;
if (int.TryParse(newMaxDelaySoftString, out newMaxDelaySoftValue) && newMinDelaySoftValue < newMaxDelaySoftValue)
{
this.speaker.SetPlaybackDelaySettings(newMinDelaySoftValue, newMaxDelaySoftValue, newMaxDelayHardValue);
}
else
{
this.maxDelaySoftInputField.text = this.speaker.PlaybackDelayMaxSoft.ToString();
}
}
private void OnMaxDelayHardChanged(string newMaxDelayHardString)
{
int newMinDelaySoftValue = this.speaker.PlaybackDelayMinSoft;
int newMaxDelaySoftValue = this.speaker.PlaybackDelayMaxSoft;
int newMaxDelayHardValue;
if (int.TryParse(newMaxDelayHardString, out newMaxDelayHardValue) && newMaxDelayHardValue >= newMaxDelaySoftValue)
{
this.speaker.SetPlaybackDelaySettings(newMinDelaySoftValue, newMaxDelaySoftValue, newMaxDelayHardValue);
}
else
{
this.maxDelayHardInputField.text = this.speaker.PlaybackDelayMaxHard.ToString();
}
}
private void Update()
{
// TODO: It would be nice, if we could show if a user is actually talking right now (Voice Detection)
this.remoteIsTalking.enabled = this.speaker.IsPlaying;
this.bufferLagText.text = string.Concat("Buffer Lag: ", this.speaker.Lag);
}
private void OnDestroy()
{
if (this.loadBalancingClient != null)
{
this.loadBalancingClient.RemoveCallbackTarget(this);
}
}
private void SetNickname()
{
string nick = this.speaker.name;
if (this.speaker.Actor != null)
{
nick = this.speaker.Actor.NickName;
if (string.IsNullOrEmpty(nick))
{
nick = string.Concat("user ", this.speaker.Actor.ActorNumber);
}
}
this.nameText.text = nick;
}
private void SetMutedState()
{
this.SetMutedState(this.speaker.Actor.IsMuted());
}
protected virtual void SetMutedState(bool isMuted)
{
this.remoteIsMuting.enabled = isMuted;
}
protected virtual void OnActorPropertiesChanged(Player targetPlayer, Hashtable changedProps)
{
if (targetPlayer.ActorNumber == this.speaker.Actor.ActorNumber)
{
this.SetMutedState();
this.SetNickname();
}
}
public virtual void Init(VoiceConnection vC)
{
this.voiceConnection = vC;
this.loadBalancingClient = this.voiceConnection.Client;
this.loadBalancingClient.AddCallbackTarget(this);
}
#region IInRoomCallbacks
void IInRoomCallbacks.OnPlayerEnteredRoom(Player newPlayer)
{
}
void IInRoomCallbacks.OnPlayerLeftRoom(Player otherPlayer)
{
}
void IInRoomCallbacks.OnRoomPropertiesUpdate(Hashtable propertiesThatChanged)
{
}
void IInRoomCallbacks.OnPlayerPropertiesUpdate(Player targetPlayer, Hashtable changedProps)
{
this.OnActorPropertiesChanged(targetPlayer, changedProps);
}
void IInRoomCallbacks.OnMasterClientSwitched(Player newMasterClient)
{
}
#endregion
}
}