ServerCanvasManager.cs 3.69 KB
using UnityEngine;
using System.Collections;

public class ServerCanvasManager : Singleton<ServerCanvasManager>
{
    public AVProWindowsMediaMovie movieScript;
    public AVProWindowsMediaMovie timeoutMovie;
    public CanvasGroup movieLoadingCanvas;
    public CanvasGroup inUseCanvas;
    public CanvasGroup timeoutCanvas;
    public CanvasGroup videoCanvas;
    public float tweenTime;
    public float appTimeout;

    void Start()
    {
        inUseCanvas.alpha = 1;
        timeoutCanvas.alpha = 0;
        videoCanvas.alpha = 0;
        StartCoroutine(AppTimeout());
    }

    private bool _videoPlaying = false;
    private float _timeout = 0;
    private bool _didTimeout = false;

    private IEnumerator AppTimeout()
    {
        while(true)
        {
            _timeout = 0;
            _didTimeout = false;

            while (!_videoPlaying)
            {
                if (!_didTimeout)
                    _timeout += Time.deltaTime;

                if (_timeout >= appTimeout && !_didTimeout)
                {
                    _didTimeout = true;

                    AppManager.Instance.TweenCanvasGroup(inUseCanvas, 0, tweenTime);
                    AppManager.Instance.TweenCanvasGroup(timeoutCanvas, 1, tweenTime);

                    foreach (NetworkUser user in FindObjectsOfType<NetworkUser>())
                        user.RpcTimeout();

                    movieScript.UnloadMovie();
                    timeoutMovie.UnloadMovie();
                    timeoutMovie.LoadMovie(true);
                }

                yield return null;
            }

            yield return null;
        }
    }

    public void ResetTimer()
    {
        if (_videoPlaying) return;

        _timeout = 0;

        if (!_didTimeout) return;

        AppManager.Instance.TweenCanvasGroup(inUseCanvas, 1, tweenTime);
        AppManager.Instance.TweenCanvasGroup(timeoutCanvas, 0, tweenTime);

        Invoke("UnloadTimeoutMovie", tweenTime);

        _didTimeout = false;
    }

    private void UnloadTimeoutMovie()
    {
        timeoutMovie.UnloadMovie();
    }

    private Coroutine movieCoroutine;

    public void LoadMovie(string filename)
    {
        //timeoutMovie.UnloadMovie();
        //movieScript.UnloadMovie();

        //movieScript._filename = filename;
        //movieScript.LoadMovie(true);

        if (movieCoroutine != null)
            StopCoroutine(movieCoroutine);

        movieCoroutine = StartCoroutine(MoviePlaying(filename));
    }

    private IEnumerator MoviePlaying(string filename)
    {
        if (videoCanvas.alpha == 0)
            movieLoadingCanvas.alpha = 1;
        else
            AppManager.Instance.TweenCanvasGroup(movieLoadingCanvas, 1, 0.2f);

        AppManager.Instance.TweenCanvasGroup(videoCanvas, 1, tweenTime);

        yield return new WaitForSeconds(0.2f);

        timeoutMovie.UnloadMovie();
        movieScript.UnloadMovie();

        movieScript._filename = filename;
        movieScript.LoadMovie(false);

        yield return new WaitForSeconds(1);
        movieScript.Play();
        AppManager.Instance.TweenCanvasGroup(movieLoadingCanvas, 0, 0.8f);


        StopCoroutine("AppTimeout");

        _videoPlaying = true;
        //TweenCanvasGroup(inUseCanvas, 0, tweenTime);
        //TweenCanvasGroup(timeoutCanvas, 0, tweenTime);

        float holdTime = movieScript.MovieInstance.DurationSeconds - tweenTime;

        yield return new WaitForSeconds(holdTime);

        AppManager.Instance.TweenCanvasGroup(videoCanvas, 0, tweenTime);
        AppManager.Instance.TweenCanvasGroup(inUseCanvas, 1, tweenTime);

        yield return new WaitForSeconds(tweenTime);

        _videoPlaying = false;
        movieScript.UnloadMovie();

        StartCoroutine("AppTimeout");
    }
}