You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

389 lines
11 KiB

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;
using OscJack;
using TMPro;
public class MotyOscHandler : MonoBehaviour
{
[SerializeField]
public CanvasGroup intro;
[SerializeField]
public CanvasGroup main;
[SerializeField]
public VideoPlayer videoStandby;
[SerializeField]
public VideoPlayer videoIntro;
[SerializeField]
public VideoPlayer videoEnding;
[SerializeField]
public VideoPlayer videoAd;
[SerializeField]
public Image mask;
[SerializeField]
public float _fadeDuration = 1f;
[SerializeField]
public float _hintDuration = 0.5f;
[SerializeField]
public float _maskDuration = 0.2f;
[SerializeField]
public float _lastDurationToShow = 30f;
[SerializeField]
public TextMeshProUGUI statusText;
[SerializeField]
public CanvasGroup hint;
private IEnumerator coroutine_hint;
private IEnumerator coroutine_countdown;
SetChoiceEffect setChoiceEffect;
[SerializeField]
public TextMeshProUGUI stepText;
[SerializeField]
public CanvasGroup hintforChat;
[SerializeField]
public CanvasGroup hintforStep;
private IEnumerator coroutine_breath;
public CanvasGroup hintforInput;
// Start is called before the first frame update
void Start()
{
setChoiceEffect = main?.GetComponent<SetChoiceEffect>();
}
// Update is called once per frame
void Update()
{
}
private IEnumerator FadeCanvasGroup(CanvasGroup canvasGroup, float startAlpha, float endAlpha, float duration, float delay = 0f)
{
if (delay > 0f)
yield return new WaitForSeconds(delay);
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;
if (duration - elapsed > _lastDurationToShow)
{
mask.fillAmount = 0;
mask.gameObject.SetActive(false);
}
else
{
mask.gameObject.SetActive(true);
mask.fillAmount = Mathf.Lerp(0f, 1f, (duration - elapsed) / _lastDurationToShow);
}
yield return null;
}
mask.fillAmount = 0f;
}
public void ToggleVideo(string status)
{
switch(status)
{
case "intro":
videoStandby.gameObject.SetActive(false);
videoEnding.gameObject.SetActive(false);
videoIntro.time = 0f;
videoIntro.Play();
if (intro.alpha > 0f) StartCoroutine(FadeCanvasGroup(intro, intro.alpha, 0f, _fadeDuration));
break;
case "end":
videoStandby.gameObject.SetActive(false);
videoEnding.gameObject.SetActive(true);
videoAd.gameObject.SetActive(false);
videoEnding.time = 0f;
videoEnding.Play();
if (intro.alpha < 1f) StartCoroutine(FadeCanvasGroup(intro, intro.alpha, 1f, _fadeDuration));
break;
case "standby":
videoStandby.gameObject.SetActive(true);
videoEnding.gameObject.SetActive(false);
videoAd.gameObject.SetActive(false);
videoStandby.time = 0f;
videoStandby.Play();
if (intro.alpha < 1f) StartCoroutine(FadeCanvasGroup(intro, intro.alpha, 1f, _fadeDuration));
break;
case "ad":
videoStandby.gameObject.SetActive(false);
videoEnding.gameObject.SetActive(false);
videoAd.gameObject.SetActive(true);
videoAd.time = 0f;
videoAd.Play();
if (intro.alpha < 1f) StartCoroutine(FadeCanvasGroup(intro, intro.alpha, 1f, _fadeDuration));
break;
case "reset":
videoStandby.gameObject.SetActive(false);
videoEnding.gameObject.SetActive(false);
videoAd.gameObject.SetActive(false);
StartCoroutine(FadeCanvasGroup(intro, intro.alpha, 0f, _fadeDuration));
break;
}
}
public void onStatus(string status)
{
Debug.Log("/status message received: " + status);
ToggleVideo("reset");
if (coroutine_hint != null) StopCoroutine(coroutine_hint);
mask.fillAmount = 0f;
switch (status)
{
case "reset":
// intro.alpha = 1.0f;
if (main.alpha > 0f)
StartCoroutine(FadeCanvasGroup(main, main.alpha, 0f, _fadeDuration));
// if (intro.alpha < 1f)
// StartCoroutine(FadeCanvasGroup(intro, intro.alpha, 1f, _fadeDuration));
// light_mask.alpha = 0f;
hint.alpha = 0f;
// setChoiceEffect?.Reset();
ToggleVideo("standby");
break;
case "intro":
// StartCoroutine(FadeCanvasGroup(light_mask, 0f, 1f, _maskDuration));
// StartCoroutine(FadeCanvasGroup(intro, 0f, 1f, _fadeDuration, _maskDuration));
if (main.alpha > 0f)
StartCoroutine(FadeCanvasGroup(main, main.alpha, 0f, _fadeDuration));
StartCoroutine(FadeCanvasGroup(hint, hint.alpha, 1f, _hintDuration));
ToggleVideo("intro");
break;
case "go":
// if (light_mask.alpha < 1f) StartCoroutine(FadeCanvasGroup(light_mask, light_mask.alpha, 1f, _fadeDuration));
// StartCoroutine(FadeCanvasGroup(intro, intro.alpha, 0f, _fadeDuration));
StartCoroutine(FadeCanvasGroup(main, main.alpha, 1f, _fadeDuration));
break;
case "end":
// if (intro.alpha > 0f) StartCoroutine(FadeCanvasGroup(intro, 1f, 0f, _fadeDuration));
// StartCoroutine(FadeCanvasGroup(main, 1f, 0f, _fadeDuration));
main.alpha = 0f;
// StartCoroutine(FadeCanvasGroup(light_mask, 1f, 0f, _maskDuration, _fadeDuration));
if (hint.alpha > 0f)
{
coroutine_hint = FadeCanvasGroup(hint, hint.alpha, 0f, _hintDuration);
StartCoroutine(coroutine_hint);
}
ToggleVideo("end");
break;
case "ad":
ToggleVideo("ad");
break;
default:
Debug.LogWarning("Unknown status: " + status);
break;
}
}
public void onCountDown(string time)
{
Debug.Log("/countdown message received: " + time);
if (mask != null)
{
if (coroutine_countdown != null) StopCoroutine(coroutine_countdown);
if (time == "0")
{
mask.fillAmount = 0f;
mask.gameObject.SetActive(false);
}
else
{
coroutine_countdown = DecreaseFill(float.Parse(time));
StartCoroutine(coroutine_countdown);
}
}
}
public void onSpeechPause(string pause)
{
Debug.Log("/speechpause message received: " + pause);
float pause_time = float.Parse(pause);
if (pause_time > 0f)
{
StartCoroutine(FadeCanvasGroup(hintforInput, hintforInput.alpha, 0f, pause_time/1000.0f));
}
}
public void onInput(string input)
{
Debug.Log("/input message received: " + input);
if (input.Length == 0)
{
statusText.text = "";
// hintforChat.alpha = 0f;
if (hintforChat.alpha > 0f)
{
StartCoroutine(FadeCanvasGroup(hintforChat, hintforChat.alpha, 0f, _hintDuration));
}
}
else
{
hintforInput.alpha = 1.0f;
if (hint.alpha < 1f)
{
if (coroutine_hint != null) StopCoroutine(coroutine_hint);
coroutine_hint = FadeCanvasGroup(hint, hint.alpha, 1f, _hintDuration);
StartCoroutine(coroutine_hint);
}
// statusText.text = input;
StartCoroutine(TypeWriter(statusText, input));
// hintforChat.alpha = 1f;
// if (hintforChat.alpha < 1f)
// {
StartCoroutine(FadeCanvasGroup(hintforChat, hintforChat.alpha, 1f, _hintDuration));
// }
if (hint.alpha < 1f)
{
// if (coroutine_hint != null) StopCoroutine(coroutine_hint);
// coroutine_hint = FadeCanvasGroup(hint, hint.alpha, 1f, _hintDuration);
// StartCoroutine(coroutine_hint);
if (coroutine_hint != null) StopCoroutine(coroutine_hint);
coroutine_hint = BreathFade(hint);
StartCoroutine(coroutine_hint);
}
}
}
public void onHint(string text)
{
Debug.Log("/hint message received: " + text);
// stepText.text = text;
StartCoroutine(TypeWriter(stepText, text));
StartCoroutine(FadeCanvasGroup(hintforStep, hintforStep.alpha, 1f, _hintDuration));
if (coroutine_breath != null) StopCoroutine(coroutine_breath);
// coroutine_hint = FadeCanvasGroup(hint, hint.alpha, text.Length > 0 ? 1f : 0f, _hintDuration);
// StartCoroutine(coroutine_hint);
hintforInput.alpha = 1.0f;
coroutine_breath = BreathFade(hintforStep);
StartCoroutine(coroutine_breath);
}
private IEnumerator BreathFade(CanvasGroup canvasGroup, float maxAlpha=1f, float minAlpha=0.5f,
float fadeInDuration=1.2f, float fadeOutDuration=1.2f, int cycles=20)
{
for (int i = 0; i < cycles; i++)
{
// Fade out
float elapsed = 0f;
while (elapsed < fadeOutDuration)
{
elapsed += Time.deltaTime;
canvasGroup.alpha = Mathf.Lerp(maxAlpha, minAlpha, elapsed / fadeOutDuration);
yield return null;
}
canvasGroup.alpha = minAlpha;
// Fade in
elapsed = 0f;
while (elapsed < fadeInDuration)
{
elapsed += Time.deltaTime;
canvasGroup.alpha = Mathf.Lerp(minAlpha, maxAlpha, elapsed / fadeInDuration);
yield return null;
}
canvasGroup.alpha = maxAlpha;
}
}
public IEnumerator TypeWriter(TextMeshProUGUI textComponent, string message, float typeSpeed = 0.2f)
{
textComponent.text = "";
foreach (char c in message)
{
textComponent.text += c;
yield return new WaitForSeconds(typeSpeed);
}
}
}