1
0
forked from cgvr/DeltaVR
Files
DeltaVR3DModelGeneration/Assets/_PROJECT/Scripts/ModeGeneration/ShapeDetection/RadioTransmitter.cs

97 lines
3.1 KiB
C#

using System.Threading.Tasks;
using TMPro;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;
public class RadioTransmitter : XRGrabInteractable
{
public delegate void OnPlayerPickUpDelegate();
public event OnPlayerPickUpDelegate OnPlayerPickUp;
public delegate void OnPlayerFinishedSpeakingDelegate();
public event OnPlayerFinishedSpeakingDelegate OnPlayerFinishedSpeaking;
[Header("Custom Config")]
public FMODWhisperBridge fmodWhisperBridge;
public ReleasableButton radioButton;
public TextMeshProUGUI computerScreen;
[Header("Particle System Config")]
public ParticleSystem particles;
public float baseEmissionRate = 3;
public float maxExtraEmissionRate = 50;
private bool isProcessing;
private ParticleSystem.EmissionModule particleEmission;
// Start is called before the first frame update
void Start()
{
radioButton.OnButtonPressed += OnRadioButtonPressed;
radioButton.OnButtonReleased += OnRadioButtonReleased;
radioButton.Lock();
isProcessing = false;
particleEmission = particles.emission;
particleEmission.enabled = false;
}
// Update is called once per frame
void Update()
{
if (particles.emission.enabled)
{
particles.transform.LookAt(computerScreen.transform.position);
Debug.Log("speech volume normalized: " + fmodWhisperBridge.GetNormalizedVolume01());
Debug.Log("speech volume decibels: " + fmodWhisperBridge.GetCurrentVolumeDb());
particleEmission.rateOverTime = baseEmissionRate + fmodWhisperBridge.GetNormalizedVolume01() * maxExtraEmissionRate;
}
}
protected async override void OnSelectEntered(SelectEnterEventArgs args)
{
base.OnSelectEntered(args);
OnPlayerPickUp?.Invoke();
await Task.Delay(100);
radioButton.Unlock();
}
private void OnRadioButtonPressed()
{
AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.RadioButton, gameObject);
if (!isProcessing)
{
isProcessing = true;
fmodWhisperBridge.OnWhisperSegmentUpdated += OnPlayerSpeechUpdated;
fmodWhisperBridge.OnWhisperSegmentFinished += OnPlayerSpeechFinished;
fmodWhisperBridge.ActivateRecording();
particleEmission.enabled = true;
}
}
private void OnRadioButtonReleased()
{
AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.RadioButton, gameObject);
}
private void OnPlayerSpeechUpdated(string text)
{
computerScreen.text = text;
//OnPlayerFinishedSpeaking?.Invoke();
}
private void OnPlayerSpeechFinished(string playerText)
{
computerScreen.text = playerText;
isProcessing = false;
OnPlayerFinishedSpeaking?.Invoke();
fmodWhisperBridge.OnWhisperSegmentUpdated -= OnPlayerSpeechUpdated;
fmodWhisperBridge.OnWhisperSegmentFinished -= OnPlayerSpeechFinished;
fmodWhisperBridge.DeactivateRecording();
particleEmission.enabled = false;
}
}