AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Script/Manager/AppSceneLoader.cs
ALIENJACK\alien 96d0df5348 UI迭代
2024-08-30 16:23:27 +08:00

91 lines
2.5 KiB
C#

using AxibugEmuOnline.Client.ClientCore;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace AxibugEmuOnline.Client
{
public class AppSceneLoader
{
public LoadTask CurrentTask { get; private set; }
Queue<LoadTask> m_tasks = new Queue<LoadTask>();
Coroutine m_coroutine;
public void BeginLoad(string scenePath, Action callback)
{
m_tasks.Enqueue(new LoadTask(scenePath, callback));
if (m_coroutine == null)
m_coroutine = AppAxibugEmuOnline.StartCoroutine(TaskFlow());
}
private IEnumerator TaskFlow()
{
while (m_tasks.Count > 0)
{
CurrentTask = m_tasks.Dequeue();
while (CurrentTask.MoveNext()) yield return null;
CurrentTask.Callback();
}
CurrentTask = null;
m_coroutine = null;
}
public class LoadTask
{
public EnumTaskState State { get; private set; } = EnumTaskState.Idle;
public float Progress => m_loadingOp != null ? m_loadingOp.progress : 0;
private AsyncOperation m_loadingOp;
private string m_scenePath;
private Action m_callback;
public LoadTask(string scenePath, Action callback)
{
m_scenePath = scenePath;
m_callback = callback;
}
public bool MoveNext()
{
if (State == EnumTaskState.Idle)
{
State = EnumTaskState.Running;
m_loadingOp = SceneManager.LoadSceneAsync(m_scenePath, LoadSceneMode.Single);
return true;
}
else if (State == EnumTaskState.Running)
{
m_loadingOp.allowSceneActivation = true;
if (m_loadingOp.isDone)
{
State = EnumTaskState.Complete;
}
return true;
}
else
{
return false;
}
}
public void Callback()
{
m_callback?.Invoke();
}
}
public enum EnumTaskState
{
Idle,
Running,
Complete
}
}
}