78 lines
2.2 KiB
C#
78 lines
2.2 KiB
C#
using System;
|
|
using System.Threading;
|
|
using RebootKit.Engine.Foundation;
|
|
using UnityEngine;
|
|
|
|
namespace RebootKit.Engine.Services.Game {
|
|
public abstract class GameModeAsset : FactoryAsset<GameMode> {
|
|
[field: SerializeField]
|
|
public GameMode.Config GameModeConfig { get; private set; }
|
|
|
|
public override GameMode Create(DIContext context) {
|
|
GameMode gameMode = new(GameModeConfig);
|
|
context.Inject(gameMode);
|
|
ConfigureGameMode(gameMode);
|
|
return gameMode;
|
|
}
|
|
|
|
public abstract void ConfigureGameMode(GameMode gameMode);
|
|
}
|
|
|
|
public class GameMode : IDisposable {
|
|
[Serializable]
|
|
public class Config {
|
|
public ControllerAsset[] controllers;
|
|
}
|
|
|
|
readonly Config m_Config;
|
|
readonly ControllersManager<IController> m_Controllers;
|
|
|
|
readonly CancellationTokenSource m_DestroyCancellationTokenSource;
|
|
|
|
[Inject] DIContext m_DIContext;
|
|
bool m_IsRunning;
|
|
|
|
public GameMode(Config config) {
|
|
m_Config = config;
|
|
m_IsRunning = false;
|
|
|
|
m_DestroyCancellationTokenSource = new CancellationTokenSource();
|
|
m_Controllers = new ControllersManager<IController>(m_DestroyCancellationTokenSource.Token);
|
|
}
|
|
|
|
public void Dispose() {
|
|
m_DestroyCancellationTokenSource.Cancel();
|
|
m_Controllers.Dispose();
|
|
}
|
|
|
|
public async Awaitable<bool> Start(CancellationToken cancellationToken) {
|
|
m_Controllers.Add(m_Config.controllers, m_DIContext);
|
|
await m_Controllers.Start(cancellationToken);
|
|
|
|
m_IsRunning = true;
|
|
return true;
|
|
}
|
|
|
|
public void Stop() {
|
|
m_IsRunning = false;
|
|
|
|
m_Controllers.Stop();
|
|
}
|
|
|
|
public void Tick() {
|
|
m_Controllers.Tick();
|
|
}
|
|
|
|
public void AddController(IController controller) {
|
|
m_Controllers.Add(controller);
|
|
}
|
|
|
|
public T FindController<T>() where T : class, IController {
|
|
if (m_Controllers.TryFind<T>(out T controller)) {
|
|
return controller;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
} |