feat: add bootstrap architecture and common utilities for Unity project

- Add GameLifetimeScope for dependency injection with Zenject
- Implement boot flow service with entry point and interfaces
- Create boot state machine (Splash, Menu, Load states)
- Add UI views for boot screens
- Add common services base class and interface
- Implement generic state machine controller
- Add base UI view components and ViewModel interface
- Update SampleScene.unity
- Add BootSettings asset

Добавлена архитектура bootstrap и общие утилиты для Unity проекта:
- Добавлен GameLifetimeScope для внедрения зависимостей (Zenject)
- Реализован сервис потока загрузки с точкой входа и интерфейсами
- Создана машина состояний загрузки (Splash, Menu, Load состояния)
- Добавлены UI представления для экранов загрузки
- Добавлены базовые классы сервисов и интерфейс IService
- Реализован контроллер машины состояний
- Добавлены базовые компоненты UI вида и интерфейс ViewModel
- Обновлена сцена SampleScene.unity
- Добавлен ассет BootSettings
This commit is contained in:
2026-05-27 03:56:38 +07:00
parent 6c46b3043a
commit 4435a2c6b6
57 changed files with 937 additions and 0 deletions
@@ -0,0 +1,9 @@
namespace QuizPleaseTest.Boot.States
{
public enum BootStateCode
{
Splash,
Load,
Menu
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f5555555555555555555555555555555
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,29 @@
using System.Collections.Generic;
using QuizPleaseTest.Common.StateMachine;
namespace QuizPleaseTest.Boot.States
{
public class BootStatesController : StatesController<BootStateCode>
{
public BootStatesController(
SplashState splashState,
LoadState loadState,
MenuState menuState)
: base(CreateStates(splashState, loadState, menuState))
{
}
private static IReadOnlyDictionary<BootStateCode, IState> CreateStates(
SplashState splashState,
LoadState loadState,
MenuState menuState)
{
return new Dictionary<BootStateCode, IState>
{
{ BootStateCode.Splash, splashState },
{ BootStateCode.Load, loadState },
{ BootStateCode.Menu, menuState }
};
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f6666666666666666666666666666666
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+29
View File
@@ -0,0 +1,29 @@
using System.Threading;
using Cysharp.Threading.Tasks;
using QuizPleaseTest.Boot.UI;
using QuizPleaseTest.Common.StateMachine;
namespace QuizPleaseTest.Boot.States
{
public class LoadState : IState
{
private readonly LoadingUIView _view;
public LoadState(LoadingUIView view)
{
_view = view;
}
public UniTask EnterAsync(CancellationToken ct)
{
_view.Initialize();
return UniTask.CompletedTask;
}
public UniTask ExitAsync(CancellationToken ct)
{
_view.Release();
return UniTask.CompletedTask;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f8888888888888888888888888888888
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+29
View File
@@ -0,0 +1,29 @@
using System.Threading;
using Cysharp.Threading.Tasks;
using QuizPleaseTest.Boot.UI;
using QuizPleaseTest.Common.StateMachine;
namespace QuizPleaseTest.Boot.States
{
public class MenuState : IState
{
private readonly MenuUIView _view;
public MenuState(MenuUIView view)
{
_view = view;
}
public UniTask EnterAsync(CancellationToken ct)
{
_view.Initialize();
return UniTask.CompletedTask;
}
public UniTask ExitAsync(CancellationToken ct)
{
_view.Release();
return UniTask.CompletedTask;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f9999999999999999999999999999999
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+29
View File
@@ -0,0 +1,29 @@
using System.Threading;
using Cysharp.Threading.Tasks;
using QuizPleaseTest.Boot.UI;
using QuizPleaseTest.Common.StateMachine;
namespace QuizPleaseTest.Boot.States
{
public class SplashState : IState
{
private readonly SplashUIView _view;
public SplashState(SplashUIView view)
{
_view = view;
}
public UniTask EnterAsync(CancellationToken ct)
{
_view.Initialize();
return UniTask.CompletedTask;
}
public UniTask ExitAsync(CancellationToken ct)
{
_view.Release();
return UniTask.CompletedTask;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f7777777777777777777777777777777
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: