using UnityEngine;
using XGame.Framework.Asset;
using XGame.Framework.Asyncs;
namespace XGame.Framework
{
public partial class AppManager : IAppManager
{
private GameObject _go;
private Launch _launch;
private AppStatus _status = AppStatus.Closed;
Transform IAppManager.Root => _go.transform;
///
/// 启动
///
void IAppManager.Start()
{
switch (_status)
{
case AppStatus.Started:
{
Log.Error("AppManager::Start App已启动...");
break;
}
case AppStatus.Restarting:
{
Log.Error("AppManager::Start App正在重启中...");
break;
}
case AppStatus.Closing:
{
Log.Error("AppManager::Start App正在关闭中...");
break;
}
case AppStatus.Closed:
{
DoStart();
_status = AppStatus.Started;
break;
}
default:
break;
}
}
///
/// 重启
///
IAsync IAppManager.Restart()
{
switch (_status)
{
case AppStatus.Started:
{
_status = AppStatus.Restarting;
IAsync assetAsync = Shutdown();
if (assetAsync == null)
{
DoStart();
_status = AppStatus.Started;
}
else
{
assetAsync.Then(a =>
{
DoStart();
_status = AppStatus.Started;
});
}
return assetAsync;
}
case AppStatus.Restarting:
{
Log.Warn("AppManager::Restart App正在重启中....");
return null;
}
case AppStatus.Closing:
{
Log.Warn("AppManager::Restart App正在关闭中....");
return null;
}
case AppStatus.Closed:
{
DoStart();
_status = AppStatus.Started;
return null;
}
default:
return null;
}
}
///
/// 关闭
///
IAsync IAppManager.Close()
{
switch (_status)
{
case AppStatus.Started:
{
_status = AppStatus.Closing;
IAsync assetAsync = Shutdown();
if (assetAsync == null)
_status = AppStatus.Closed;
else
assetAsync.Then(a => _status = AppStatus.Closed);
return assetAsync;
}
case AppStatus.Restarting:
{
Log.Error("AppManager::Close App正在关闭中");
return null;
}
case AppStatus.Closing:
{
Log.Error("AppManager::Close App正在关闭中");
return null;
}
case AppStatus.Closed:
{
Log.Error("AppManager::Close App还未启动...");
return null;
}
default:
return null;
}
}
private void DoStart()
{
_go = new GameObject("Root");
_launch = _go.AddComponent();
Object.DontDestroyOnLoad(_go);
}
private IAsync Shutdown()
{
_status = AppStatus.Closing;
OnShutdown();
return AssetManager.Dispose();
}
private void OnShutdown()
{
_launch?.Dispose();
_launch = null;
if (_go)
{
Object.Destroy(_go);
_go = null;
}
System.GC.Collect();
}
}
}