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