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; } 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 onCountDown(string time){ Debug.Log("/countdown message received: " + time); if (mask != null) { if(time=="0"){ mask.fillAmount = 0f; }else{ StopCoroutine("DecreaseFill"); StartCoroutine(DecreaseFill(float.Parse(time))); } } } public void onInput(string input) { Debug.Log("/input message received: " + input); StartCoroutine(FadeCanvasGroup(hint, 0f, 1f, _hintDuration)); switch(input){ case "processing": statusText.text = "處理中...\nprocessing..."; break; case "system": statusText.text = "回覆中...\nresponding..."; break; case "user": statusText.text = "請說話\nyour turn to speak"; break; default: Debug.LogWarning("Unknown input: " + input); break; } } }