| Game rules | Features | TODO | Архитектура | Naming | My codestyle |
|---|
- Infrastructure: _Project/Core/Infrastructure/Bootstrapper.cs
- Запуск логики игры на геймплей сцене: _Project/Core/EntryPointGameplay.cs
Merge items of same value together
-
Ячейки создаются в runtime. До начала игры в объекте GameData можно настроить размер поля
-
Перемещение объектов по игровому полю.
-
[Code] Декомпозированность логики. Зависимости из ProjectContext отделены от SceneContext и логики геймплея. Можно запустить игру не с Bootstrap сцены, а сразу с Gameplay, и всё будет верно работать. В геймплей контексте то что необходимо и достаточно для игры. На видео ниже виден warning "загружено без Project контекста".
-
Объединение предметов по общему признаку
Unity_9tpo4WbnLN.mp4
- Кнопка для генерации случайного предмета в случайную ячейку поля
Unity_X8KR1jMWe2.mp4
-
Обработка переполнения поля
-
Обработка переполнения цепочки предметов (последний предмет в цепочке не должен объединяться).
Unity_j1zFXs2IhH.mp4
- "Форма" предметов выбирается в [Flags] enum ShapeType. Т.е. можно выбрать сразу >1, или даже джокер сразу всех форм, который может сливаться с любой "формой", должно сразу работать (но не забыть под это сделать спрайты).
- Сейчас добавлены только одноФормовые фигуры.
- Втащил фичу с прошлого своего пет проекта.
- по идее запускать с Bootstrap scene, но заработает и сразу с Gameplay scene для теста только геймлея (т.к. Zenject инсталлеры разбиты по контекстам).
- довольно объемная папка Shared.Extensions - большинство методов мои, но в проекте они не все нужны.
- Вынесены отдельно из Core, чтобы можно было использовать методы расширения и для EditorTools и Tests при наличии разбиения проекта на сборки.asmdef. Pool отдельно для этой же цели, т.к. может понадобится в Editor папке.
- в _Project\Editor лежат полезные EditorTools.
- Zenject
- DoTween
- TMP
- Odin
- FSN
- ObjectsPool
- Observer
- EntryPoint
- Factory
- Template method
- уменьшить связанность, использовать интерфейсы.
- add .asmdef's
- центрировать камеру в runtime под размер поля.
- вынести в конфиги настройки (из [SerializeField] монобехов):
- размер поля
- maxItemLevel
- shapes amount
- вместо монобехов сделать POCO и CompositionRoot. Сейчас сильная связанность (в компонентах Item, через RequireComponent).
- Исправить систематическое нарушение Law of Demeter в связке cell-item, по типу
cell.HoldedItem.MergeLevel.Set - refactor Cell to
- GridCell : DropZone
- PassItemForQuestZone : DropZone
- refactor Item: заменить enum на наследование? Проще будет настраивать [Flags] enum ShapeType
- Sword : Item
- Shoe : Item
- ...
- Подстроюсь под стиль кода команды.
Для фикса codestyle всего проекта под себя, в Rider:
Ctrl+e, Ctrl+c(Reformat and Cleanup Code)- Настроить свой стиль (Select Profile)
- в том числе можно настроить сортировку членов типа. Что будет выше nested types, приватные поля, конструкторы, индексаторы и т.п.
-
- применится не при печатании, а при
Ctrl+e, Ctrl+c(Reformat and Cleanup Code) илиCtrl+Alt+Enter(Reformat Code)
- применится не при печатании, а при
- Выбрать настроенный стиль. Есть преднастроенные (см слева Profile: Full Cleanup, Reformat, ...)

- Select Scope -> Whole Solution
- Run
Описание стиля в текущем проекте. (Подстроюсь под codestyle будущей команды, перезапишу свои привычки)
- Не делаю отступ для namespace. Будет проще перейти на фичу C# 10 "File scoped namespaces", когда нет отступа для types.
- Не пишу очевидный private
- prefer Type over var. Т.к. при чтении кода в начале строки глаза сразу ищут тип.
- внутри круглых скобок пишу пробелы. Мне так чуть лучше читается код. Без пробелов как будто бы "(" похожа на что-то среднее между "C" и l. настраивается здесь:
