К содержимому

10. Запуск сэмплов (Samples~)

Пакет поставляет 7 самостоятельных сэмплов в Samples~/. UI-обвязка использует стандартные контролы Unity UI Toolkit (Button, Label, TextField, Toggle, ScrollView) — никакой downstream UI-пакет не требуется.

Требования

  • sus-router + sus-core установлены в проекте
  • UPM Samples импортированы: Window → Package Manager → SusRouter → Samples → Import
  • Сцена с UIDocument (нужен EventSystem)
  • Каждый сэмпл: [RequireComponent(typeof(UIDocument))]

Настройка сцены

  1. Создайте GameObject → Add Component → UIDocument
  2. Add Component → скрипт сэмпла (например, BasicRoutingExample)
  3. GameObject → UI → Event System (если отсутствует)
  4. Play

Обзор

#СэмплВозможности router
1BasicRoutingPush, Replace, Back, Home, CurrentRoute
2KeepAliveKeepAlive=true/false, кэширование
3GuardsBeforeEach, CanEnter, BeforeResolve, redirect
4Modals+TransitionsSusRouterModal (InfoDialog, ConfirmDialog), Fade/Slide, NavigateWithTransition
5Nested+Namedchildren, PushNamed, :id, ?q=, alias, redirect, lazy
6RouteLinkSusRouteLink, Bind(router), router-link-active/exact-active
7FullDemoВСЁ СРАЗУ: KeepAlive, guards, modals, transitions, nested, named, theming

Сэмпл 1: BasicRouting

Скрипт: BasicRoutingExample.cs

Демонстрирует базовую навигацию: Push, Replace, Back, Home, отображение CurrentRoute.

Навигация — UITK tab bar

4 таб-кнопки Button: Home, About, Contact, Settings. Каждый таб делает Push соответствующего пути.

Экраны

  • HomeScreen — приветствие + кнопки навигации + чип маршрута (Label)
  • AboutScreen — описание + SusRouteLink на Home + плейсхолдер картинки
  • ContactScreenTextField'ы + Button отправки
  • SettingsScreenToggle

Кнопки действий

  • Back — UITK Button, управляет навигацией
  • Текущий маршрут показан как чип Label

Ключевой код

csharp
// tab bar navigation
void OnTabChanged(string path)
{
    Router.Push(path);
}

// SusRouteLink
var link = new SusRouteLink { To = "/about", Exact = true };
link.Bind(Router); // enables router-link-active

Сэмпл 2: KeepAlive

Скрипт: KeepAliveExample.cs

Показывает разницу между KeepAlive=true (состояние сохраняется) и false (пересоздаётся).

Навигация — UITK tab bar

3 таба: Counter [K], Form [K], Settings. [K] = KeepAlive=true.

Экраны

  • CounterScreen (KeepAlive) — счётчик + Button +/−. Значение переживает уход/возврат.
  • FormScreen (KeepAlive)TextField'ы. Введённый текст переживает переключение табов.
  • SettingsScreen (NOT KeepAlive)Toggle'ы; пересоздаётся каждый раз.

Ключевой код

csharp
Router.Register("/counter", typeof(CounterScreen),
    new SusRouteConfig { KeepAlive = true });
Router.Register("/settings", typeof(SettingsScreen)); // KeepAlive=false

Сэмпл 3: Guards

Скрипт: GuardsExample.cs

Демонстрирует пайплайн guard'ов.

Навигация — UITK tab bar

4 таба: Home, Admin, Profile, OldAdmin. Авторизация через Toggle "Logged in".

Guards

  • BeforeEach — блокирует маршруты, кроме home, когда пользователь не залогинен
  • AdminGuardISusRouteGuard.CanLeave, когда форма admin изменена (dirty)
  • Redirect/old-admin/admin через SusRouteConfig.Redirect

Экраны

  • HomeScreen — инструкции + кнопки для проверки
  • AdminScreen — форма TextField + confirm-оверлей CanLeave при dirty
  • ProfileScreen — доступен только когда пользователь залогинен

Ключевой код

csharp
Router.BeforeEach((from, to) =>
{
    if (to.FullPath == "/home") return true;
    if (!_isLoggedIn) return false; // block
    return true;
});

Router.Register("/admin", typeof(AdminScreen), new SusRouteConfig
{
    Guard = new AdminGuard()
});

Сэмпл 4: Modals & Transitions

Скрипт: ModalExample.cs

Демонстрирует SusRouterModal, modal-сервис и анимации переходов.

Навигация — UITK tab bar

3 таба: Page 1–3. Навигация с Fade через NavigateWithTransition (опциональный Toggle).

Модалки

  • InfoDialog — информационное сообщение + Button Close
  • ConfirmDialog — подтверждение с Button'ами OK/Cancel

Кнопки действий

  • Open Info / Open Confirm / Stack 3
  • Close TopModalService.Close()

Ключевой код

csharp
// Show modal
Router.ModalService.Show(typeof(InfoDialog), new() {
    ["title"] = "Information",
    ["message"] = "Welcome!"
});

// Navigate with animation
Router.NavigateWithTransition("/page-2", 0.3f);

Сэмпл 5: Nested & Named Routes

Скрипт: AdvancedRoutingExample.cs

Демонстрирует именованные маршруты, вложенные маршруты, alias, redirect, query-параметры, ленивую загрузку.

Навигация — UITK tab bar

5 табов: Main Menu (alias), Battle (:id), Settings (nested), Search (?q=), Lazy.

Возможности

  • Named route/battle/:id, PushNamed с pathParams
  • Alias/menu/main-menu
  • Redirect/old-menu/main-menu
  • Nested/settings/profile, /settings/privacy (tab bar внутри SettingsScreen)
  • Query/search?q=hello&page=1
  • Lazy/lazy, LazyFactory

Ключевой код

csharp
Router.Register("/battle/:id", typeof(BattleScreen), new SusRouteConfig
{
    Name = "battle",
    Transition = SusRouteTransition.SlideLeft()
});

Router.PushNamed("battle", new() { ["id"] = "42" });

// Nested routes
Router.Register("/settings", typeof(SettingsScreen), new SusRouteConfig
{
    Children = new List<SusRouteRecord>
    {
        new SusRouteRecord("profile", typeof(LabelScreen)),
        new SusRouteRecord("privacy", typeof(LabelScreen)),
    }
});

Скрипт: RouteLinkExample.cs

Демонстрирует SusRouteLink с авто-подсветкой.

На экране три инстанса SusRouteLink: Home, Battle, Settings. Каждый автоматически получает классы router-link-active / router-link-exact-active.

Ключевой код

csharp
var homeLink = new SusRouteLink { To = "/home", Exact = true };
homeLink.Bind(Router); // auto-highlight

var battleLink = new SusRouteLink { To = "/battle/42" };
battleLink.Bind(Router);

Точное совпадение тоже доступно:

csharp
var exactLink = new SusRouteLink { To = "/home", Exact = true };
// router-link-exact-active only on exact /home

Сэмпл 7: Full Demo

Скрипт: FullDemoExample.cs

Комплексный сэмпл, объединяющий ВСЕ возможности router + theming.

Layout — sidebar + content

  • Sidebar — вертикальные UITK таб-кнопки Button: Dashboard, Users, Settings, About
  • ContentScrollView + смонтированный route-хост

Возможности

  • KeepAlive: Dashboard / Users
  • Guards: UserDetailGuard на вложенном :id
  • Modals: "Open Modal" → AboutDialog (SusRouterModal)
  • Transitions: Fade между экранами
  • Nested: /users/:id
  • Named: users / user-detail
  • Theming: Toggle Dark + SusThemeService

Ключевой код

csharp
// Sidebar — vertical tab buttons push routes
navTabs.OnChanged += path => Router.Push(path);

// Modal
Router.ModalService.Show(typeof(AboutDialog), new() {
    ["title"] = "About",
    ["message"] = "SusRouter Full Demo"
});

Диагностика неполадок

СимптомПричинаИсправление
Ничего не отображаетсяUIDocument без PanelSettingsНазначьте PanelSettings / сэмпл грузит из Resources
Таб-кнопки ничего не делаютOnChanged не подключёнПривяжите Router.Push в обработчике
Кнопки игнорируют кликиНет EventSystemДобавьте Event System на сцену
PushNamed не находит маршрутНет Name в SusRouteConfigЗадайте Name = "..."
KeepAlive не кэшируетKeepAlive не trueЗадайте KeepAlive = true
router-link-active отсутствуетSusRouteLink без BindВызовите link.Bind(router)
Modal не показываетсяНет OverlayHostrouter.Init(overlayHost)
Redirect loopRedirect указывает сам на себяПроверьте цепочку redirect