Развитие системы растений
This commit is contained in:
1 parent
1b578067f3
commit
ba49ef5015
218 files changed
+70415
-1519
No files matched your search
@@ -5,6 +5,7 @@ using Code.Infrastructure.Configs;
|
||||
using Code.Infrastructure.EventBus;
|
||||
using Code.Infrastructure.Generators;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UnityEngine.AddressableAssets;
|
||||
using UnityEngine.ResourceManagement.AsyncOperations;
|
||||
using UnityEngine.ResourceManagement.ResourceProviders;
|
||||
@@ -12,23 +13,24 @@ using UnityEngine.SceneManagement;
|
||||
|
||||
namespace Code.Infrastructure.SceneLoader
|
||||
{
|
||||
[Config("Configs/SceneConfig",true)]
|
||||
[Config("Configs/SceneConfig", true)]
|
||||
public class SceneInfo
|
||||
{
|
||||
[ToConfig] public AssetReference SceneAsset;
|
||||
[ToConfig] public SceneId SceneId;
|
||||
[ToConfig] public SceneId SceneId;
|
||||
}
|
||||
|
||||
public partial class SceneLoader : IDisposable
|
||||
{
|
||||
private Dictionary<SceneId, SceneInfo> _sceneInfos = new();
|
||||
private Dictionary<SceneId, Action> _scenesActions = new();
|
||||
|
||||
|
||||
private EventBus.EventBus _eventBus;
|
||||
|
||||
partial void SetupScenesInfo();
|
||||
|
||||
|
||||
private AsyncOperationHandle<IList<SceneInfoConfig>> _loadHandle;
|
||||
|
||||
|
||||
public SceneLoader(EventBus.EventBus eventBus, IConfigLocator configLocator)
|
||||
{
|
||||
_eventBus = eventBus;
|
||||
@@ -41,16 +43,17 @@ namespace Code.Infrastructure.SceneLoader
|
||||
if (loadMode == LoadSceneMode.Single)
|
||||
for (var i = 0; i < _loadedScenes.Count; i++)
|
||||
UnloadSceneAsync(_loadedScenes.Keys.ToList()[i]).Forget();
|
||||
|
||||
_loadedScenes.Add(id,Addressables.LoadSceneAsync(_sceneInfos[id].SceneAsset, loadMode));
|
||||
|
||||
|
||||
_loadedScenes.Add(id, Addressables.LoadSceneAsync(_sceneInfos[id].SceneAsset, loadMode));
|
||||
|
||||
await _loadedScenes[id];
|
||||
|
||||
_scenesActions[id]();
|
||||
|
||||
_scenesActions[id]();
|
||||
}
|
||||
|
||||
private Dictionary<SceneId, AsyncOperationHandle<SceneInstance>> _loadedScenes = new();
|
||||
public Scene GetScene(SceneId id) => _loadedScenes[id].Result.Scene;
|
||||
|
||||
public async UniTaskVoid UnloadSceneAsync(SceneId id)
|
||||
{
|
||||
await Addressables.UnloadSceneAsync(_loadedScenes[id]);
|
||||
@@ -61,35 +64,41 @@ namespace Code.Infrastructure.SceneLoader
|
||||
|
||||
private async UniTaskVoid LoadConfigs(string configReferences)
|
||||
{
|
||||
_configHandle = Addressables.LoadAssetsAsync<SceneInfoConfig>(configReferences, OnSceneConfigLoaded, Addressables.MergeMode.Union);
|
||||
|
||||
await _configHandle.ToUniTask();
|
||||
|
||||
SetupScenesInfo();
|
||||
_eventBus.RaiseEvent<ISceneConfigsLoadedHandle>(h => h.SceneConfigsLoaded());
|
||||
if ((await Addressables.LoadResourceLocationsAsync(configReferences).Task).Count != 0)
|
||||
{
|
||||
|
||||
_configHandle = Addressables.LoadAssetsAsync<SceneInfoConfig>(configReferences, OnSceneConfigLoaded,
|
||||
Addressables.MergeMode.Union);
|
||||
|
||||
await _configHandle.ToUniTask();
|
||||
|
||||
SetupScenesInfo();
|
||||
}
|
||||
|
||||
_eventBus.RaiseEvent<ISceneConfigsLoadedHandle>(h => h.SceneConfigsLoaded());
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void OnSceneConfigLoaded(SceneInfoConfig sceneInfoConfig)
|
||||
{
|
||||
SceneInfo sceneInfo = new();
|
||||
sceneInfo.SceneId = sceneInfoConfig.SceneId;
|
||||
sceneInfo.SceneAsset = sceneInfoConfig.SceneAsset;
|
||||
|
||||
|
||||
_sceneInfos.Add(sceneInfoConfig.SceneId, sceneInfo);
|
||||
}
|
||||
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Addressables.Release(_configHandle);
|
||||
if(_configHandle.IsValid()) _configHandle.Release();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public interface ISceneConfigsLoadedHandle : IGlobalSubscriber
|
||||
{
|
||||
void SceneConfigsLoaded();
|
||||
}
|
||||
|
||||
public interface ILoadedSceneHandle : IGlobalSubscriber
|
||||
{
|
||||
void SceneLoaded(SceneId sceneId);
|
||||
|
||||
Reference in new issue
Block a user