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; public ParticleSystem particles; private bool isProcessing; // Start is called before the first frame update void Start() { radioButton.OnButtonPressed += OnRadioButtonPressed; radioButton.OnButtonReleased += OnRadioButtonReleased; radioButton.Lock(); isProcessing = false; var emission = particles.emission; emission.enabled = false; } // Update is called once per frame void Update() { particles.transform.LookAt(computerScreen.transform.position); } 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(); var emission = particles.emission; emission.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(); var emission = particles.emission; emission.enabled = false; } }