Files
project-entity/Assets/_Project/Develop/Runtime/Utilities/SceneManagement/SceneSwitcherService.cs
2026-02-18 23:02:28 +05:00

56 lines
1.8 KiB
C#

using Assets._Project.Develop.Runtime.Infrastructure;
using Assets._Project.Develop.Runtime.Infrastructure.DI;
using Assets._Project.Develop.Runtime.Utilities.LoadingScreen;
using System;
using System.Collections;
using UnityEngine;
using Object = UnityEngine.Object;
namespace Assets._Project.Develop.Runtime.Utilities.SceneManagement
{
public class SceneSwitcherService
{
private readonly SceneLoaderService _sceneLoaderService;
private readonly ILoadingScreen _loadingScreen;
private readonly DIContainer _projectContainer;
private DIContainer _currentSceneContainer;
public SceneSwitcherService(
SceneLoaderService sceneLoaderService,
ILoadingScreen loadingScreen,
DIContainer projectContainer)
{
_sceneLoaderService = sceneLoaderService;
_loadingScreen = loadingScreen;
_projectContainer = projectContainer;
}
public IEnumerator ProcessSwitchTo(string sceneName, IInputSceneArgs sceneArgs = null)
{
_loadingScreen.Show();
_currentSceneContainer?.Dispose();
yield return _sceneLoaderService.LoadAsync(Scenes.Empty);
yield return _sceneLoaderService.LoadAsync(sceneName);
SceneBootstrap sceneBootstrap = Object.FindObjectOfType<SceneBootstrap>();
if (sceneBootstrap == null)
throw new NullReferenceException(nameof(sceneBootstrap) + " not found");
_currentSceneContainer = new DIContainer(_projectContainer);
sceneBootstrap.ProcessRegistrations(_currentSceneContainer, sceneArgs);
_currentSceneContainer.Initialize();
yield return sceneBootstrap.Initialize();
_loadingScreen.Hide();
sceneBootstrap.Run();
}
}
}