using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace BITKit.SceneManagement
{
///
/// 场景服务,负责场景的加载和卸载
///
public interface ISceneService
{
///
/// 在场景加载完成后,是否初始化主场景
///
bool InitializeMainSceneOnLoad { get; }
string[] GetScenes(params string[] tags);
///
/// 加载场景
///
/// 场景名称,通常为AddressablePath
/// 取消令牌
/// 加载模式
/// 加载完成后激活
///
public UniTask LoadSceneAsync(string sceneName,CancellationToken cancellationToken, LoadSceneMode loadSceneMode = LoadSceneMode.Additive, bool activateOnLoad = true);
public UniTask UnloadSceneAsync(string sceneName,CancellationToken cancellationToken);
///
/// 开始加载场景的回调
///
event Action OnLoadScene;
///
/// 加载场景进度的回调
///
event Action OnSceneLoadProgress;
///
/// 场景加载完成的回调
///
event Action OnSceneLoaded;
///
/// 当开始卸载场景时
///
event Action OnUnloadScene;
///
/// 当场景卸载完成时
///
event Action OnSceneUnloaded;
}
///
/// 场景服务代理实现,主要用于快速继承
///
public abstract class SceneServiceImplement:ISceneService
{
private ISceneService _sceneServiceImplementation1 => _sceneServiceImplementation;
protected abstract ISceneService _sceneServiceImplementation { get; }
public bool InitializeMainSceneOnLoad => _sceneServiceImplementation.InitializeMainSceneOnLoad;
public string[] GetScenes(params string[] tags)=> _sceneServiceImplementation.GetScenes(tags);
public UniTask LoadSceneAsync(string sceneName,CancellationToken cancellationToken, LoadSceneMode loadSceneMode = LoadSceneMode.Additive,
bool activateOnLoad = true)
{
return _sceneServiceImplementation.LoadSceneAsync(sceneName,cancellationToken, loadSceneMode, activateOnLoad);
}
public UniTask UnloadSceneAsync(string sceneName, CancellationToken cancellationToken)
{
return _sceneServiceImplementation1.UnloadSceneAsync(sceneName, cancellationToken);
}
public event Action OnLoadScene
{
add => _sceneServiceImplementation.OnLoadScene += value;
remove => _sceneServiceImplementation.OnLoadScene -= value;
}
public event Action OnSceneLoadProgress
{
add => _sceneServiceImplementation.OnSceneLoadProgress += value;
remove => _sceneServiceImplementation.OnSceneLoadProgress -= value;
}
public event Action OnSceneLoaded
{
add => _sceneServiceImplementation.OnSceneLoaded += value;
remove => _sceneServiceImplementation.OnSceneLoaded -= value;
}
public event Action OnUnloadScene
{
add => _sceneServiceImplementation1.OnUnloadScene += value;
remove => _sceneServiceImplementation1.OnUnloadScene -= value;
}
public event Action OnSceneUnloaded
{
add => _sceneServiceImplementation1.OnSceneUnloaded += value;
remove => _sceneServiceImplementation1.OnSceneUnloaded -= value;
}
}
}