feat(frontend): esqueleto CommonUI de MainMenu (boot→login→lobby)
Estrutura principal de front-end estilo Lyra portada para C++ proprio do ZMMO (sem CommonGame), seguindo o padrao C++ Abstract -> WBP concreto: - EZMMOFrontEndState / EZMMOLobbyPage e GameplayTags UI.Layer.* nativos - UUIActivatableScreen_Base: base de tela (input config, hook de tema, voltar) espelhando o padrao de UUIButton_Base - UUIPrimaryGameLayout_Base: switch principal (4 stacks CommonUI/camada) - UUIManagerSubsystem (LocalPlayer): dono do root layout, idempotente - UUIFrontEndFlowSubsystem (GameInstance): maquina de estados + driver de rede (Boot->Connecting->Login->ServerSelect->Lobby->EnteringWorld ->InWorld); Lobby e o hub logado, paginas internas = EZMMOLobbyPage - UUIFrontEndScreenSet (DataAsset): mapa estado->tela, forge-ready - AZMMOFrontEndGameMode + AZMMOFrontEndPlayerController - GameInstance: bAutoConnectOnStart=false (conexao dirigida pelo fluxo) - Build.cs: +GameplayTags; ARQUITETURA.md PR-first (s2.1/2.2/3.3/4.8/5) - Assets: L_FrontEnd (GameMode via World Settings), WBP_PrimaryGameLayout, DA_FrontEndScreenSet; Config wiring WBPs de pagina (Boot/Login/...) virao do Zeus UMG Forge depois (s4.8). Smoke test PIE OK: root layout no viewport, fluxo Boot->Connecting, no-op+log para telas nao configuradas, sem crash. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -203,10 +203,16 @@ Content/
|
||||
│ │ ├── Environment/ ← Architecture/ Nature/ Props/
|
||||
│ │ └── Interactables/ ← baús, portas, warps, recursos
|
||||
│ │
|
||||
│ ├── Maps/ ← mapas que NÃO são de mundo
|
||||
│ │ └── FrontEnd/ ← L_FrontEnd (boot/menu; GameMode via
|
||||
│ │ World Settings = AZMMOFrontEndGameMode)
|
||||
│ │
|
||||
│ ├── UI/ ← HUD, Login, CharacterSelect, Inventory,
|
||||
│ │ │ Chat, Party, Guild, Trade, Quest, Map,
|
||||
│ │ │ Shared, Icons
|
||||
│ │ ├── Shared/ ← WBPs reutilizáveis (UI_Button_Master…)
|
||||
│ │ ├── FrontEnd/ ← WBP_PrimaryGameLayout, DA_FrontEndScreenSet,
|
||||
│ │ │ telas refinadas (Boot/Login/… vindas do Forge)
|
||||
│ │ ├── Fonts/ ← Font_*/FF_* (Cinzel, Rajdhani)
|
||||
│ │ ├── CommonUI/Style/ ← estilos CommonUI (espelha o Hyper)
|
||||
│ │ │ ├── Button/ ← BSB_* (UCommonButtonStyle)
|
||||
@@ -236,6 +242,9 @@ Content/
|
||||
│
|
||||
├── Developers/ ← rascunho por dev (não cooka)
|
||||
│ └── <nick-do-dev>/
|
||||
├── AutoCreated/ ← saída CRUA do Zeus UMG Forge (HTML→WBP).
|
||||
│ └── <batch>/ Quarentena: refina-se e MOVE p/ ZMMO/UI/
|
||||
│ FrontEnd/ antes de produção (não cooka cru)
|
||||
├── ExternalContent/ ← Fab / Megascans / Marketplace
|
||||
│ ├── Fab/ Megascans/ Marketplace/
|
||||
├── Collections/
|
||||
@@ -252,9 +261,20 @@ Source/ZMMO/
|
||||
│
|
||||
├── Game/ ← gameplay runtime (já existe)
|
||||
│ ├── Entity/ ← AZMMOEntity + derivados
|
||||
│ ├── Controller/ ← AZMMOPlayerController
|
||||
│ ├── Modes/ ← GameMode + GameInstance
|
||||
│ └── Network/ ← UZMMOWorldSubsystem
|
||||
│ ├── Controller/ ← AZMMOPlayerController,
|
||||
│ │ AZMMOFrontEndPlayerController
|
||||
│ ├── Modes/ ← GameMode + GameInstance,
|
||||
│ │ AZMMOFrontEndGameMode
|
||||
│ ├── Network/ ← UZMMOWorldSubsystem
|
||||
│ └── UI/ ← runtime de UI (não é contrato de dados)
|
||||
│ ├── ZMMOThemeSubsystem.* ← resolução de tema
|
||||
│ ├── Widgets/ ← UUIButton_Base, UUIPanel_Base
|
||||
│ └── FrontEnd/ ← infra de navegação CommonUI:
|
||||
│ UUIActivatableScreen_Base,
|
||||
│ UUIPrimaryGameLayout_Base,
|
||||
│ UUIManagerSubsystem (LocalPlayer),
|
||||
│ UUIFrontEndFlowSubsystem (GameInstance),
|
||||
│ UUIFrontEndScreenSet (UDataAsset)
|
||||
│
|
||||
└── Data/ ← contrato de dados (USTRUCT + UENUM)
|
||||
├── ZMMOData.h ← header agregador (opcional)
|
||||
@@ -278,7 +298,9 @@ Source/ZMMO/
|
||||
├── UI/
|
||||
│ ├── ThemeKeys.h ← EZMMOThemeKey (HUD_Frame, Login_BG…)
|
||||
│ ├── ThemeRow.h ← FThemeEntry (Key → SoftAsset)
|
||||
│ └── ThemeCalendarRow.h ← FThemeCalendarRow (data → ThemeId)
|
||||
│ ├── ThemeCalendarRow.h ← FThemeCalendarRow (data → ThemeId)
|
||||
│ ├── FrontEndTypes.h ← EZMMOFrontEndState, EZMMOLobbyPage
|
||||
│ └── UILayerTags.h/.cpp ← GameplayTags nativos UI.Layer.*
|
||||
└── World/
|
||||
└── ZoneRow.h
|
||||
```
|
||||
@@ -365,6 +387,16 @@ base de widget = `UUI<Componente>_Base`, sempre `UCLASS(Abstract)` (não
|
||||
instanciável direto; só os filhos derivam — padrão `_Abstract` do Hyper).
|
||||
Ex.: `UUIButton_Base`, `UUIPanel_Base`, `UUIProgressBar_Base`.
|
||||
|
||||
**Sub-regra — infra de navegação de front-end:** as classes que orquestram a
|
||||
navegação CommonUI seguem o mesmo prefixo `UUI` (sem `ZMMO`) por coerência com
|
||||
a família de UI, **mesmo não sendo widgets**. Assim: o layout raiz é
|
||||
`UUIPrimaryGameLayout_Base` (Abstract, widget), a base de tela é
|
||||
`UUIActivatableScreen_Base` (Abstract, widget), e os subsistemas de UI são
|
||||
`UUIManagerSubsystem` (`ULocalPlayerSubsystem`) e `UUIFrontEndFlowSubsystem`
|
||||
(`UGameInstanceSubsystem`). Atores de gameplay do front-end (GameMode,
|
||||
PlayerController) **mantêm** o prefixo `AZMMO` — não são UI, espelham
|
||||
`AZMMOGameMode`: `AZMMOFrontEndGameMode`, `AZMMOFrontEndPlayerController`.
|
||||
|
||||
**Regra do UMG (importante):** um Widget Blueprint **não pode** herdar de outro
|
||||
Widget Blueprint que tenha árvore de widgets (UMG aborta a compilação: "apenas
|
||||
um deles deve ter árvore"). Portanto a camada abstrata é **só a classe C++**
|
||||
@@ -577,6 +609,38 @@ o opcode de spawn. O cliente nunca instancia mob "por nome" — sempre via id.
|
||||
O subsystem aplica fallback internamente: pergunta ao tema activo; se a
|
||||
chave não estiver preenchida, devolve a do `Default`.
|
||||
|
||||
### 4.8. Adicionar uma tela de front-end (ex: `Login`)
|
||||
|
||||
**Pré-requisito:** já existem `UUIActivatableScreen_Base` e
|
||||
`UUIFrontEndFlowSubsystem` em `Source/ZMMO/Game/UI/FrontEnd/`, o
|
||||
`WBP_PrimaryGameLayout` e o `DA_FrontEndScreenSet` em
|
||||
`Content/ZMMO/UI/FrontEnd/`.
|
||||
|
||||
Fluxo geral: **Boot → Connecting → Login → ServerSelect → Lobby → EnteringWorld
|
||||
→ InWorld**. O **Lobby** é o hub principal logado; suas páginas internas
|
||||
(CharacterSelect, CharacterCreate, Shop, Settings…) são `EZMMOLobbyPage`,
|
||||
navegadas por um stack CommonUI **dentro** da tela do Lobby — não são estados
|
||||
de topo do fluxo.
|
||||
|
||||
1. Prototipar a tela em HTML/CSS em `Tools/Templates/MMO_Widget/` (ou usar os
|
||||
templates já existentes).
|
||||
2. Rodar o Zeus UMG Forge (HTML→UMG). Saída crua: `Content/AutoCreated/<batch>/`.
|
||||
3. Abrir o `WBP_*` gerado e **reparent** a classe pai para
|
||||
`UUIActivatableScreen_Base` (a base é `UCommonActivatableWidget`; o WBP tem
|
||||
árvore própria — respeita §3.3, nunca encadeia WBP→WBP).
|
||||
4. **Reconectar tema:** o Forge gera hard ref de textura (proibido §5).
|
||||
Substituir por consumo via `UZMMOThemeSubsystem` por `EZMMOThemeKey` no
|
||||
override de `RefreshUIStyle`; remontar botões/painéis com os widgets
|
||||
compartilhados (`UI_Button_Master`, `UI_Panel_Master`).
|
||||
5. **Mover** o asset refinado de `Content/AutoCreated/…` para
|
||||
`Content/ZMMO/UI/FrontEnd/` (o cru não cooka).
|
||||
6. Registrar no `DA_FrontEndScreenSet`: `StateScreens[EZMMOFrontEndState::Login]`
|
||||
= soft class do WBP refinado (páginas do Lobby vão no map de
|
||||
`EZMMOLobbyPage` da tela de Lobby). Sem registro, o flow faz no-op + log.
|
||||
|
||||
**Regra:** uma tela nunca segura hard ref a asset de tema (textura/som/VFX) —
|
||||
sempre via `UZMMOThemeSubsystem` por `EZMMOThemeKey` (igual §4.7 e §5).
|
||||
|
||||
---
|
||||
|
||||
## 5. O que **NÃO** fazer
|
||||
@@ -588,7 +652,9 @@ chave não estiver preenchida, devolve a do `Default`.
|
||||
- **Não** misturar assets de uma entidade com assets de outra. Cada
|
||||
Wolf_Gray, Sword_Iron, etc. é uma pasta isolada.
|
||||
- **Não** colocar nada na raiz `Content/`. Tudo é `Content/ZMMO/...` ou
|
||||
`Content/{Developers,ExternalContent}/...`.
|
||||
`Content/{Developers,AutoCreated,ExternalContent}/...`. `AutoCreated/` é
|
||||
quarentena do Zeus UMG Forge: refina-se e **move** para `ZMMO/UI/FrontEnd/`
|
||||
antes de produção; o cru não cooka.
|
||||
- **Não** importar conteúdo do Fab/Megascans directo para dentro de `ZMMO/`.
|
||||
Vai sempre para `ExternalContent/` e, se quiser usar, **referencia** dali.
|
||||
- **Não** colocar dados tabulares em Blueprint (lista hardcoded de itens,
|
||||
@@ -598,7 +664,10 @@ chave não estiver preenchida, devolve a do `Default`.
|
||||
- **Não** colocar hard ref de textura/som de tema dentro de um Widget
|
||||
(`TObjectPtr<UTexture2D> ChristmasFrame` é proibido). Widgets pedem ao
|
||||
`UZMMOThemeSubsystem` via `EZMMOThemeKey`. Hard ref a asset de tema
|
||||
bloqueia a troca em runtime e quebra a política de fallback.
|
||||
bloqueia a troca em runtime e quebra a política de fallback. Vale também
|
||||
para **telas de front-end** (Boot/Login/ServerSelect/Lobby/…): a saída crua
|
||||
do Forge traz hard ref — tem de ser reconectada ao subsystem antes do merge
|
||||
(ver §4.8).
|
||||
- **Não** criar chave de tema "ad-hoc" como `FName("HUD.Frame")`. Toda chave
|
||||
é entrada do enum C++ `EZMMOThemeKey`. String literal é proibida — o
|
||||
compilador tem de quebrar quando alguém esquecer de adicionar a chave.
|
||||
|
||||
Reference in New Issue
Block a user