Перейти к основному содержимому

Быстрый старт

Пошаговое руководство по началу работы с Aspid.MVVM: от установки до первого работающего примера.

Содержание


Требования

  • Unity 2022.3 или новее

  • .NET Standard 2.0 (целевая платформа фреймворка)

  • Поддержка Source Generators в Unity (встроена с 2022.3+)

Установка

Из Unity Asset Store

  1. Откройте страницу Aspid.MVVM в Unity Asset Store

  2. Импортируйте пакет в ваш проект

  3. Убедитесь, что папка Assets/Aspid/MVVM/ создана

Из исходного кода

git clone https://github.com/VPDPersonal/Aspid.MVVM.git
cd Aspid.MVVM
git submodule update --init --recursive

Важно: Проект использует 5 git-подмодулей. Без git submodule update --init --recursive код не скомпилируется.


Обучающий маршрут

Каждый шаг добавляет ровно одну новую концепцию:

#ПримерНовоеТуториал
1Counter[ViewModel], [Bind], [RelayCommand], ViewInitializerCounter
2GreeterMonoViewModel, [TwoWayBind], [BindAlso], On*ChangedGreeter
3Bind Modesчетыре режима на одном экране, свой ITwoWayConverterBind Modes
4Statsкоманды с параметром, CanExecute, черновик → модельStats
5Todo Listмодель, ObservableList, CreateSync, коллекционные биндерыTodo List
6Custom Binderбиндер для своего компонента, [GenerateSerializableBinder]Custom Binder

Первый пример: Counter

Кнопка увеличивает счётчик, число отображается в тексте. Это минимальный пример, демонстрирующий три ключевые концепции фреймворка.

Шаг 1: ViewModel

ViewModel содержит данные и логику. Source Generator генерирует весь код привязки автоматически.

using Aspid.MVVM;

// [ViewModel] — маркер для Source Generator.
// Класс обязательно должен быть partial.
[ViewModel]
public sealed partial class CounterViewModel
{
// [OneWayBind] — данные идут только из ViewModel во View (только чтение для UI).
// Source Generator создаст свойство Count, метод SetCount и событие CountChanged.
[OneWayBind] private int _count;

// [RelayCommand] — Source Generator создаст свойство IncrementCommand типа IRelayCommand.
[RelayCommand]
private void Increment() => SetCount(Count + 1);
}

Что генерирует Source Generator из этого кода:

Исходный кодГенерируется
[ViewModel] на классеРеализация IViewModel, метод FindBindableMember
[OneWayBind] int _countСвойство Count, метод SetCount(int), событие CountChanged
[RelayCommand] void Increment()Свойство IncrementCommand типа IRelayCommand

Шаг 2: View

View описывает, какие биндеры и к каким данным ViewModel подключить.

using UnityEngine;
using Aspid.MVVM;

// [View] — маркер для Source Generator.
// Класс обязательно должен быть partial.
[View]
public sealed partial class CounterView : MonoView
{
// Имя поля _count совпадает с именем поля в ViewModel.
// Source Generator связывает их автоматически по имени.
[SerializeField] private MonoBinder _count;

// Массив биндеров — удобно когда несколько UI-элементов выполняют одно действие.
[SerializeField] private MonoBinder[] _increment;
}

Правило именования: Имя поля View (без префикса _, m_, s_) должно совпадать с именем поля ViewModel. _count → привязывается к Count.

Шаг 3: Bootstrap

Bootstrap соединяет View и ViewModel:

using UnityEngine;
using Aspid.MVVM;

public sealed class Bootstrap : MonoBehaviour
{
[SerializeField] private CounterView _counterView;

private void Awake()
{
var viewModel = new CounterViewModel();
_counterView.Initialize(viewModel);
}

private void OnDestroy()
{
_counterView.DeinitializeView()?.DisposeViewModel();
}
}

Шаг 4: Настройка в Inspector

  1. Создайте GameObject с компонентом CounterView

  2. Добавьте дочерний объект с компонентом TextMonoBinder — перетащите в поле _count

  3. Добавьте дочерний объект с Button и компонентом ButtonCommandMonoBinder — перетащите в массив _increment

  4. На Bootstrap-объекте назначьте ссылку на CounterView


Как это работает

После вызова view.Initialize(viewModel):

  1. View перебирает биндеры и вызывает viewModel.FindBindableMember(id) для каждого

  2. ViewModel (сгенерированный код) находит нужный BindableMember по ID без рефлексии

  3. Binder регистрируется и получает текущее значение

  4. При изменении Count через SetCount() — биндер автоматически обновляет Text

  5. При нажатии кнопки — ButtonCommandMonoBinder вызывает IncrementCommand.Execute()

ViewModel ──► BindableMember ──► Binder ──► UI
(без рефлексии, прямые вызовы)

Source Generator создаёт прямые вызовы на этапе компиляции — без рефлексии и без аллокаций.


Следующие шаги

  • Counter — полный туториал с деталями по биндерам

  • Greeter — двусторонний биндинг: InputField → Text в реальном времени

  • TodoItem — отдельная Model, IDisposable, несколько типов биндинга

  • Архитектура — детальное описание конвейера привязки

  • Режимы привязки — OneWay, TwoWay, OneTime, OneWayToSource

  • StarterKit — все готовые биндеры для Unity UI