2026-03-26 16:14:05 +08:00
|
|
|
using Cysharp.Threading.Tasks;
|
2026-03-26 10:49:41 +08:00
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
namespace AlicizaX
|
|
|
|
|
{
|
|
|
|
|
[DefaultExecutionOrder(-32000)]
|
|
|
|
|
[DisallowMultipleComponent]
|
|
|
|
|
public class AppServiceRoot : MonoBehaviour
|
|
|
|
|
{
|
|
|
|
|
private static AppServiceRoot s_activeRoot;
|
|
|
|
|
|
|
|
|
|
[SerializeField] private bool _dontDestroyOnLoad = true;
|
|
|
|
|
[SerializeField] private int _appScopeOrder = -10000;
|
|
|
|
|
|
|
|
|
|
private bool _ownsWorld;
|
|
|
|
|
|
|
|
|
|
protected virtual void Awake()
|
|
|
|
|
{
|
|
|
|
|
if (s_activeRoot != null && s_activeRoot != this)
|
|
|
|
|
{
|
|
|
|
|
enabled = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s_activeRoot = this;
|
|
|
|
|
|
|
|
|
|
if (_dontDestroyOnLoad)
|
|
|
|
|
DontDestroyOnLoad(gameObject);
|
|
|
|
|
|
|
|
|
|
var createdWorld = !AppServices.HasWorld;
|
|
|
|
|
var world = AppServices.EnsureWorld(_appScopeOrder);
|
|
|
|
|
_ownsWorld = createdWorld;
|
|
|
|
|
|
|
|
|
|
if (createdWorld)
|
|
|
|
|
RegisterAppServices(world.AppScope);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual void Update()
|
|
|
|
|
{
|
|
|
|
|
if (AppServices.HasWorld) AppServices.World.Tick(Time.deltaTime);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual void LateUpdate()
|
|
|
|
|
{
|
|
|
|
|
if (AppServices.HasWorld) AppServices.World.LateTick(Time.deltaTime);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual void FixedUpdate()
|
|
|
|
|
{
|
|
|
|
|
if (AppServices.HasWorld) AppServices.World.FixedTick(Time.fixedDeltaTime);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual void OnDrawGizmos()
|
|
|
|
|
{
|
|
|
|
|
if (AppServices.HasWorld) AppServices.World.DrawGizmos();
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-26 16:14:05 +08:00
|
|
|
protected virtual async void OnDestroy()
|
2026-03-26 10:49:41 +08:00
|
|
|
{
|
|
|
|
|
if (s_activeRoot == this)
|
|
|
|
|
s_activeRoot = null;
|
|
|
|
|
|
|
|
|
|
if (_ownsWorld && AppServices.HasWorld)
|
2026-03-26 16:14:05 +08:00
|
|
|
{
|
|
|
|
|
await UniTask.Yield();
|
2026-03-26 10:49:41 +08:00
|
|
|
AppServices.Shutdown();
|
2026-03-26 16:14:05 +08:00
|
|
|
}
|
|
|
|
|
|
2026-03-26 10:49:41 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual void RegisterAppServices(ServiceScope appScope) { }
|
|
|
|
|
}
|
|
|
|
|
}
|