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))]
Настройка сцены
- Создайте GameObject → Add Component →
UIDocument - Add Component → скрипт сэмпла (например,
BasicRoutingExample) - GameObject → UI → Event System (если отсутствует)
- Play
Обзор
| # | Сэмпл | Возможности router |
|---|---|---|
| 1 | BasicRouting | Push, Replace, Back, Home, CurrentRoute |
| 2 | KeepAlive | KeepAlive=true/false, кэширование |
| 3 | Guards | BeforeEach, CanEnter, BeforeResolve, redirect |
| 4 | Modals+Transitions | SusRouterModal (InfoDialog, ConfirmDialog), Fade/Slide, NavigateWithTransition |
| 5 | Nested+Named | children, PushNamed, :id, ?q=, alias, redirect, lazy |
| 6 | RouteLink | SusRouteLink, Bind(router), router-link-active/exact-active |
| 7 | FullDemo | ВСЁ СРАЗУ: 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 + плейсхолдер картинки - ContactScreen —
TextField'ы +Buttonотправки - SettingsScreen —
Toggle'ы
Кнопки действий
- Back — UITK
Button, управляет навигацией - Текущий маршрут показан как чип
Label
Ключевой код
// 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'ы; пересоздаётся каждый раз.
Ключевой код
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, когда пользователь не залогинен
- AdminGuard —
ISusRouteGuard.CanLeave, когда форма admin изменена (dirty) - Redirect —
/old-admin→/adminчерезSusRouteConfig.Redirect
Экраны
- HomeScreen — инструкции + кнопки для проверки
- AdminScreen — форма
TextField+ confirm-оверлей CanLeave при dirty - ProfileScreen — доступен только когда пользователь залогинен
Ключевой код
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 — информационное сообщение +
ButtonClose - ConfirmDialog — подтверждение с
Button'ами OK/Cancel
Кнопки действий
- Open Info / Open Confirm / Stack 3
- Close Top —
ModalService.Close()
Ключевой код
// 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
Ключевой код
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)),
}
});Сэмпл 6: RouteLink
Скрипт: RouteLinkExample.cs
Демонстрирует SusRouteLink с авто-подсветкой.
Навигация — SusRouteLink
На экране три инстанса SusRouteLink: Home, Battle, Settings. Каждый автоматически получает классы router-link-active / router-link-exact-active.
Ключевой код
var homeLink = new SusRouteLink { To = "/home", Exact = true };
homeLink.Bind(Router); // auto-highlight
var battleLink = new SusRouteLink { To = "/battle/42" };
battleLink.Bind(Router);Точное совпадение тоже доступно:
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 - Content —
ScrollView+ смонтированный route-хост
Возможности
- KeepAlive: Dashboard / Users
- Guards: UserDetailGuard на вложенном
:id - Modals: "Open Modal" → AboutDialog (
SusRouterModal) - Transitions: Fade между экранами
- Nested:
/users/:id - Named: users / user-detail
- Theming:
ToggleDark +SusThemeService
Ключевой код
// 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 не показывается | Нет OverlayHost | router.Init(overlayHost) |
| Redirect loop | Redirect указывает сам на себя | Проверьте цепочку redirect |