Files
cneicy ee385a4107
Publish UPM package / publish (push) Failing after 1s
chore: initialize standalone UPM package
2026-08-26 02:48:49 +08:00

82 lines
3.1 KiB
C#

#nullable enable
using System;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace ShrinkApp
{
public static class ShrinkApp
{
public static ShrinkAppHost? Host { get; private set; }
public static ShrinkAppContext? Context { get; private set; }
public static ShrinkAppSettings Settings => ShrinkAppSettings.Instance;
public static ShrinkAppServices Services => Context?.Services ?? throw new System.InvalidOperationException("ShrinkApp is not initialized.");
public static bool IsRunning => (Host != null && Host.IsRunning) || _externalHostRunning;
private static bool _externalHostRunning;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
private static void ResetStaticState()
{
Host = null;
Context = null;
_externalHostRunning = false;
ShrinkAppSettings.ResetCachedInstance();
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void Bootstrap()
{
if (Host != null)
return;
var settings = ShrinkAppSettings.Instance;
if (settings.hostingMode == ShrinkAppHostingMode.ContextLoader)
{
// 阶段 2 过渡:经典宿主让位,由 ShrinkContext 加载器宿主(ShrinkContext.AppAdapter)接管启动
return;
}
var hostGameObject = new GameObject("ShrinkAppHost");
var host = hostGameObject.AddComponent<ShrinkAppHost>();
if (settings.dontDestroyOnLoad)
UnityEngine.Object.DontDestroyOnLoad(hostGameObject);
var services = new ShrinkAppServices();
var context = new ShrinkAppContext(host, settings, services);
host.Configure(context);
Host = host;
Context = context;
host.StartAppAsync().Forget(ex =>
{
Debug.LogException(ex);
Debug.LogError("[ShrinkApp] 启动失败: " + ex.Message);
});
}
/// <summary>
/// 阶段 2 过渡:由外部宿主(如 ShrinkContext 加载器宿主)提供已初始化的服务容器。
/// Host 保持 null——外部宿主不经过 ShrinkAppHost 生命周期,IsRunning 以外部宿主为准。
/// </summary>
public static void InitializeForExternalHost(ShrinkAppServices services, ShrinkAppSettings? settings = null)
{
if (services == null)
throw new ArgumentNullException(nameof(services));
Context = new ShrinkAppContext(null!, settings ?? Settings, services);
_externalHostRunning = false;
}
/// <summary>
/// Lets a non-<see cref="ShrinkAppHost"/> orchestrator expose its lifecycle through
/// the legacy static facade while the migration is in progress.
/// </summary>
public static void SetExternalHostRunning(bool running)
{
_externalHostRunning = running;
}
}
}