com.alicizax.unity.framework/Runtime/ABase/Service/Unity/AppServiceRoot.cs

74 lines
2.0 KiB
C#
Raw Normal View History

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 = ServiceDomainOrder.App;
2026-03-26 10:49:41 +08:00
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.App);
2026-03-26 10:49:41 +08:00
}
protected virtual void Update()
{
2026-04-20 13:46:44 +08:00
if (AppServices.HasWorld) AppServices.RequireWorld().Tick(Time.deltaTime);
2026-03-26 10:49:41 +08:00
}
protected virtual void LateUpdate()
{
2026-04-20 13:46:44 +08:00
if (AppServices.HasWorld) AppServices.RequireWorld().LateTick(Time.deltaTime);
2026-03-26 10:49:41 +08:00
}
protected virtual void FixedUpdate()
{
2026-04-20 13:46:44 +08:00
if (AppServices.HasWorld) AppServices.RequireWorld().FixedTick(Time.fixedDeltaTime);
2026-03-26 10:49:41 +08:00
}
protected virtual void OnDrawGizmos()
{
2026-04-20 13:46:44 +08:00
if (AppServices.HasWorld) AppServices.RequireWorld().DrawGizmos();
2026-03-26 10:49:41 +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)
{
await UniTask.Yield();
2026-03-26 10:49:41 +08:00
AppServices.Shutdown();
}
2026-03-26 10:49:41 +08:00
}
2026-04-20 13:46:44 +08:00
protected virtual void RegisterAppServices(IServiceRegistry appServices) { }
2026-03-26 10:49:41 +08:00
}
}