using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Video; using OscJack; using TMPro; public class OscHandler : MonoBehaviour { [SerializeField] public CanvasGroup intro; [SerializeField] public CanvasGroup main; [SerializeField] public VideoPlayer videoPlayer; [SerializeField] public Image mask; [SerializeField] public float _fadeDuration = 1f; [SerializeField] public float _hintDuration = 0.2f; [SerializeField] public TextMeshProUGUI statusText; [SerializeField] public CanvasGroup hint; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } private IEnumerator FadeCanvasGroup(CanvasGroup canvasGroup, float startAlpha, float endAlpha, float duration) { canvasGroup.alpha = startAlpha; float elapsedTime = 0f; while (elapsedTime < duration) { elapsedTime += Time.deltaTime; canvasGroup.alpha = Mathf.Lerp(startAlpha, endAlpha, elapsedTime / duration); yield return null; } canvasGroup.alpha = endAlpha; } public void onInputTime(float duration) { Debug.Log("Start decreasing fill over time: " + duration); if (mask != null) { StopCoroutine("DecreaseFill"); StartCoroutine(DecreaseFill(duration)); } } private IEnumerator DecreaseFill(float duration) { float elapsed = 0f; mask.fillAmount = 1f; while (elapsed < duration) { elapsed += Time.deltaTime; mask.fillAmount = Mathf.Lerp(1f, 0f, elapsed / duration); // fade out hint StartCoroutine(FadeCanvasGroup(hint, 1f, 0f, _hintDuration)); yield return null; } mask.fillAmount = 0f; } public void onStatus(string status){ Debug.Log("/status message received: " + status); videoPlayer.Stop(); hint.alpha = 0f; mask.fillAmount = 0f; switch(status) { case "reset": intro.alpha = 0f; main.alpha = 0f; break; case "go": StartCoroutine(FadeCanvasGroup(intro, 0f, 1f, _fadeDuration)); videoPlayer.time = 0f; videoPlayer.Play(); videoPlayer.loopPointReached += (VideoPlayer vp) => { Debug.Log("Video playback completed."); StartCoroutine(FadeCanvasGroup(intro, 1f, 0f, _fadeDuration)); StartCoroutine(FadeCanvasGroup(main, 0f, 1f, _fadeDuration)); videoPlayer.loopPointReached -= null; }; break; case "end": StartCoroutine(FadeCanvasGroup(main, 1f, 0f, _fadeDuration)); videoPlayer.Stop(); break; default: Debug.LogWarning("Unknown status: " + status); break; } } public void onInput(string input) { Debug.Log("/input message received: " + input); if (float.TryParse(input, out float duration)) { onInputTime(duration); statusText.text = "your turn to speak"; } else { StartCoroutine(FadeCanvasGroup(hint, 0f, 1f, _hintDuration)); mask.fillAmount = 0f; switch(input){ case "processing": statusText.text = "processing..."; break; case "responding": statusText.text = "responding..."; break; default: Debug.LogWarning("Unknown input: " + input); break; } } } }