Skip to content

gggittt/merge2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Game rules Features TODO Архитектура Naming My codestyle

merge2

В коде точки входа:

  1. Infrastructure: _Project/Core/Infrastructure/Bootstrapper.cs
  2. Запуск логики игры на геймплей сцене: _Project/Core/EntryPointGameplay.cs

Game rules

Merge items of same value together

Features

  • Ячейки создаются в runtime. До начала игры в объекте GameData можно настроить размер поля

  • Перемещение объектов по игровому полю.

  • [Code] Декомпозированность логики. Зависимости из ProjectContext отделены от SceneContext и логики геймплея. Можно запустить игру не с Bootstrap сцены, а сразу с Gameplay, и всё будет верно работать. В геймплей контексте то что необходимо и достаточно для игры. На видео ниже виден warning "загружено без Project контекста".

  • Объединение предметов по общему признаку

Unity_9tpo4WbnLN.mp4
  • Кнопка для генерации случайного предмета в случайную ячейку поля
Unity_X8KR1jMWe2.mp4
  • Обработка переполнения поля

  • Обработка переполнения цепочки предметов (последний предмет в цепочке не должен объединяться).

Unity_j1zFXs2IhH.mp4
  • "Форма" предметов выбирается в [Flags] enum ShapeType. Т.е. можно выбрать сразу >1, или даже джокер сразу всех форм, который может сливаться с любой "формой", должно сразу работать (но не забыть под это сделать спрайты). image
    • Сейчас добавлены только одноФормовые фигуры.
    • Втащил фичу с прошлого своего пет проекта.

Архитектура

  • по идее запускать с Bootstrap scene, но заработает и сразу с Gameplay scene для теста только геймлея (т.к. Zenject инсталлеры разбиты по контекстам).
  • довольно объемная папка Shared.Extensions - большинство методов мои, но в проекте они не все нужны.
    • Вынесены отдельно из Core, чтобы можно было использовать методы расширения и для EditorTools и Tests при наличии разбиения проекта на сборки.asmdef. Pool отдельно для этой же цели, т.к. может понадобится в Editor папке.
  • в _Project\Editor лежат полезные EditorTools.
    • Добавил кнопки в Toolbar для запуска сцен из любого места проекта. Bootstrap / Gameplay image

Использованные плагины

  • Zenject
  • DoTween
  • TMP
  • Odin

Использованные паттерны

  • FSN
  • ObjectsPool
  • Observer
  • EntryPoint
  • Factory
  • Template method

Todo

  • уменьшить связанность, использовать интерфейсы.
  • 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
    • ...

My codestyle

  • Подстроюсь под стиль кода команды.

Для фикса codestyle всего проекта под себя, в Rider:

  1. Ctrl+e, Ctrl+c (Reformat and Cleanup Code)
  2. Настроить свой стиль (Select Profile)
    • в том числе можно настроить сортировку членов типа. Что будет выше nested types, приватные поля, конструкторы, индексаторы и т.п.
      • применится не при печатании, а при Ctrl+e, Ctrl+c (Reformat and Cleanup Code) или Ctrl+Alt+Enter (Reformat Code)
  3. Выбрать настроенный стиль. Есть преднастроенные (см слева Profile: Full Cleanup, Reformat, ...) image
  4. Select Scope -> Whole Solution
  5. Run

Описание стиля в текущем проекте. (Подстроюсь под codestyle будущей команды, перезапишу свои привычки)

  • Не делаю отступ для namespace. Будет проще перейти на фичу C# 10 "File scoped namespaces", когда нет отступа для types.
    • image
    • Настраивается в Rider: убрать галочку здесь:
    • image
    • Возможно стоит добавить _Project в "no namespace provider". А может и нет, т.к. тогда появляется вероятность что мои namespaces Будут конфликтовать с namespaces внешних плагинов
  • Не пишу очевидный private
  • prefer Type over var. Т.к. при чтении кода в начале строки глаза сразу ищут тип.
  • внутри круглых скобок пишу пробелы. Мне так чуть лучше читается код. Без пробелов как будто бы "(" похожа на что-то среднее между "C" и l. настраивается здесь:
    • image

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors