127 lines
3.3 KiB
C#
127 lines
3.3 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using BigSpace.XRCore.Base;
|
|
using UnityEngine;
|
|
using UnityEngine.Video;
|
|
|
|
|
|
namespace BigSpace.XRCore.GameMode
|
|
{
|
|
public class GameModeMgr : MonoSingleton<GameModeMgr>
|
|
{
|
|
private IGameMode _gameMode;
|
|
|
|
[SerializeField]private bool _isOffline = true;
|
|
public bool IsOffline => _isOffline;
|
|
public int NextSceneId = 10000;
|
|
|
|
[SerializeField] private VideoPlayer videoPlayer;
|
|
private bool initialized;
|
|
private bool videoHidden;
|
|
|
|
private void Start()
|
|
{
|
|
//Application.targetFrameRate = 30;
|
|
SceneMgr.Instance.nowSceneId = NextSceneId;
|
|
StartCoroutine(PlayVideoThenInitGameMode());
|
|
|
|
//PicoApi.InitEnterpriseService();
|
|
}
|
|
|
|
private IEnumerator PlayVideoThenInitGameMode()
|
|
{
|
|
if (videoPlayer == null && !TryGetComponent(out videoPlayer))
|
|
{
|
|
InitGameMode();
|
|
yield break;
|
|
}
|
|
|
|
videoPlayer.loopPointReached += OnVideoFinished;
|
|
videoPlayer.errorReceived += OnVideoError;
|
|
|
|
if (!videoPlayer.isPrepared)
|
|
{
|
|
videoPlayer.Prepare();
|
|
while (!videoPlayer.isPrepared)
|
|
{
|
|
yield return null;
|
|
}
|
|
}
|
|
|
|
videoPlayer.Play();
|
|
|
|
float waitToStart = 2f;
|
|
float elapsed = 0f;
|
|
while (!videoPlayer.isPlaying && elapsed < waitToStart)
|
|
{
|
|
elapsed += Time.deltaTime;
|
|
yield return null;
|
|
}
|
|
|
|
float maxDuration = videoPlayer.clip != null ? (float)videoPlayer.clip.length + 1f : 5f;
|
|
elapsed = 0f;
|
|
while (videoPlayer.isPlaying && elapsed < maxDuration)
|
|
{
|
|
elapsed += Time.deltaTime;
|
|
yield return null;
|
|
}
|
|
|
|
Debug.Log("[GameModeMgr] Video finished by coroutine.");
|
|
InitGameMode();
|
|
}
|
|
|
|
private void OnVideoFinished(VideoPlayer _)
|
|
{
|
|
Debug.Log("[GameModeMgr] Video finished event.");
|
|
InitGameMode();
|
|
}
|
|
|
|
private void OnVideoError(VideoPlayer _, string __)
|
|
{
|
|
Debug.LogWarning("[GameModeMgr] Video error, init directly.");
|
|
InitGameMode();
|
|
}
|
|
|
|
private void HideVideoPlayer()
|
|
{
|
|
if (videoHidden || videoPlayer == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
videoHidden = true;
|
|
try
|
|
{
|
|
if (videoPlayer.isPlaying)
|
|
{
|
|
videoPlayer.Stop();
|
|
}
|
|
videoPlayer.gameObject.SetActive(false);
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
private void InitGameMode()
|
|
{
|
|
if (initialized)
|
|
{
|
|
return;
|
|
}
|
|
initialized = true;
|
|
HideVideoPlayer();
|
|
if (videoPlayer != null)
|
|
{
|
|
videoPlayer.loopPointReached -= OnVideoFinished;
|
|
videoPlayer.errorReceived -= OnVideoError;
|
|
}
|
|
|
|
_gameMode = new OfflineMode();
|
|
_gameMode.Initialize();
|
|
}
|
|
}
|
|
}
|
|
|