Files
RebootKit/Runtime/Engine/Code/Services/Simulation/WorldService.cs
2025-04-14 23:22:38 +02:00

67 lines
2.2 KiB
C#

using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using RebootKit.Engine.Foundation;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceProviders;
using UnityEngine.SceneManagement;
namespace RebootKit.Engine.Services.Simulation {
public class WorldService : IService {
readonly List<Actor> m_Actors = new();
WorldConfig m_Config;
public void Dispose() {
KillAllActors();
}
public async UniTask Load(WorldConfig worldConfig) {
m_Config = worldConfig;
AsyncOperationHandle<SceneInstance> handle = worldConfig.mainScene.LoadSceneAsync(LoadSceneMode.Additive, false);
await handle.ToUniTask();
await handle.Result.ActivateAsync();
SceneManager.SetActiveScene(handle.Result.Scene);
foreach (GameObject root in handle.Result.Scene.GetRootGameObjects()) {
foreach (Actor actor in root.GetComponentsInChildren<Actor>()) {
RegisterActor(actor);
}
}
}
public async UniTask<TActor> SpawnActor<TActor>(AssetReferenceT<GameObject> asset, CancellationToken cancellationToken) where TActor : Actor {
GameObject gameObject = await Addressables.InstantiateAsync(asset);
if (cancellationToken.IsCancellationRequested) {
asset.ReleaseInstance(gameObject);
return null;
}
if (gameObject.TryGetComponent(out TActor actor)) {
return actor;
}
asset.ReleaseInstance(gameObject);
return null;
}
public void RegisterActor(Actor actor) {
m_Actors.Add(actor);
}
public void KillActor(Actor actor) {
Addressables.ReleaseInstance(actor.gameObject);
}
public void KillAllActors() {
foreach (Actor actor in m_Actors) {
Addressables.ReleaseInstance(actor.gameObject);
}
m_Actors.Clear();
}
}
}