Sales Configurator Docs
Getting startedComeçando

OverviewVisão geral

Sales Configurator is an Unreal Engine 5 template for building interactive sales configurators. The reference case is a furnished apartment, but it fits any product that has spaces and options to pick from. O Sales Configurator é um template de Unreal Engine 5 para montar configuradores de venda interativos. O caso de referência é um apartamento decorado, mas ele serve para qualquer produto que tenha ambientes e opções a escolher.

The template has two sides. You build your catalog on the setup side, and your customer uses the runtime side. Both read the same data, so anything you configure in the tool shows up in the playable configurator. O template tem dois lados. Você monta o seu catálogo no lado de setup, e o seu cliente usa o lado de runtime. Os dois leem os mesmos dados, então tudo que você configura na ferramenta aparece no configurador jogável.

The setup sideO lado de setup

The setup side is the EUW_ConfiguratorSetup, an Editor Utility Widget that runs inside the Unreal editor. You use it to create projects, products, rooms (zones), option groups, the item catalog, and the per-room quantity multipliers, then validate everything before you publish. You never have to open a Blueprint: the tool does the work and saves to the right Data Assets and DataTable for you. O lado de setup é o EUW_ConfiguratorSetup, um Editor Utility Widget que roda dentro do editor da Unreal. Você o usa para criar projetos, produtos, ambientes (zones), grupos de opção, o catálogo de itens e os multiplicadores de quantidade por ambiente, e depois valida tudo antes de publicar. Você nunca precisa abrir um Blueprint: a ferramenta faz o trabalho e salva nos Data Assets e na DataTable certos por você.

The runtime sideO lado de runtime

The runtime side is the playable configurator your end customer uses: splash, login, product selection, walking through the rooms of the scene, choosing items per group, a price calculated by area and quantity, and a summary and order screen at the end. It reads exactly the same Data Assets that the setup tool writes. O lado de runtime é o configurador jogável que o seu cliente final usa: splash, login, seleção de produto, navegação pelos ambientes da cena, escolha de itens por grupo, um preço calculado por área e quantidade, e uma tela de resumo e pedido no fim. Ele lê exatamente os mesmos Data Assets que a ferramenta de setup escreve.

Read this firstLeia isto primeiro

The bridge between both sides is the data model. Understanding it is the prerequisite for everything else, so it comes right after this page. If you only read one section before opening the tool, read that one. A ponte entre os dois lados é o modelo de dados. Entendê-lo é o pré-requisito para todo o resto, então ele vem logo depois desta página. Se você for ler uma seção só antes de abrir a ferramenta, leia essa.

Two ways to build a catalogDois jeitos de montar um catálogo

You can build everything with the setup tool — the recommended path, covered by the step-by-step. Or you can do it by hand in the Content Browser (editing the data assets and tables), covered under Doing it without the setup tool. They write the same data; most people use the tool and drop to the manual route only for the few fields it does not cover yet. Você pode montar tudo com a ferramenta de setup — o caminho recomendado, coberto pelo passo a passo. Ou fazer na mão no Content Browser (editando os data assets e as tabelas), coberto em Fazendo sem a ferramenta. Os dois escrevem os mesmos dados; a maioria usa a ferramenta e recorre ao caminho manual só para os poucos campos que ela ainda não cobre.

EUW_ConfiguratorSetup open in the Unreal editor
📷
images/overview-euw.png
The setup tool open in the editor (Home page)A ferramenta de setup aberta no editor (página Home)
The Setup Tool open in the Unreal editor.A ferramenta de setup aberta no editor da Unreal.
Getting startedComeçando

Requirements & pluginsRequisitos e plugins

The template targets Unreal Engine 5.6. If you create a project from it (the usual route), everything is already set up and the plugins are already on. You only need this page if you migrate the content into a project of your own. O template é para Unreal Engine 5.6. Se você cria um projeto a partir dele (o caminho comum), tudo já vem configurado e os plugins já vêm ligados. Você só precisa desta página se migrar o conteúdo para um projeto seu.

Start here: Create ProjectComece por aqui: Create Project

On the FAB library, this template has a Create Project button. Use it to make your project, then drop your own assets inside. You can skip the rest of this page, because the plugins and settings are already set up for you.Na biblioteca do FAB, este template tem um botão Create Project. Use-o para criar o seu projeto e depois coloque os seus assets dentro. Você pode pular o resto desta página, porque os plugins e as configurações já vêm prontos.

Required pluginPlugin obrigatório

One plugin is what the configurator itself depends on: Um plugin é do que o configurador em si depende:

PluginPluginWhyPor quê
Variant Manager (VariantManager)Provides the LevelVariantSets that drive the visual swaps. Without it, catalog items cannot change the scene.Fornece os LevelVariantSets que dirigem as trocas visuais. Sem ele, os itens do catálogo não conseguem mudar a cena.

The setup tool also uses the editor scripting utilities, which are on by default in UE 5.6, so there is nothing extra to enable for it. A ferramenta de setup também usa os editor scripting utilities, ligados por padrão na UE 5.6, então não há nada extra para habilitar por causa dela.

Enabled in the sample (archviz tooling)Ligados no exemplo (ferramentas de archviz)

The sample project also ships these on, because it is built for architectural scenes. They are import and scene-authoring tools, not runtime requirements. Enable the ones that match how you bring in content; skip the rest. O projeto de exemplo também vem com estes ligados, porque é feito para cenas de arquitetura. São ferramentas de importação e de autoria de cena, não requisitos de runtime. Habilite os que combinam com o jeito que você traz conteúdo; ignore o resto.

PluginPluginForPara
Datasmith Importer, Datasmith CAD Importer, Datasmith C4D Importer, Interchange EditorDatasmith Importer, Datasmith CAD Importer, Datasmith C4D Importer, Interchange EditorImporting scenes from CAD, Cinema 4D, and other DCC tools.Importar cenas de CAD, Cinema 4D e outras ferramentas DCC.
AxF Importer, Dataprep EditorAxF Importer, Dataprep EditorPhysical materials (AxF) and batch import cleanup.Materiais físicos (AxF) e limpeza de importação em lote.
Sun Position, HDRI BackdropSun Position, HDRI BackdropSky and lighting helpers for a scene. The template itself works under any lighting.Ajudantes de céu e iluminação de uma cena. O template em si funciona sob qualquer iluminação.
Modeling Tools Editor ModeModeling Tools Editor ModeIn-editor mesh editing.Edição de mesh dentro do editor.
Movie Render Pipeline (+ mask pass), Python Editor Script PluginMovie Render Pipeline (+ passe de máscara), Python Editor Script PluginHigh-quality renders and editor scripting. Authoring conveniences, not needed to run the configurator.Renders de alta qualidade e scripting do editor. Conveniências de autoria, não necessárias para rodar o configurador.
ConceptsConceitos

Data modelModelo de dados

Everything the configurator shows comes from a small set of Data Assets and one DataTable. The whole template is built around this hierarchy. Tudo que o configurador mostra vem de um pequeno conjunto de Data Assets e uma DataTable. O template inteiro é construído em torno desta hierarquia.

The hierarchyA hierarquia

A Project holds one or more Products. Each product has Zones (the rooms), and each zone has option Groups that reference Items from the product's item table. In the scene, a Zone Trigger per room carries the multipliers used for pricing. Um Project contém um ou mais Products. Cada produto tem Zones (os ambientes), e cada zona tem Groups de opção que referenciam Items da tabela de itens do produto. Na cena, um Zone Trigger por ambiente carrega os multiplicadores usados no preço.

BPDA_Project
the development / your brando empreendimento / a sua marca
BPDA_Product[ ]
each product / floor plancada produto / planta
BPDA_Zone[ ]
each roomcada ambiente
S_Root Groups[ ]
always shownsempre exibidos
S_Dependent Groups[ ]
unlocked by an itemdestravados por um item
DataTableItems TableTabela de Itens
the item catalogo catálogo de itens
BPDA_UITheme
runtime UI lookaparência da UI de runtime
LanguagesIdiomas[ ]
offered languagesidiomas oferecidos
BP_ZoneTrigger
placed in the scene, one per zonecolocado na cena, um por zona
ZoneRefpoints to the BPDA_Zone it representsaponta para a BPDA_Zone que representa
Multipliersmap GroupId → float (area / quantity)mapa GroupId → float (área / quantidade)
NamingNomenclatura

Assets use short prefixes: BPDA_ for a Data Asset (Project, Product, Zone, UITheme), BP_ for a Blueprint actor (the Zone Trigger), DT_ for a DataTable, S_ for a struct, and WBP_ for a widget. You will see these in the content browser and in the field names below. Os assets usam prefixos curtos: BPDA_ para um Data Asset (Project, Product, Zone, UITheme), BP_ para um ator Blueprint (o Zone Trigger), DT_ para uma DataTable, S_ para uma struct, e WBP_ para um widget. Você vai ver esses prefixos no content browser e nos nomes de campo abaixo.

Project — the developmentProject — o empreendimento

The BPDA_Project is the top of the tree: your brand and the list of products you offer. It carries the splash and login art, the currency symbol, the UI theme, and the languages. The full field list is in the field reference. O BPDA_Project é o topo da árvore: a sua marca e a lista de produtos que você oferece. Ele carrega a arte do splash e do login, o símbolo de moeda, o tema de UI e os idiomas. A lista completa de campos está na referência de campos.

Product — the product or floor planProduct — o produto ou planta

A BPDA_Product is one thing your customer can configure: an apartment plan, a car trim, a kitchen layout. It points to the level (scene) to open, the default camera, the list of zones, and the item table. A project can have several products; the runtime shows them as cards on the product screen. Um BPDA_Product é uma coisa que o seu cliente pode configurar: uma planta de apartamento, uma versão de carro, um layout de cozinha. Ele aponta para o level (a cena) a abrir, a câmera padrão, a lista de zonas e a tabela de itens. Um projeto pode ter vários produtos; o runtime os mostra como cards na tela de produto.

Zone — the roomZone — o ambiente

A BPDA_Zone is one room or area of the product: kitchen, living room, master suite. It carries a display name and icon for the navigation rail and minimap, and it holds the option groups. Each zone has a stable ZoneId (PascalCase, no dots) that links it to its trigger in the scene. Uma BPDA_Zone é um ambiente ou área do produto: cozinha, sala, suíte máster. Ela carrega um nome de exibição e um ícone para o rail de navegação e o minimapa, e guarda os grupos de opção. Cada zona tem um ZoneId estável (PascalCase, sem pontos) que a liga ao seu trigger na cena.

Root groups vs. dependent groupsRoot groups x dependent groups

A zone splits its groups in two. Root groups are always shown. Dependent groups only appear once a specific item unlocks them, through the group's DependsOn field. Use a dependent group when an option only makes sense after another choice, for example a "cabinet finish" group that shows up only after the customer adds cabinets. Uma zona divide os grupos em dois. Os root groups são sempre exibidos. Os dependent groups só aparecem depois que um item específico os destrava, pelo campo DependsOn do grupo. Use um dependent group quando uma opção só faz sentido depois de outra escolha, por exemplo um grupo "acabamento do armário" que só surge depois que o cliente adiciona armários.

Group — the set of optionsGroup — o conjunto de opções

A group (the S_Group struct, stored inside the zone) is a set of interchangeable options the customer picks from, like "flooring" or "wall paint". Its GroupId is the key used in the trigger's multiplier map, and its ItemRows list holds the item codes that belong to the group. Items are referenced by code, never copied. Um grupo (a struct S_Group, guardada dentro da zona) é um conjunto de opções intercambiáveis que o cliente escolhe, como "piso" ou "tinta de parede". O GroupId é a chave usada no mapa de multiplicadores do trigger, e a lista ItemRows guarda os códigos dos itens que pertencem ao grupo. Os itens são referenciados por código, nunca copiados.

Items table — the catalogTabela de itens — o catálogo

The item table (a DataTable, the product's ItemsTable) is the actual catalog. Each row is one item; the row name is the item's unique code, and groups reference items by that code. A row carries the display name, brand, measure, gross price, description, thumbnail, and an optional link to a visual variant. Full columns are in the field reference. A tabela de itens (uma DataTable, o ItemsTable do produto) é o catálogo em si. Cada linha é um item; o nome da linha é o código único do item, e os grupos referenciam itens por esse código. Uma linha carrega o nome de exibição, a marca, a medida, o preço bruto, a descrição, o thumbnail e um link opcional para uma variante visual. As colunas completas estão na referência de campos.

CurrencyMoeda

Currency is not a column in the table. The symbol comes from the project's CurrencySymbol and is applied to every price by the UI. Switching the interface language changes only how the number is formatted, not the symbol. Moeda não é uma coluna da tabela. O símbolo vem do CurrencySymbol do projeto e é aplicado a todo preço pela UI. Trocar o idioma da interface muda só a formatação do número, não o símbolo.

Zone Trigger — pricing in the sceneZone Trigger — o preço na cena

A BP_ZoneTrigger is a Blueprint actor placed in the level, one per zone. It points to the zone it represents (ZoneRef) and carries the multipliers: a map from group to a number that scales that group's items by area or quantity in that room. This is where the per-room quantity lives, so every zone needs a trigger in the scene. Um BP_ZoneTrigger é um ator Blueprint colocado no level, um por zona. Ele aponta para a zona que representa (ZoneRef) e carrega os multiplicadores: um mapa de grupo para um número que escala os itens daquele grupo por área ou quantidade naquele ambiente. É aqui que mora a quantidade por ambiente, então toda zona precisa de um trigger na cena.

The pricing modelO modelo de preço

In one sentence: an item's price is multiplied by the multiplier of its group in that room, read from the zone trigger's Multipliers map. Em uma frase: o preço de um item é multiplicado pelo multiplicador do grupo dele naquele ambiente, lido do mapa Multipliers do trigger da zona.

So a flooring item priced per square meter is multiplied by the room's floor area, and a light fixture priced per unit is multiplied by how many that room needs. The multiplier is what turns a unit price into a room total. Então um item de piso com preço por metro quadrado é multiplicado pela área do ambiente, e uma luminária com preço por unidade é multiplicada por quantas aquele ambiente precisa. O multiplicador é o que transforma um preço unitário em um total por ambiente.

Common mistakeErro comum

A root group with no multiplier prices its items at zero. If items show up free in the runtime, the group is missing a multiplier in that zone's trigger, or the zone has no trigger at all. The Validation page catches both. Um root group sem multiplicador precifica os itens dele a zero. Se os itens aparecem de graça no runtime, falta um multiplicador para o grupo no trigger daquela zona, ou a zona não tem trigger nenhum. A página Validation pega os dois casos.

Setup sideLado de setup

The Setup ToolA ferramenta de setup

The EUW_ConfiguratorSetup is where you build your catalog. It runs inside the editor, and its interface is in English. This section walks through it page by page. O EUW_ConfiguratorSetup é onde você monta o seu catálogo. Ele roda dentro do editor, e a interface dele é em inglês. Esta seção passa por ela página a página.

Opening the toolAbrir a ferramenta

In the Content Browser, find EUW_ConfiguratorSetup, right-click it, and choose Run Editor Utility Widget. The tool opens as a tab you can dock like any other editor panel. It is not the game: it edits your data assets directly. No Content Browser, encontre o EUW_ConfiguratorSetup, clique com o botão direito e escolha Run Editor Utility Widget. A ferramenta abre como uma aba que você pode encaixar como qualquer outro painel do editor. Ela não é o jogo: edita os seus data assets diretamente.

Setup tool sidebar navigation
📷
images/euw-sidebar.png
The left sidebar with the page navigation and the Save buttonA barra lateral esquerda com a navegação de páginas e o botão Save
The sidebar navigates between pages; the Save button lives at the bottom.A barra lateral navega entre as páginas; o botão Save fica na parte de baixo.

The sidebar has six pages, in order: Home, Project, Product, Catalog, Zones, and Validation. Below them are the Save and Validate buttons and a small status dot (Validated / Not validated). Multipliers are not a separate page; they live on the right side of the Zones page. A barra lateral tem seis páginas, na ordem: Home, Project, Product, Catalog, Zones e Validation. Abaixo delas ficam os botões Save e Validate e um pontinho de status (Validated / Not validated). Multipliers não é uma página à parte; fica no lado direito da página Zones.

Targets: what you are editingTargets: o que você está editando

The tool always works on three "targets" that point to what is currently being edited: A ferramenta sempre trabalha em três "targets" que apontam para o que está sendo editado no momento:

  • Target Projectthe active project.o projeto ativo.
  • Target Productthe active product (must belong to the active project; it is the source of the zones, the variant sets, and the item table).o produto ativo (tem que pertencer ao projeto ativo; é a fonte das zonas, dos variant sets e da tabela de itens).
  • Target Items Tablethe active product's item table (the Catalog grid reads from and writes to it).a tabela de itens do produto ativo (o grid do Catalog lê e escreve nela).

Selecting a project points all three at once (the project, its first product, and that product's table). Switching product re-points the product and its table. You rarely think about these directly; it just helps to know that "the active product" is what most pages act on. Selecionar um projeto aponta os três de uma vez (o projeto, o primeiro produto dele e a tabela desse produto). Trocar de produto reaponta o produto e a tabela dele. Você raramente pensa nisso diretamente; só ajuda saber que "o produto ativo" é sobre o que a maioria das páginas age.

The Save ruleA regra do Save

ImportantImportante

Catalog edits and multiplier values live in memory until you press Save in the sidebar. Save commits the open level (the triggers' multipliers) and the item table to disk. If you edit a price or a multiplier and it seems to vanish after closing, it was never saved. Edições do catálogo e valores de multiplicador ficam em memória até você apertar Save na barra lateral. O Save grava no disco o level aberto (os multiplicadores dos triggers) e a tabela de itens. Se você edita um preço ou um multiplicador e ele parece sumir depois de fechar, ele nunca foi salvo.

Some actions save themselves right away: creating a product, zone, or group, and assigning items to groups on the Zones page. Those call Save on their own asset. Everything on the Catalog grid and every multiplier value waits for the Save button. Algumas ações salvam sozinhas na hora: criar um produto, zona ou grupo, e atribuir itens a grupos na página Zones. Essas chamam Save no próprio asset. Tudo no grid do Catalog e todo valor de multiplicador espera o botão Save.

Home page — your projectsPágina Home — os seus projetos

Home is the entry point. Each project lives in its own subfolder under the projects folder, and Home shows one card per project it finds there (subfolders included); the active one gets an Active badge. Projects kept outside that folder will not appear. A Home é a porta de entrada. Cada projeto vive na sua própria subpasta dentro da pasta de projetos, e a Home mostra um card por projeto encontrado ali (subpastas incluídas); o ativo recebe um selo Active. Projetos guardados fora dessa pasta não aparecem.

  • New projecttype a name and confirm. The tool duplicates a hidden template into a new project and puts all of that project's assets into a folder named after it (the project asset, the product, the items table, one asset per zone, and the client table). It comes in active with the name you typed as its display name. If a project with that name already exists, it warns and does not overwrite.digite um nome e confirme. A ferramenta duplica um template oculto num projeto novo e coloca todos os assets desse projeto numa pasta com o nome dele (o asset do projeto, o produto, a tabela de itens, um asset por zona, e a client table). Ele vem ativo com o nome digitado como display name. Se já existir um projeto com esse nome, ela avisa e não sobrescreve.
  • Deleteremoves the active project and every asset it owns (each product's zones and table, the products, and the project asset). It asks for confirmation first.remove o projeto ativo e todo asset que ele possui (as zonas e a tabela de cada produto, os produtos e o asset do projeto). Pede confirmação antes.
  • Sync (circular arrowseta circular)re-scans the folder and rebuilds the list, useful when something changed in the Content browser outside the tool.re-escaneia a pasta e reconstrói a lista, útil quando algo mudou no Content browser fora da ferramenta.
One folder per projectUma pasta por projeto

Each project's assets land together under …/Configurator/Data/Projects/<ProjectName>/, so you never move assets or create folders by hand. One caveat: New project copies only the first product of the source template. If a source project has more than one product, the extra ones are not duplicated by this flow — add them afterward.Os assets de cada projeto ficam juntos em …/Configurator/Data/Projects/<NomeDoProjeto>/, então você nunca move asset nem cria pasta na mão. Uma ressalva: o New project copia só o primeiro produto do template de origem. Se um projeto de origem tem mais de um produto, os demais não são duplicados por esse fluxo — adicione depois.

Delete is irreversibleDelete é irreversível

Delete removes the project's whole folder (its product, items table, zones, and client table) and nothing outside it — templates and other projects are safe. There is no undo, so make a copy first if you are unsure.O Delete remove a pasta inteira do projeto (o produto, a items table, as zonas e a client table) e nada fora dela — templates e outros projetos ficam seguros. Não há desfazer, então faça uma cópia antes se estiver em dúvida.

Project pagePágina Project

This page edits the active project's fields directly (branding, currency, languages). You do not need to open the data asset by hand. Esta página edita os campos do projeto ativo diretamente (marca, moeda, idiomas). Você não precisa abrir o data asset na mão.

  • Project group: Display Name, Hero Image, Mode (Exploration / Configuration), Theme.Grupo Project: Display Name, Hero Image, Mode (Exploration / Configuration), Theme.
  • Company group: Company, Logo.Grupo Company: Company, Logo.
  • Commerce group: Vendor Mail, Currency Symbol.Grupo Commerce: Vendor Mail, Currency Symbol.
  • Products: the products this project offers.Products: os produtos que este projeto oferece.
  • Language group: Languages, Default Language Index, Allow Language Switch.Grupo Language: Languages, Default Language Index, Allow Language Switch.
  • Clients: the client table (DT_Clients) used by the login. It must have at least one client for Configuration mode to open (see Client table).Clients: a tabela de clientes (DT_Clients) usada pelo login. Precisa de pelo menos um cliente para o modo Configuration abrir (veja Tabela de clientes).

Full meaning of each field is in the Project field reference.O sentido completo de cada campo está na referência de campos de Project.

The Project page
📷
images/euw-project.png
The Project page editing the project fieldsA página Project editando os campos do projeto
The Project page.A página Project.

Product pagePágina Product

This page picks and edits the active product. The product picker (a dropdown) lists the projects's products by display name; choosing one makes it active, rebuilds the Catalog and Zones pages, and fills the details panel below. Esta página escolhe e edita o produto ativo. O product picker (um dropdown) lista os produtos do projeto por nome de exibição; escolher um o torna ativo, reconstrói as páginas Catalog e Zones, e preenche o painel de detalhes abaixo.

  • Details panelPainel de detalhesedits the product fields directly: display name, description, thumbnail, level path, camera type, item table, and badge text.edita os campos do produto direto: nome de exibição, descrição, thumbnail, level path, tipo de câmera, tabela de itens e texto do selo.
  • Zones orderOrdem das zonasthe order of the Zones array here is the order the rooms appear in the runtime zone rail; reorder the array to reorder the rail.a ordem do array Zones aqui é a ordem em que os ambientes aparecem no zone rail do runtime; reordene o array para reordenar o rail.
  • New productcreates a fresh blank product from the template, adds it to the project, and selects it. The name must be unique; it warns if the name is already in use.cria um produto novo em branco a partir do template, adiciona ao projeto e o seleciona. O nome tem que ser único; avisa se o nome já estiver em uso.

The active product is chosen in the PRODUCT dropdown at the top of the sidebar; it stays visible on every page.O produto ativo é escolhido no dropdown PRODUCT no topo da barra lateral; ele fica visível em todas as páginas.

The Product page
📷
images/euw-product.png
The Product page: scene, camera, zones, and items tableA página Product: cena, câmera, zonas e tabela de itens
The Product page.A página Product.

Catalog page — the item gridPágina Catalog — o grid de itens

The Catalog is the heart of your setup: a grid where each row is one item from the item table. The rows themselves are the working copy of your catalog, and Save rebuilds the table from them. Columns are thumbnail (clickable), display name, brand, measure, price, group (dropdown), variant (clickable cell), and description. The grid scrolls horizontally. O Catalog é o coração do seu setup: um grid onde cada linha é um item da tabela de itens. As próprias linhas são a cópia de trabalho do seu catálogo, e o Save reconstrói a tabela a partir delas. As colunas são thumbnail (clicável), nome de exibição, marca, medida, preço, grupo (dropdown), variante (célula clicável) e descrição. O grid rola na horizontal.

Catalog grid
📷
images/euw-catalog.png
The Catalog grid with a few item rows and the toolbarO grid do Catalog com algumas linhas de item e a toolbar
The Catalog grid. Each row is one catalog item.O grid do Catalog. Cada linha é um item do catálogo.

Why the grid is your catalogPor que o grid é o seu catálogo

Each row is one item, and the rows are the working copy the tool keeps in memory. Save rebuilds the whole item table from them, so an edit only becomes permanent after Save. A row's code (its name) is the unique key that groups use to reference the item, which is why Duplicate leaves the code blank for you to fill and why two rows can never share a code. Cada linha é um item, e as linhas são a cópia de trabalho que a ferramenta mantém em memória. O Save reconstrói a tabela de itens inteira a partir delas, então uma edição só fica permanente depois do Save. O código de uma linha (o nome dela) é a chave única que os grupos usam para referenciar o item, por isso o Duplicate deixa o código em branco para você preencher e por isso duas linhas nunca podem ter o mesmo código.

Adding your first itemAdicionando o seu primeiro item

Press Add, then type a code, display name, brand, measure, and price. Set its Group (the dropdown lists the groups you built on the Zones page), pick a thumbnail, and optionally link a variant. Press Save. Reopen the runtime and the item shows up inside that group, in every room whose group lists its code. Aperte Add, depois digite um código, nome de exibição, marca, medida e preço. Defina o Group (o dropdown lista os grupos que você montou na página Zones), escolha um thumbnail e, se quiser, ligue uma variante. Aperte Save. Reabra o runtime e o item aparece dentro daquele grupo, em todo ambiente cujo grupo lista o código dele.

The catalog and the zones reference each otherO catálogo e as zonas se referenciam

There is a two-way link here that trips people up. An item's Group comes from the groups you build on the Zones page, and a group is filled with catalog item codes. So neither side is fully fillable before the other exists: with no zones yet, the Group dropdown has nothing to offer; with no items yet, a group has nothing to add. Existe aqui um vínculo de mão dupla que confunde as pessoas. O Group de um item vem dos grupos que você monta na página Zones, e um grupo é preenchido com códigos de item do catálogo. Então nenhum dos dois lados é totalmente preenchível antes do outro existir: sem zonas ainda, o dropdown Group não tem o que oferecer; sem itens ainda, um grupo não tem o que adicionar.

It mostly fills itselfEle quase se preenche sozinho

In practice you rarely set Group by hand. When you add an existing item to a group on the Zones page, its catalog Group is written automatically — you do not come back here to say which group it belongs to. And when you create a new item on the Catalog, you can pick its Group right here, since the groups already exist. If the two ever drift apart, Sync groups reconciles the Group column from the zones (it sweeps both root and dependent groups).Na prática você quase nunca define o Group na mão. Quando você adiciona um item existente a um grupo na página Zones, o Group dele no catálogo é escrito automaticamente — você não volta aqui para dizer a que grupo ele pertence. E quando você cria um item novo no Catalog, dá para escolher o Group aqui mesmo, já que os grupos já existem. Se os dois lados divergirem, o Sync groups reconcilia a coluna Group a partir das zonas (ele varre grupos root e dependentes).

Only CustomData needs the DataTableSó o CustomData precisa da DataTable

Almost every item field edits right here in the Catalog grid, including Thumbnail, Description, and MeasureType. The one exception is CustomData (the detail-panel spec lines), which you set in the DataTable — see Custom specs.Quase todo campo do item edita aqui mesmo no grid do Catalog, inclusive Thumbnail, Description e MeasureType. A única exceção é o CustomData (as linhas de spec do painel de detalhe), que você define na DataTable — veja Specs customizadas.

The scene only changes with a linked variantA cena só muda com uma variante atrelada

Setting a Group and a price makes an item selectable and priced, but the 3D scene only swaps when the item has a Variant Set + Variant linked in its Variant cell. An item with no variant still sells and prices normally; it just changes nothing visually. See Variants & visual swaps for how to set them up.Definir um Group e um preço deixa o item selecionável e com preço, mas a cena 3D só troca quando o item tem um Variant Set + Variant atrelados na célula Variant dele. Um item sem variante ainda vende e precifica normalmente; ele só não muda nada visualmente. Veja Variantes e trocas visuais para como configurá-los.

Custom specs (the detail panel's spec lines)Specs customizadas (as linhas de spec do painel de detalhe)

The runtime detail panel shows a spec line per custom attribute of the item, like Finish: Matte or Application: Internal walls. These come from the item's CustomData, a map of key → value pairs. O painel de detalhe do runtime mostra uma linha de spec por atributo custom do item, como Acabamento: Matte ou Aplicação: Paredes Internas. Elas vêm do CustomData do item, um mapa de pares chave → valor.

CustomData is not editable in the setup tool's grid yet, so you fill it in the Data Table directly: O CustomData ainda não é editável no grid da ferramenta de setup, então você preenche direto na Data Table:

  1. On the Catalog page, click Open items table editor.Na página Catalog, clique em Open items table editor.
  2. Select the item's row. In the Row Editor, expand CustomData.Selecione a linha do item. No Row Editor, expanda o CustomData.
  3. Add a Map element for each spec: the key is the label (for example Finish), the value is the value (for example Matte).Adicione um Map element para cada spec: a chave é o rótulo (por exemplo Acabamento), o valor é o valor (por exemplo Matte).
  4. Save. Back in the tool, press Reload if you had the catalog open.Salve. De volta na ferramenta, aperte Reload se o catálogo estava aberto.
Typed text is not auto-translatedTexto digitado não é traduzido automaticamente

The Localization Dashboard only translates the template's fixed UI strings. Text you type into the DataTable or the Catalog (item names, descriptions, CustomData values) is not translated automatically — if you need it in more than one language, provide the translations yourself.O Localization Dashboard traduz só os textos fixos da UI do template. O que você digita na DataTable ou no Catalog (nomes de item, descrições, valores de CustomData) não é traduzido automaticamente — se precisar em mais de um idioma, forneça as traduções você mesmo.

CustomData map in the Row Editor
📷
images/catalog-customdata.png
The CustomData map in the Data Table Row Editor, with the demo's real valuesO mapa CustomData no Row Editor da Data Table, com os valores reais da demo
Filling CustomData in the Data Table Row Editor.Preenchendo o CustomData no Row Editor da Data Table.

ActionsAções

  • Searchfilters rows whose code, display name, or brand contain the text.filtra as linhas cujo código, nome de exibição ou marca contêm o texto.
  • Addappends an empty row (it only reaches the table on Save).acrescenta uma linha vazia (ela só chega na tabela no Save).
  • Duplicateclones the selected row into a new one, leaving the code blank on purpose (item codes are the row names and must be unique).clona a linha selecionada numa nova, deixando o código em branco de propósito (os códigos são os nomes de linha e têm que ser únicos).
  • Removeasks for confirmation, then drops the selected row from the grid.pede confirmação e tira a linha selecionada do grid.
  • Group (per-row dropdowndropdown por linha)sets the item's group; options come from the root groups of every zone in the product.define o grupo do item; as opções vêm dos root groups de todas as zonas do produto.
  • Variant (per-row cellcélula por linha)opens the variant picker (two cascading dropdowns, Set → Variant, from the level's variant sets). Apply saves the pair; Unlink clears it so the item stops driving a variant.abre o variant picker (dois dropdowns em cascata, Set → Variant, dos variant sets do level). Apply grava o par; Unlink limpa para o item parar de dirigir uma variante.
  • Thumbnail (per-row cellcélula por linha)sets the item's thumbnail in the grid. For the underlying object-path format, see Filling DT_Items.define o thumbnail do item no grid. Para o formato de caminho de objeto por trás, veja Preencher o DT_Items.
  • Open items table editoropens the DataTable in Unreal's native editor, where you can Import / Export / Reimport a CSV from the toolbar (no plugin needed).abre a DataTable no editor nativo da Unreal, onde dá para Import / Export / Reimport de um CSV pela toolbar (sem plugin).
  • Reloadclears the grid and rebuilds it from the table. Use it after reimporting a CSV so the changes show without reopening the tool.limpa o grid e reconstrói a partir da tabela. Use depois de reimportar um CSV para as mudanças aparecerem sem reabrir a ferramenta.
  • Sync groupsreconciles the table's Group column: for each row it finds which zone group lists that code (root or dependent) and writes that group back. Keeps items consistent with the zones.reconcilia a coluna Group da tabela: para cada linha, descobre qual grupo de zona lista aquele código (root ou dependente) e grava esse grupo de volta. Mantém os itens consistentes com as zonas.
  • New items tablecreates a new empty item table from the template, assigns it to the product, and reloads the catalog. It needs a unique name and warns if the name is already in use.cria uma tabela de itens nova e vazia a partir do template, atribui ao produto e recarrega o catálogo. Precisa de um nome único e avisa se o nome já estiver em uso.
Two ways to fill the catalogDois jeitos de preencher o catálogo

Type items in row by row, or import a CSV through Open items table editor and then press Reload. For large catalogs the CSV route is faster.Digite os itens linha a linha, ou importe um CSV por Open items table editor e depois aperte Reload. Para catálogos grandes o caminho do CSV é mais rápido.

The grid columns have fixed widths (they do not auto-size to the content); Thumbnail, Variant, and Description are the widest. A long code, brand, variant, or description can clip in the cell — the full text shows when you click to edit it. As colunas do grid têm largura fixa (não se ajustam sozinhas ao conteúdo); Thumbnail, Variant e Description são as mais largas. Um código, marca, variante ou descrição longos podem cortar na célula — o texto completo aparece ao clicar para editar.

Sync gotchasDetalhes do Sync

Two things trip people up with Sync groups: it does not update while the items DataTable is open in the editor (close the table first), and after you press it the on-screen list only refreshes when you switch tabs and come back — the data was already written, it is just a visual refresh.Duas coisas confundem no Sync groups: ele não atualiza enquanto a DataTable de itens estiver aberta no editor (feche a tabela antes), e depois de apertar, a lista na tela só atualiza quando você troca de aba e volta — os dados já foram gravados, é só um refresh visual.

Renaming item codes breaks groupsRenomear códigos quebra os grupos

Groups store their items by code (RowName). If you reimport the item table with codes renamed, the groups still point at the old codes, which no longer exist, so those items show up group-less even though the groups are still built. Only items whose code did not change survive. Rule of thumb: do not rename codes after building groups — or rebuild the affected groups right after (re-add the items, or delete and recreate the group).Os grupos guardam os itens por código (RowName). Se você reimporta a tabela com os códigos renomeados, os grupos continuam apontando para os códigos antigos, que não existem mais, então esses itens aparecem sem grupo mesmo com os grupos montados. Só sobrevivem os itens cujo código não mudou. Regra prática: não renomeie códigos depois de montar os grupos — ou refaça os grupos afetados em seguida (readicione os itens, ou apague e recrie o grupo).

Zones page — rooms, groups, and multipliersPágina Zones — ambientes, grupos e multiplicadores

This one page builds the rooms, their option groups, the items in each group, and the per-zone multipliers. At the top you name and create zones. The left column holds the group cards of the selected zone; the right column, Multipliers, lists the zones that have a trigger. Esta única página monta os ambientes, os grupos de opção deles, os itens de cada grupo e os multiplicadores por zona. No topo você nomeia e cria zonas. A coluna da esquerda tem os group cards da zona selecionada; a coluna da direita, Multipliers, lista as zonas que têm trigger.

Zones page with group cards and multipliers
📷
images/euw-groups.png
The Zones page: group cards on the left, Multipliers on the rightA página Zones: group cards à esquerda, Multipliers à direita
The Zones page. Group cards on the left, multipliers on the right.A página Zones. Group cards à esquerda, multiplicadores à direita.

Group cards (left)Group cards (esquerda)

Select a zone firstSelecione uma zona primeiro

The group cards appear once you select a zone — click its card in the Multipliers column on the right. Before a zone is selected, the groups area is empty.Os group cards aparecem depois que você seleciona uma zona — clique no card dela na coluna Multipliers, à direita. Antes de selecionar uma zona, a área de grupos fica vazia.

Each group of the selected zone is a card. On the card you have everything for that group in one place: Cada grupo da zona selecionada é um card. No card você tem tudo daquele grupo num lugar só:

  • New zonetype a name (e.g. DA_Zone_Living) and click New zone to create the room. The name must be unique and non-empty; it warns if the name is already in use.digite um nome (ex. DA_Zone_Living) e clique em New zone para criar o ambiente. O nome tem que ser único e não vazio; avisa se o nome já estiver em uso.
  • New grouptype a name in Name a new group and click New group. It adds a root group card. There is no in-place rename: to rename a group, delete it and create it again.digite um nome em Name a new group e clique em New group. Isso adiciona um card de grupo root. Não há renomear no lugar: para renomear um grupo, apague e crie de novo.
  • The group cardO card do gruposhows the group's icon and name, an Add item to group dropdown, an Items in this group list, and a Delete group button (delete is immediate, with no confirmation).mostra o ícone e o nome do grupo, um dropdown Add item to group, uma lista Items in this group, e um botão Delete group (apagar é imediato, sem confirmação).
  • Add item to groupthe dropdown lists every item code in the product's table; picking one adds it to that group (duplicates ignored) and writes the item's Group in the catalog automatically.o dropdown lista todos os códigos de item da tabela do produto; escolher um adiciona ao grupo (repetidos ignorados) e escreve o Group do item no catálogo automaticamente.
  • Group iconÍcone do grupoclick the card's icon to open the icon picker (228 Phosphor ph-* icons, with search and Confirm). The icon shows on the card and on the category bar in the product's runtime.clique no ícone do card para abrir o icon picker (228 ícones Phosphor ph-*, com busca e Confirm). O ícone aparece no card e na barra de categorias do runtime do produto.
Can't remove one item from a group yetAinda não dá para tirar um item de um grupo

The card only adds items; there is no per-item remove yet. To take an item out of a group, edit the zone's ItemRows in the asset, or delete the group and recreate it with the items you want.O card só adiciona itens; ainda não há remover item a item. Para tirar um item de um grupo, edite os ItemRows da zona no asset, ou apague o grupo e recrie com os itens que você quer.

Icon picker
📷
images/euw-icon-picker.png
The Choose Icon dialog (Phosphor icons)O diálogo Choose Icon (ícones Phosphor)
The icon picker, used for zone and group icons.O icon picker, usado para ícones de zona e de grupo.
Only root groups hereSó grupos root aqui

New group creates root groups (always visible). Dependent groups (the ones that appear only after a specific item is chosen) are made in the zone asset, not here — see Root vs dependent groups.O New group cria grupos root (sempre visíveis). Grupos dependentes (os que aparecem só depois de um item específico ser escolhido) são feitos no asset da zona, não aqui — veja Grupos root x dependentes.

Multipliers (right)Multipliers (direita)

The right column, headed Multipliers, reads the BP_ZoneTrigger actors in the scene: each zone that has a trigger shows up as a card. On the card, Select in Level selects that trigger, a Trigger in scene chip shows it is linked, and there is one value row per group (for example Cabinets 6.5, Countertop 2.4, Backsplash 10). A coluna da direita, com o título Multipliers, lê os atores BP_ZoneTrigger da cena: cada zona que tem trigger aparece como um card. No card, o Select in Level seleciona aquele trigger, um chip Trigger in scene mostra que está ligado, e há uma linha de valor por grupo (por exemplo Cabinets 6.5, Countertop 2.4, Backsplash 10).

  • A zone with no trigger shows a No trigger state; Create trigger spawns a BP_ZoneTrigger, links it to the zone, and turns the card to Trigger in scene. You then reposition the trigger over the room.Uma zona sem trigger mostra o estado No trigger; o Create trigger cria um BP_ZoneTrigger, liga à zona e vira o card para Trigger in scene. Depois você reposiciona o trigger sobre o ambiente.
  • Type the value per group: the floor area for items priced per m², the count for items priced per unit. Editing writes into the trigger in memory — nothing reaches disk until you press Save.Digite o valor por grupo: a área do piso para itens por m², a quantidade para itens por unidade. Editar escreve no trigger em memória — nada chega ao disco até você apertar Save.
Dependent groups need multipliers tooGrupos dependentes também precisam de multiplicador

Dependent groups are priced like root groups, so each also needs a multiplier. Their rows appear on the card only when the root group they depend on is selected, matching how they surface in the runtime. A dependent group with no multiplier prices its items at zero.Grupos dependentes precificam como os root groups, então cada um também precisa de multiplicador. As linhas deles aparecem no card só quando o root group do qual dependem está selecionado, igual ao jeito que surgem no runtime. Um grupo dependente sem multiplicador precifica os itens a zero.

Two multiplier surprisesDuas surpresas do multiplicador

A brand-new group starts at multiplier 0, which trips the validation warning (its items would price at x0) — that is on purpose, a reminder to set the value. And deleting a group then recreating it with the same name brings back its old multiplier, because multipliers are stored per group name, outside the group itself.Um grupo recém-criado começa com multiplicador 0, o que dispara o aviso de validação (os itens dele precificariam a x0) — isso é de propósito, um lembrete para definir o valor. E apagar um grupo e recriá-lo com o mesmo nome traz de volta o multiplicador antigo, porque os multiplicadores ficam guardados por nome de grupo, fora do grupo em si.

Building a zone, start to finishMontando uma zona, do início ao fim

Create the zone, add its groups, drop items into each group, create its trigger in the scene, then set the multipliers. A zone with groups but no trigger prices its items at zero, so the trigger step is not optional. The order matters only in that the trigger and multipliers come after the groups exist. Crie a zona, adicione os grupos dela, coloque itens em cada grupo, crie o trigger dela na cena, depois defina os multiplicadores. Uma zona com grupos mas sem trigger precifica os itens a zero, então o passo do trigger não é opcional. A ordem só importa no sentido de que o trigger e os multiplicadores vêm depois de os grupos existirem.

Root groups vs. dependent groups, in practiceRoot groups x dependent groups, na prática

Root groups always show in the room and are made here. A dependent group stays hidden until a specific item unlocks it (its DependsOn), and it is made in the zone asset, not on this page. Full steps and a worked sofa example are under Root vs dependent groups. Root groups sempre aparecem no ambiente e são feitos aqui. Um dependent group fica escondido até um item específico destravá-lo (o DependsOn dele), e é feito no asset da zona, não nesta página. Os passos completos e um exemplo de sofá estão em Grupos root x dependentes.

Validation pagePágina Validation

Validation runs every check and writes a report. Clear everything (0 issues) and you get the Validated badge. Run it before you publish, and any time the runtime behaves oddly. It checks for: A Validation roda todas as checagens e escreve um relatório. Zere tudo (0 problemas) e você ganha o selo Validated. Rode antes de publicar, e sempre que o runtime se comportar estranho. Ela checa:

  • duplicate item code;código de item duplicado;
  • item with no group;item sem grupo;
  • a group that no zone declares;um grupo que nenhuma zona declara;
  • a variant Set + Variant pair missing from the level's variants;um par de variante Set + Variant ausente das variantes do level;
  • a root group with no multiplier (its items would price at zero);um root group sem multiplicador (os itens dele precificariam a zero);
  • an item listed in a zone but missing from the item table;um item listado numa zona mas ausente da tabela de itens;
  • any zone in the product with no Zone Trigger in the scene (its multipliers would be unreachable, price zero).qualquer zona do produto sem Zone Trigger na cena (os multiplicadores seriam inalcançáveis, preço zero).

How to use itComo usar

Go to the Validation page and press the Validate button (under the sidebar). The report lists every issue by type. Work down the list: each line points at a catalog row, a group, a zone, or a variant pair to fix. Fix it, press Validate again, and repeat until the count hits zero, the status dot reads Validated. Then press Save. Vá para a página Validation e aperte o botão Validate (embaixo da barra lateral). O relatório lista cada problema por tipo. Vá descendo a lista: cada linha aponta para uma linha do catálogo, um grupo, uma zona ou um par de variante a corrigir. Corrija, aperte Validate de novo, e repita até a contagem zerar e o pontinho de status mostrar Validated. Depois aperte Save.

Run validation before every publish, and any time the runtime prices something wrong or a room comes up empty. It is the fastest way to find a missing multiplier, a mistyped code, or a zone with no trigger. Rode a validação antes de cada publicação, e sempre que o runtime precificar algo errado ou um ambiente aparecer vazio. É o jeito mais rápido de achar um multiplicador faltando, um código digitado errado, ou uma zona sem trigger.

Open the right level firstAbra o level certo primeiro

Validation reads the triggers and the variant sets from the level that is currently open in the editor. If you have an active project loaded but the open level is not that product's level (or is the empty startup scene), it will report triggers missing and variants it cannot check. That is expected: open the product's level, then validate.A Validation lê os triggers e os variant sets do level que está aberto no momento no editor. Se você tem um projeto ativo carregado mas o level aberto não é o daquele produto (ou é a cena vazia inicial), ela vai acusar triggers faltando e variantes que não consegue checar. Isso é esperado: abra o level do produto, depois valide.

Validation report
📷
images/euw-validation.png
The validation report, ideally showing 0 issues and the Validated badgeO relatório de validação, idealmente com 0 problemas e o selo Validated
A clean validation report with the Validated badge.Um relatório de validação limpo com o selo Validated.
Then SaveDepois Save

Once Validation is clean, press Save in the sidebar to commit the level (trigger multipliers) and the item table. Save is the commit; individual edits do not persist on their own.Com a Validation limpa, aperte Save na barra lateral para gravar o level (multiplicadores dos triggers) e a tabela de itens. O Save é o commit; as edições individuais não persistem sozinhas.

Setup sideLado de setup

Variants & visual swapsVariantes e trocas visuais

A variant is the 3D scene reacting to a choice: pick "Oak floor" and the floor material changes. Without variants, catalog items are still selectable and priced, but nothing in the scene changes when the customer picks them. Uma variante é a cena 3D reagindo a uma escolha: escolha "Piso de carvalho" e o material do piso muda. Sem variantes, os itens do catálogo continuam selecionáveis e com preço, mas nada na cena muda quando o cliente os escolhe.

Where variants liveOnde as variantes moram

Variants live in a LevelVariantSets asset inside the product's level, through Unreal's Variant Manager. A Variant Set is a category (for example "Floor"), and each Variant inside it is one option (Oak, Marble). The setup tool reads these; it does not create them. So the product's level needs a LevelVariantSets before the Catalog can link anything to a visual swap. As variantes ficam num asset LevelVariantSets dentro do level do produto, pelo Variant Manager da Unreal. Um Variant Set é uma categoria (por exemplo "Piso"), e cada Variant dentro dele é uma opção (Carvalho, Mármore). A ferramenta de setup lê isso; ela não cria. Então o level do produto precisa de um LevelVariantSets antes do Catalog conseguir ligar algo a uma troca visual.

No variant set, no swapSem variant set, sem troca

If the level has no LevelVariantSets, the Variant column has nothing to offer, and Validation reports it cannot check variants (treated as "no swap available", not an error).Se o level não tem LevelVariantSets, a coluna Variant não tem o que oferecer, e a Validation avisa que não dá para checar variantes (tratado como "sem troca disponível", não como erro).

Creating a Variant SetCriar um Variant Set

This is the standard Unreal Variant Manager workflow, done once per product level: Este é o fluxo padrão do Variant Manager da Unreal, feito uma vez por level de produto:

  1. Open the level's LevelVariantSets asset (or create one and place it in the level).Abra o asset LevelVariantSets do level (ou crie um e coloque no level).
  2. Add a Variant Set for each category the customer chooses from (Floor, Wall, Cabinet).Adicione um Variant Set para cada categoria que o cliente escolhe (Piso, Parede, Armário).
  3. Inside each set, add a Variant per option, and capture the properties it changes (a material, a mesh, visibility).Dentro de cada set, adicione uma Variant por opção, e capture as propriedades que ela muda (um material, uma mesh, visibilidade).
  4. Save the level. The setup tool now lists these sets and variants in the Catalog's Variant picker.Salve o level. A ferramenta de setup agora lista esses sets e variants no picker Variant do Catalog.
🎬
images/vid-variant-set.mp4
Creating a Variant Set and its variants in the Variant ManagerCriando um Variant Set e as variantes no Variant Manager
Creating a Variant Set and its variants.Criando um Variant Set e as variantes.
Confirm against your projectConfirme com o seu projeto

The steps above are the generic Variant Manager flow. If the template ships with a specific setup or naming convention for its variant sets, follow that; a screenshot of the demo level's LevelVariantSets makes a good reference.Os passos acima são o fluxo genérico do Variant Manager. Se o template já vem com um setup ou convenção de nomes específicos para os variant sets, siga isso; um print do LevelVariantSets do level de demonstração serve de referência.

On the Catalog page, the item's Variant cell opens the picker: two cascading dropdowns, Set then Variant. Apply writes the pair into the item; Unlink clears it. An item with no variant set drives no swap (it still sells and prices normally). At runtime, choosing that item switches the scene to its variant. Na página Catalog, a célula Variant do item abre o picker: dois dropdowns em cascata, Set e depois Variant. Apply grava o par no item; Unlink limpa. Um item sem variant set não dirige troca (ele ainda vende e precifica normalmente). No runtime, escolher esse item troca a cena para a variante dele.

Validation flags any Set + Variant pair on an item that does not exist in the level's variants, so a typo or a renamed set gets caught before publish. A Validation sinaliza qualquer par Set + Variant num item que não exista nas variantes do level, então um erro de digitação ou um set renomeado é pego antes de publicar.

Guided pathCaminho guiado

Step-by-step setupPasso a passo

From an empty project to a running configurator. Each step says what to click, what you should see, and leaves a spot for a short screen recording. Do them in order the first time; after that you jump straight to the page you need. Remember the Save rule: catalog and multiplier edits stay in memory until you press Save. De um projeto vazio a um configurador rodando. Cada passo diz o que clicar, o que você deve ver, e deixa um espaço para uma gravação de tela curta. Faça na ordem na primeira vez; depois você vai direto para a página que precisa. Lembre da regra do Save: edições de catálogo e multiplicador ficam em memória até você apertar Save.

Start here: Home → New projectComece aqui: Home → New project

The whole flow starts in the setup tool, on the Home page, with New project (step 1). Everything after that happens on the sidebar pages, top to bottom. You don't edit any asset by hand to get going.O fluxo inteiro começa na ferramenta de setup, na página Home, com New project (passo 1). Tudo depois disso acontece nas páginas da barra lateral, de cima para baixo. Você não edita nenhum asset na mão para começar.

Before you open the toolAntes de abrir a ferramenta

The tool clones and edits the project's assets for you, but a few things have to exist before it can point at them. Have these ready first:A ferramenta clona e edita os assets do projeto para você, mas algumas coisas precisam existir antes de ela poder apontar para elas. Tenha isto pronto primeiro:

  • Your product level — the 3D scene the product opens. Build or import it in Unreal as usual; step 3 just points the product at it.O level do seu produto — a cena 3D que o produto abre. Monte ou importe na Unreal como sempre; o passo 3 só aponta o produto para ela.
  • Visual variants (if you want scene changes) — the level needs a LevelVariantSets built in the Variant Manager. The tool only links to variants that already exist, so make them before step 7 (see Creating a Variant Set).Variantes visuais (se você quer mudanças na cena) — o level precisa de um LevelVariantSets montado no Variant Manager. A ferramenta só liga a variantes que já existem, então crie-as antes do passo 7 (veja Criar um Variant Set).
  • Your item list — codes, names, brands, prices, and measures. Type them in step 4, or have a CSV ready to import in one shot.Sua lista de itens — códigos, nomes, marcas, preços e medidas. Digite no passo 4, ou tenha um CSV pronto para importar de uma vez.
A few things live outside the toolAlgumas coisas ficam fora da ferramenta

The setup tool covers the whole catalog, but these are done in other parts of Unreal (each has its own section here):A ferramenta de setup cobre o catálogo inteiro, mas isto é feito em outras partes da Unreal (cada um tem a sua própria seção aqui):

  • Variant Sets and variants — created in the Variant Manager panel on the product level, not in the tool (Variants).Variant Sets e variantes — criados no painel Variant Manager no level do produto, não na ferramenta (Variantes).
  • CustomData spec lines — the extra spec rows on the detail panel are typed in the items Data Table, not the Catalog grid (Custom specs).Linhas de spec do CustomData — as linhas de spec extras no painel de detalhe são digitadas na Data Table de itens, não no grid do Catalog (Specs customizadas).
  • New language cultures — a language you add to the project also needs its culture compiled in the Localization Dashboard (Languages).Culturas de idioma novas — um idioma que você adiciona ao projeto também precisa da cultura compilada no Localization Dashboard (Idiomas).
  • The startup fallback — which project the packaged build loads when none is set comes from the StartupProject and the Game Default Map in Project Settings (Configuring a new project).O fallback de inicialização — qual projeto o build empacotado carrega quando nenhum está definido vem do StartupProject e do Game Default Map em Project Settings (Configurando um projeto novo).
  • Sending the order out — the CRM / email integration is wired in the SendVendorEmail and OnOrderConfirmed hooks (Order data & export).Enviar o pedido para fora — a integração de CRM / e-mail é ligada nos hooks SendVendorEmail e OnOrderConfirmed (Dados do pedido e export).
  1. Create the projectCriar o projeto
  2. Fill in the projectPreencher o projeto
  3. Create or adjust the productCriar ou ajustar o produto
  4. Build the item catalogMontar o catálogo
  5. Create the roomsCriar os ambientes
  6. Build groups and add itemsMontar grupos e adicionar itens
  7. Link visual variants (optional)Ligar variantes visuais (opcional)
  8. Place the zone triggersColocar os zone triggers
  9. Set the multipliersDefinir os multiplicadores
  10. ValidateValidar
  11. SaveSalvar
  12. Test in PlayTestar em Play
  1. Create the projectCriar o projeto

    A project is the top of your catalog. You start by cloning a fresh one from the template.Um projeto é o topo do seu catálogo. Você começa clonando um novo a partir do template.

    • Open the setup tool (how to open it) and go to the Home page.Abra a ferramenta de setup (como abrir) e vá para a página Home.
    • Click New project, type a name, and confirm. The tool warns you if the name already exists.Clique em New project, digite um nome e confirme. A ferramenta avisa se o nome já existe.

    You'll see: a new project card with an Active badge, and all of its assets organized in a folder named after the project. It is cloned from the template and still points at the demo level; you re-point that at step 3.Você verá: um card de projeto novo com o selo Active, e todos os assets dele organizados numa pasta com o nome do projeto. Ele é clonado do template e ainda aponta para o level de demonstração; você reaponta isso no passo 3.

    🎬
    images/vid-01-create-project.mp4
    Screen recording: Home → New project → name → Active card appearsGravação: Home → New project → nome → card Active aparece
    Creating a new project on the Home page.Criando um projeto novo na página Home.
  2. Fill in the projectPreencher o projeto

    These fields set the branding, the money, and the languages for the whole project.Estes campos definem a marca, o dinheiro e os idiomas do projeto todo.

    • Go to the Project page (02 in the sidebar); its fields edit the project asset directly.Vá para a página Project (02 na barra lateral); os campos dela editam o asset do projeto diretamente.
    • Set DisplayName, Company, Logo, HeroImage, and CurrencySymbol (for example $, R$, or EUR).Defina DisplayName, Company, Logo, HeroImage e CurrencySymbol (por exemplo $, R$ ou EUR).
    • Choose the Mode (Exploration or Configuration) and the Theme.Escolha o Mode (Exploration ou Configuration) e o Theme.
    • Add your Languages, set DefaultLanguageIndex, and bAllowLanguageSwitch. A new language also needs its culture compiled in the Localization Dashboard (Languages).Adicione os Languages, defina o DefaultLanguageIndex e o bAllowLanguageSwitch. Um idioma novo também precisa da cultura compilada no Localization Dashboard (Idiomas).

    The full meaning of each field is in the Project field reference.O sentido completo de cada campo está na referência de campos de Project.

    🎬
    images/vid-02-project-fields.mp4
    Screen recording: editing the BPDA_Project fieldsGravação: editando os campos do BPDA_Project
    Filling in the project's branding, currency, and languages.Preenchendo marca, moeda e idiomas do projeto.
  3. Create or adjust the productCriar ou ajustar o produto

    A product is one thing the customer configures (a floor plan, a trim). It points at the real level to open.Um produto é uma coisa que o cliente configura (uma planta, uma versão). Ele aponta para o level real a abrir.

    • Go to the Product page. Use the product that came with the template, or click New product.Vá para a página Product. Use o produto que veio com o template, ou clique em New product.
    • In the details panel, set DisplayName, Description, Thumbnail, CameraType (FPS walkthrough or Orbital), and BadgeText if you want a "New" style badge.No painel de detalhes, defina DisplayName, Description, Thumbnail, CameraType (FPS walkthrough ou Orbital), e BadgeText se quiser um selo tipo "New".
    • Set LevelPath to your real product level. This is what re-points it away from the demo level.Defina o LevelPath para o seu level de produto real. É isso que reaponta ele para longe do level de demonstração.

    You'll see: switching product here rebuilds the Catalog and Zones pages for that product.Você verá: trocar de produto aqui reconstrói as páginas Catalog e Zones para aquele produto.

    🎬
    images/vid-03-product.mp4
    Screen recording: Product page → fields + LevelPathGravação: página Product → campos + LevelPath
    Setting the product details and its level.Definindo os detalhes do produto e o level dele.
  4. Build the item catalogMontar o catálogo

    The catalog is every selectable item. You can type them in or import a CSV.O catálogo é todo item selecionável. Você pode digitá-los ou importar um CSV.

    • Go to the Catalog page. Use the template's table, or click New items table.Vá para a página Catalog. Use a tabela do template, ou clique em New items table.
    • By hand: click Add, then fill code, display name, brand, measure, and price. Pick a thumbnail and set the Group (the dropdown lists the groups from your zones, so this fills in once you have zones).Na mão: clique em Add, depois preencha código, nome, marca, medida e preço. Escolha um thumbnail e defina o Group (o dropdown lista os grupos das suas zonas, então isso se preenche depois que você tem zonas).
    • By CSV: click Open items table editor, use Import in the toolbar, then come back and press Reload.Por CSV: clique em Open items table editor, use o Import na toolbar, depois volte e aperte Reload.
    • To show spec lines on the detail panel (Finish, Application, and so on), fill the item's CustomData in the Data Table (see Custom specs).Para mostrar linhas de spec no painel de detalhe (Acabamento, Aplicação, etc.), preencha o CustomData do item na Data Table (veja Specs customizadas).

    The Group options come from the Zones page (step 6). If you have not built your groups yet, leave Group empty for now and fill it later, by hand or with Sync groups.As opções de Group vêm da página Zones (passo 6). Se você ainda não montou os grupos, deixe o Group vazio por enquanto e preencha depois, na mão ou com Sync groups.

    Codes are uniqueCódigos são únicos

    Each item's code (its row name) is the key the groups use. Two items can never share a code, which is why Duplicate leaves the code blank.O código de cada item (o nome da linha) é a chave que os grupos usam. Dois itens nunca podem ter o mesmo código, por isso o Duplicate deixa o código em branco.

    🎬
    images/vid-04-catalog.mp4
    Screen recording: Add a row, fill fields, pick thumbnailGravação: Add uma linha, preencher campos, escolher thumbnail
    Adding items to the catalog grid.Adicionando itens ao grid do catálogo.
  5. Create the rooms (zones)Criar os ambientes (zones)

    Each zone is one room or area the customer navigates.Cada zona é um ambiente ou área que o cliente navega.

    • Go to the Zones page. Type a name and click New zone. Repeat for each room.Vá para a página Zones. Digite um nome e clique em New zone. Repita para cada ambiente.
    • Select the zone card, then set its icon with the icon picker (used on the rail and minimap).Selecione o card da zona, depois defina o ícone dela com o icon picker (usado no rail e no minimapa).

    You'll see: a card per zone, each with a name, an icon, and a trigger chip (still empty until step 8).Você verá: um card por zona, cada um com nome, ícone e um chip de trigger (ainda vazio até o passo 8).

    🎬
    images/vid-05-zones.mp4
    Screen recording: New zone + pick an iconGravação: New zone + escolher um ícone
    Creating a room and choosing its icon.Criando um ambiente e escolhendo o ícone.
  6. Build groups and add itemsMontar grupos e adicionar itens

    Groups are the sets of options a room offers (flooring, wall paint), and you fill them with item codes.Grupos são os conjuntos de opções que um ambiente oferece (piso, tinta de parede), e você os preenche com códigos de item.

    • With a zone selected, type a group name and click New group (this makes a root group, always shown).Com uma zona selecionada, digite um nome de grupo e clique em New group (isso cria um root group, sempre exibido).
    • Pick the group in the group picker, then use Add item to add items by code. The dropdown only lists items that already exist in the catalog (step 4), so create your items there first. The Current items readout shows what is in the group.Escolha o grupo no group picker, depois use Add item para adicionar itens por código. O dropdown só lista itens que já existem no catálogo (passo 4), então crie os seus itens lá primeiro. O readout Current items mostra o que está no grupo.
    • A dependent group stays hidden until an item unlocks it, through the group's DependsOn (the unlocking item's code). Use it for options that only make sense after a prior choice.Um dependent group fica escondido até um item destravá-lo, pelo DependsOn do grupo (o código do item que destrava). Use para opções que só fazem sentido depois de outra escolha.

    Back on the Catalog, you can now set each item's Group; or use Sync groups to reconcile them from the zones.De volta no Catalog, agora dá para definir o Group de cada item; ou use Sync groups para reconciliar a partir das zonas.

    🎬
    images/vid-06-groups.mp4
    Screen recording: New group → Add item → Current items updatesGravação: New group → Add item → Current items atualiza
    Creating a group and adding items to it.Criando um grupo e adicionando itens a ele.
  7. Link visual variants (optional)Ligar variantes visuais (opcional)

    Do this for items that should change the 3D scene. Skip it for items that only need to sell and price.Faça isso para itens que devem mudar a cena 3D. Pule para itens que só precisam vender e precificar.

    • Make sure the product's level has a LevelVariantSets with the sets and variants you need (see Creating a Variant Set).Garanta que o level do produto tem um LevelVariantSets com os sets e variants que você precisa (veja Criar um Variant Set).
    • On the Catalog, click an item's Variant cell, pick the Set then the Variant, and press Apply. Unlink clears it.No Catalog, clique na célula Variant de um item, escolha o Set e depois o Variant, e aperte Apply. Unlink limpa.
    No variant, no scene changeSem variante, sem mudança na cena

    An item with no linked variant is still selectable and priced, but choosing it changes nothing in the 3D scene.Um item sem variante atrelada ainda é selecionável e tem preço, mas escolhê-lo não muda nada na cena 3D.

    🎬
    images/vid-07-variants.mp4
    Screen recording: Variant cell → Set → Variant → ApplyGravação: célula Variant → Set → Variant → Apply
    Linking a catalog item to a scene variant.Ligando um item do catálogo a uma variante de cena.
  8. Place the zone triggersColocar os zone triggers

    Every zone needs a trigger in the scene. The trigger carries the pricing multipliers, so this step is not optional.Toda zona precisa de um trigger na cena. O trigger carrega os multiplicadores de preço, então este passo não é opcional.

    • On the Zones page, select a zone and click Create trigger. The card turns to "Trigger in scene".Na página Zones, selecione uma zona e clique em Create trigger. O card vira "Trigger in scene".
    • Use Select in Level (or find the BP_ZoneTrigger in the World Outliner) and move it with the transform gizmo so it sits over the room. Scale it to cover the room's floor.Use Select in Level (ou ache o BP_ZoneTrigger no World Outliner) e mova com o gizmo de transformação para ele ficar sobre o ambiente. Escale para cobrir o piso do ambiente.
    • Repeat for every zone.Repita para cada zona.
    🎬
    images/vid-08-triggers.mp4
    Screen recording: Create trigger → Select in Level → move over the roomGravação: Create trigger → Select in Level → mover sobre o ambiente
    Creating and positioning a zone trigger.Criando e posicionando um zone trigger.
  9. Set the multipliersDefinir os multiplicadores

    The multiplier turns a unit price into a room total. Set one per group, per room.O multiplicador transforma um preço unitário num total por ambiente. Defina um por grupo, por ambiente.

    • Go to the Multipliers page. Each zone with a trigger shows a card with one row per root group.Vá para a página Multipliers. Cada zona com trigger mostra um card com uma linha por root group.
    • Type the value: the floor area for items priced per m², or the count for items priced per unit. A group left at zero prices its items free.Digite o valor: a área do piso para itens por m², ou a quantidade para itens por unidade. Um grupo deixado em zero precifica os itens de graça.

    These values stay in memory until you Save (step 11).Esses valores ficam em memória até você Salvar (passo 11).

    🎬
    images/vid-09-multipliers.mp4
    Screen recording: typing a multiplier on a zone cardGravação: digitando um multiplicador num card de zona
    Setting a group's multiplier for a room.Definindo o multiplicador de um grupo para um ambiente.
  10. ValidateValidar

    Validation catches the mistakes that make the runtime misbehave.A validação pega os erros que fazem o runtime se comportar mal.

    • Go to the Validation page and run the check. Read the report top to bottom.Vá para a página Validation e rode a checagem. Leia o relatório de cima a baixo.
    • Fix each issue (a missing group, a group with no multiplier, a zone with no trigger, a bad variant pair), then run again until the count hits zero and the Validated badge appears.Corrija cada problema (um grupo faltando, um grupo sem multiplicador, uma zona sem trigger, um par de variante ruim), depois rode de novo até a contagem zerar e o selo Validated aparecer.

    See the full check list under the Validation page.Veja a lista completa de checagens em página Validation.

    🎬
    images/vid-10-validate.mp4
    Screen recording: run → fix an issue → 0 issues → ValidatedGravação: rodar → corrigir → 0 problemas → Validated
    Running validation until it is clean.Rodando a validação até ficar limpa.
  11. SaveSalvar

    Save is the commit. It writes the level (trigger multipliers) and the item table to disk.O Save é o commit. Ele grava o level (multiplicadores dos triggers) e a tabela de itens no disco.

    • Press Save in the sidebar. Do this before closing the tool or pressing Play, or your catalog and multiplier edits are lost.Aperte Save na barra lateral. Faça isso antes de fechar a ferramenta ou apertar Play, ou suas edições de catálogo e multiplicador se perdem.
    🎬
    images/vid-11-save.mp4
    Screen recording: pressing Save in the sidebarGravação: apertando Save na barra lateral
    Committing everything with Save.Gravando tudo com o Save.
  12. Test in PlayTestar em Play

    Run the configurator and confirm your setup end to end.Rode o configurador e confirme o seu setup de ponta a ponta.

    • Press Play. Walk (or orbit) through the rooms and check: the zones appear on the rail and minimap, the groups show the right items, prices and thumbnails resolve, and a linked item swaps the scene.Aperte Play. Ande (ou orbite) pelos ambientes e confira: as zonas aparecem no rail e no minimapa, os grupos mostram os itens certos, preços e thumbnails resolvem, e um item com variante troca a cena.
    • On a brand-new project, if Play shows the demo apartment, it is the fallback — set your project up under Configuring a new project. The two videos below show both modes: Configuration (login and pricing) and Exploration (product selector, no prices).Num projeto novo, se o Play mostra o apartamento demo, é o fallback — configure o seu projeto em Configurando um projeto novo. Os dois vídeos abaixo mostram os dois modos: Configuration (login e preço) e Exploration (seletor de produto, sem preços).
    • If something is off (a free item, an empty room), go back to Validate: it usually points straight at the cause.Se algo estiver errado (um item de graça, um ambiente vazio), volte para Validar: ela geralmente aponta direto para a causa.
    🎬
    images/vid-12-test-configuration.mp4
    Configuration mode: login → navigate → pick items → price updatesModo Configuration: login → navegar → escolher itens → preço atualiza
    Testing in Configuration mode (with login and pricing).Testando no modo Configuration (com login e preço).
    🎬
    images/vid-12-test-exploration.mp4
    Exploration mode: product selector, no login, no pricesModo Exploration: seletor de produto, sem login, sem preços
    Testing in Exploration mode (product selector, no prices).Testando no modo Exploration (seletor de produto, sem preços).
Getting startedComeçando

Configuring a new project (what the configurator loads)Configurando um projeto novo (o que o configurador carrega)

The template ships pointing at the demo. On a brand-new project there is one setup that trips everyone up: telling the runtime which project to load. Do it once. O template já vem apontando para a demo. Num projeto novo há um ajuste que pega todo mundo: dizer ao runtime qual projeto carregar. Faça isso uma vez.

Why a new level shows the demo apartmentPor que um nível novo mostra o apartamento demo

When you enter a product level, the game mode uses the product the client logged into. If no one logged in — for example when you press Play directly on a product level in the editor — it falls back to the StartupProject set on the Game Instance, and uses that project's first product. In the template, StartupProject points at the demo project, so a brand-new (even empty) level comes up with the demo apartment's rooms, groups, and items. That is the fallback doing its job, not a bug in your level. Ao entrar num nível de produto, o game mode usa o produto em que o cliente fez login. Se ninguém logou — por exemplo, quando você dá Play direto num nível de produto no editor — ele cai no StartupProject definido na Game Instance, e usa o primeiro produto daquele projeto. No template, o StartupProject aponta para o projeto demo, então um nível novo (mesmo vazio) aparece com os cômodos, grupos e itens do apartamento demo. É o fallback fazendo o trabalho dele, não um bug do seu nível.

Set it up for your projectConfigure para o seu projeto

  1. Point StartupProject at your projectAponte o StartupProject para o seu projeto

    Open BPS_ConfiguratorGameInstance — the class listed under Project Settings → Maps & Modes → Game Instance Class — and in its Class Defaults set StartupProject to your BPDA_Project. This is the boot and fallback project.Abra o BPS_ConfiguratorGameInstance — a classe que está em Project Settings → Maps & Modes → Game Instance Class — e nos Class Defaults dele defina o StartupProject para o seu BPDA_Project. Esse é o projeto de boot e de fallback.

    Set it on the child, not the parentDefina na filha, não na pai

    StartupProject is declared on the parent class BP_GameInstance, but the game instantiates the child, BPS_ConfiguratorGameInstance. The child inherits the parent's value until it has its own, so the value that actually wins is the child's. Set it on BPS_ConfiguratorGameInstance, and do not put different values on the parent and the child at the same time — the child's would win and the parent's would look like it "did not take".O StartupProject é declarado na classe pai BP_GameInstance, mas o jogo instancia a filha, BPS_ConfiguratorGameInstance. A filha herda o valor da pai enquanto não tiver o próprio, então o valor que manda de verdade é o da filha. Defina no BPS_ConfiguratorGameInstance, e não coloque valores diferentes na pai e na filha ao mesmo tempo — o da filha ganharia e o da pai pareceria que "não pegou".

  2. Set the Game Default Map to L_EntryDeixe o Game Default Map como L_Entry

    In Project Settings → Maps & Modes, set Game Default Map to L_Entry, so Play starts at the login (the intended flow). If it points at the demo scene, Play always opens the demo, no matter which level you have open — only Play This Level in the viewport opens the open level.Em Project Settings → Maps & Modes, defina o Game Default Map como L_Entry, para o Play começar no login (o fluxo pretendido). Se ele apontar para a cena demo, o Play sempre abre a demo, não importa qual nível você tenha aberto — só o Play This Level na viewport abre o nível aberto.

  3. Check each product's levelConfira o nível de cada produto

    On each product, make sure LevelPath (Scene) points at that product's real level.Em cada produto, garanta que o LevelPath (Scene) aponta para o nível real daquele produto.

The intended flowO fluxo pretendido

The end customer starts at L_Entry, logs in, and the client's product decides what loads — the fallback never runs. Pressing Play directly on a product level is a dev shortcut that depends on StartupProject being right.O cliente final começa no L_Entry, faz login, e o produto do cliente define o que carrega — o fallback nem entra. Dar Play direto num nível de produto é um atalho de dev que depende do StartupProject estar certo.

RoadmapRoadmap

Today StartupProject is set by hand. A future update is planned to remove this (each level would declare its own product), so this step may change in later versions.Hoje o StartupProject é setado na mão. Está prevista uma atualização futura para remover isso (cada nível declararia o próprio produto), então esse passo pode mudar em versões futuras.

AdvancedAvançado

Advanced & manual setupSetup avançado e manual

The setup tool covers the common path. This section is for what it does not cover yet: filling the item table by column, building dependent groups in the zone asset, the zone trigger's parts, the login table, and doing the whole thing without the tool. A ferramenta de setup cobre o caminho comum. Esta seção é para o que ela ainda não cobre: preencher a tabela de itens por coluna, montar grupos dependentes no asset da zona, as partes do zone trigger, a tabela de login, e fazer tudo sem a ferramenta.

Filling DT_Items (column by column)Preencher o DT_Items (coluna a coluna)

The catalog lives in the DT_Items DataTable. Most columns are editable in the Catalog grid; a few are set here (Open items table editor → Row Editor). Here is every column and how to fill it. O catálogo mora na DataTable DT_Items. A maioria das colunas é editável no grid do Catalog; algumas se preenchem aqui (Open items table editor → Row Editor). Aqui está cada coluna e como preencher.

ColumnColunaHow to fill itComo preencher
Row NameRow Name (codecódigo)Unique row id, no spaces or dots. It is the key the group's DependsOn points to. Ex.: Sofa_Casena, Floor_Living_OakNatural.Id único da linha, sem espaço ou ponto. É a chave que o DependsOn do grupo aponta. Ex.: Sofa_Casena, Floor_Living_OakNatural.
DisplayNameThe name shown on the card. Free text, accents and spaces allowed.O nome que aparece no card. Texto livre, com acento e espaço.
BrandBrand (free text).Marca (texto livre).
DescriptionThe detail panel text (editable in the Catalog grid or here).O texto do painel de detalhe (editável no grid do Catalog ou aqui).
PricePure number (e.g. 62.0). The currency symbol comes from the Project.Número puro (ex. 62.0). O símbolo de moeda vem do Project.
MeasureTypeEnum — use exactly SquareMeter, LinearMeter, or Unit.Enum — use exatamente SquareMeter, LinearMeter ou Unit.
ThumbnailObject path in the form /Game/.../T_Name.T_Name (the asset name repeats after the dot). Empty = card with no image. The in-grid picker is a coming release.Caminho do objeto no formato /Game/.../T_Name.T_Name (o nome do asset repete depois do ponto). Vazio = card sem imagem. O picker no grid é um release futuro.
VariantSetName + VariantName⚠️ Must match the Variant Set and Variant name in the scene's LVS exactly — the runtime does GetVariantSetByName + SwitchOnVariantByName. A mismatch applies nothing.⚠️ Têm que bater exatamente com o nome do Variant Set e da Variant no LVS da cena — o runtime faz GetVariantSetByName + SwitchOnVariantByName. Se não bater, não aplica nada.
CustomDataStructured key → value pairs (Dimension, Application, Finish, Collection…). Not editable in the tool; see Custom specs.Pares chave → valor estruturados (Dimensão, Aplicação, Acabamento, Coleção…). Não editável na ferramenta; veja Specs customizadas.
GroupThe GroupId the item belongs to (must exist in the zone's RootGroups or DependentGroups). Usually filled for you; Sync groups reconciles both sides.O GroupId a que o item pertence (tem que existir no RootGroups ou DependentGroups da zona). Normalmente preenchido pra você; o Sync groups reconcilia os dois lados.
Golden rule: names must match the LVSRegra de ouro: os nomes têm que bater com o LVS

An item's VariantSetName and VariantName must be identical to the Variant Set and Variant names in the scene's LevelVariantSets. The runtime resolves them by name, so a single typo means the swap silently does nothing.O VariantSetName e o VariantName de um item têm que ser idênticos aos nomes do Variant Set e da Variant no LevelVariantSets da cena. O runtime resolve por nome, então um único erro de digitação faz a troca não fazer nada, sem avisar.

Root vs dependent groups: where each is createdGrupos root x dependentes: onde criar cada um

A group is Root (always visible in the menu) or Dependent (appears only when a specific item is chosen). Each one is created in a different place. Um grupo é Root (sempre visível no menu) ou Dependente (aparece só quando um item específico é escolhido). Cada um se cria num lugar.

  • Root groups and their items — in the EUW Zones tab: use New group to create them (e.g. Sofa, Floor, Cabinet) and the group selector to add items. New group makes only root groups.Grupos root e seus itens — na aba Zones do EUW: use New group para criar (ex. Sofa, Floor, Cabinet) e o seletor de grupo para adicionar os itens. O New group cria apenas grupos root.
  • Dependent groups — directly in the zone asset (DA_Zone), in the DependentGroups array (Content Browser, or open the zone from the Product tab). For each one fill GroupId, DependsOn (the code / RowName of the item that unlocks the group), and ItemRows (the codes of the items inside it). The tool does not create dependent groups nor edit DependsOn yet.Grupos dependentes — direto no asset da zona (DA_Zone), no array DependentGroups (Content Browser, ou abra a zona pela aba Product). Para cada um preencha GroupId, DependsOn (o código / RowName do item que destrava o grupo) e ItemRows (os códigos dos itens dentro dele). A ferramenta ainda não cria grupo dependente nem edita o DependsOn.

Example: a sofa, model → finishExemplo: um sofá, modelo → acabamento

The customer picks a sofa model, then only that model's finishes appear. O cliente escolhe um modelo de sofá, e aí só os acabamentos daquele modelo aparecem.

# In the EUW (root group)# No EUW (grupo root)
Root group "Sofa"  → ItemRows: Sofa_Casena, Sofa_Otto   # the models# os modelos

# In DA_Zone → DependentGroups (Content Browser)# No DA_Zone → DependentGroups (Content Browser)
"CasenaFinish"  DependsOn: Sofa_Casena  ItemRows: Sofa_Casena_ChalkWeave, ...Indigo, ...Ivory
"OttoFinish"    DependsOn: Sofa_Otto    ItemRows: Sofa_Otto_...  

At runtime, choosing the Casena model makes the configurator look through DependentGroups for a group whose DependsOn is the chosen item's code, and it shows CasenaFinish. Pick a finish and the material swaps. Em runtime, escolher o modelo Casena faz o configurador procurar nos DependentGroups um grupo cujo DependsOn seja o código do item escolhido, e mostra o CasenaFinish. Escolhe um acabamento e o material troca.

Two roles, don't confuse themDois papéis, não confunda

The Variant Manager (LVS) dependency makes the finish variant apply over the right model in the scene. The group's DependsOn makes the option group appear in the UI. They are set in different places and work together.A dependência do Variant Manager (LVS) faz a variante de acabamento aplicar sobre o modelo certo na cena. O DependsOn do grupo faz o grupo de opções aparecer na UI. São configurados em lugares diferentes e trabalham juntos.

After filling the dependent groups' ItemRows in DA_Zone, press Sync groups on the Catalog to write the correct Group column on those items (Sync sweeps root and dependent). Dependent groups also need a multiplier in the zone trigger — see the note under Multipliers. Depois de preencher os ItemRows dos grupos dependentes no DA_Zone, aperte Sync groups no Catalog para escrever a coluna Group correta nesses itens (o Sync varre root e dependentes). Grupos dependentes também precisam de um multiplicador no zone trigger — veja a nota na página Multipliers.

Zone trigger anatomyAnatomia do zone trigger

The BP_ZoneTrigger in the level (one per zone) does more than carry the multipliers. Its parts: O BP_ZoneTrigger no level (um por zona) faz mais do que carregar os multiplicadores. As partes dele:

  • ZoneRefthe zone data asset this trigger represents. Set it per instance in the level.o data asset da zona que esse trigger representa. Setado por instância no level.
  • Multipliersthe per-group area / quantity map used for pricing (see the pricing model).o mapa de área / quantidade por grupo usado no preço (veja o modelo de preço).
  • Trigger boxTrigger boxthe overlap volume that detects the player entering the room. For a zone whose detection is Trigger overlap, this is what activates it. Size it to cover the room's floor.o volume de overlap que detecta o jogador entrando no ambiente. Para uma zona cuja detecção é Trigger overlap, é isso que a ativa. Dimensione para cobrir o piso do ambiente.
  • Map label anchorMap label anchorthe point that places this room's name on the minimap. Move it to where the label should sit on the floor plan.o ponto que posiciona o nome deste ambiente no minimapa. Mova-o para onde o rótulo deve ficar na planta.
  • Teleport targetTeleport targetan arrow you place inside the room. When the customer jumps to this zone, the player is teleported to the arrow's position and facing its direction, so set both to a good vantage point.uma seta que você coloca dentro do ambiente. Quando o cliente pula para esta zona, o jogador é teleportado para a posição da seta e olhando na direção dela, então ajuste posição e direção para um bom ângulo.

The client table (login)A tabela de clientes (login)

The login checks the customer's access code against a client table, DT_Clients. Each row is one client. On a match it loads that client's data. O login confere o código de acesso do cliente contra uma tabela de clientes, o DT_Clients. Cada linha é um cliente. Ao casar, ele carrega os dados daquele cliente.

Login is by access code only — the customer never types an email. Each row (the S_ClientData struct) has these columns: O login é só por código de acesso — o cliente nunca digita e-mail. Cada linha (a struct S_ClientData) tem estas colunas:

ColumnColunaWhat it doesO que faz
NameThe client's name; it becomes the save slot for their session and the client in the order JSON.O nome do cliente; vira o slot de save da sessão e o client no JSON do pedido.
OrderIdA pre-assigned order id, used on the summary and as the key for the saved order and session.Um id de pedido pré-atribuído, usado no resumo e como chave do pedido e da sessão salvos.
PasswordThe access code, checked against what the customer types. Plain text, demo-grade — swap for real auth in production.O código de acesso, conferido contra o que o cliente digita. Texto plano, nível demo — troque por autenticação real em produção.
ProductThe product loaded for that client on login.O produto carregado para aquele cliente no login.
EmailThe client's email. Read from the row (no email field on screen) and carried into the order JSON (see Order data).O e-mail do cliente. Lido da linha (sem campo de e-mail na tela) e levado para o JSON do pedido (veja Dados do pedido).

To fill it: open DT_Clients, add a row per client, and set the fields. To choose which table the runtime uses, set it in the Clients field on the Project page (it lives on the project asset). Para preencher: abra o DT_Clients, adicione uma linha por cliente, e preencha os campos. Para escolher qual tabela o runtime usa, defina-a no campo Clients da página Project (ele fica no asset do projeto).

At least one client, or Configuration mode won't openPelo menos um cliente, ou o modo Configuration não abre

A project used in Configuration mode (the flow that starts with the client login) needs a Client Table with at least one client. The login reads the table, finds the client by code, and loads their product. With no clients in the table, the login finds nobody and there is no way into the configurator.Um projeto usado no modo Configuration (o fluxo que começa com o login do cliente) precisa de uma Client Table com pelo menos um cliente. O login lê a tabela, acha o cliente pelo código e carrega o produto dele. Sem nenhum cliente na tabela, o login não encontra ninguém e não há como entrar no configurador.

Doing it without the setup toolFazendo sem a ferramenta de setup

The tool is a convenience; every asset it writes can be edited directly. If you prefer working in the Content Browser, or need a field the tool does not cover, this is the same setup by hand: A ferramenta é uma conveniência; todo asset que ela escreve pode ser editado direto. Se você prefere trabalhar no Content Browser, ou precisa de um campo que a ferramenta não cobre, este é o mesmo setup na mão:

  1. Project — open or duplicate a BPDA_Project and fill its fields (see Project fields).Project — abra ou duplique um BPDA_Project e preencha os campos (veja Campos de Project).
  2. Product — open or duplicate a BPDA_Product; set its fields and its ItemsTable.Product — abra ou duplique um BPDA_Product; defina os campos e o ItemsTable.
  3. Items — edit DT_Items directly (see Filling DT_Items).Itens — edite o DT_Items direto (veja Preencher o DT_Items).
  4. Zones — open or duplicate a BPDA_Zone; fill RootGroups and DependentGroups (GroupId, DisplayName, Icon, ItemRows, and DependsOn on the dependent ones).Zones — abra ou duplique um BPDA_Zone; preencha RootGroups e DependentGroups (GroupId, DisplayName, Icon, ItemRows, e o DependsOn nos dependentes).
  5. Triggers — place a BP_ZoneTrigger per zone; set ZoneRef and the Multipliers map, and position the trigger box, map label anchor, and teleport target (see Zone trigger anatomy).Triggers — coloque um BP_ZoneTrigger por zona; defina o ZoneRef e o mapa Multipliers, e posicione o trigger box, o map label anchor e o teleport target (veja Anatomia do zone trigger).
  6. Login — fill DT_Clients and set it on the Game Instance (see Client table).Login — preencha o DT_Clients e aponte na Game Instance (veja Tabela de clientes).
  7. Maps & settings — see Migrating to your project.Mapas e settings — veja Migrar para o seu projeto.

Keep names consistent (ZoneId, GroupId, item codes): everything references by name, so a rename in one place must be matched in the others. Mantenha os nomes consistentes (ZoneId, GroupId, códigos de item): tudo referencia por nome, então um rename num lugar tem que ser espelhado nos outros.

Current tool limitationsLimitações atuais da ferramenta

Do these in the DataTable / asset for nowFaça na DataTable / asset por enquanto

The setup tool does not yet cover: editing an item's CustomData; creating or editing dependent groups and their DependsOn; and removing a single item from a group (the card only adds — remove via the zone's ItemRows or by recreating the group). Everything else — projects, products, zones, root groups, item rows (including Thumbnail, Description, and MeasureType), group assignment, variant linking, multipliers, validation, and save — is in the tool.A ferramenta ainda não cobre: editar o CustomData de um item; criar ou editar grupos dependentes e o DependsOn deles; e remover um item específico de um grupo (o card só adiciona — remova pelos ItemRows da zona ou recriando o grupo). Todo o resto — projetos, produtos, zonas, grupos root, linhas de item (inclusive Thumbnail, Description e MeasureType), atribuição de grupo, ligação de variante, multiplicadores, validação e save — está na ferramenta.

AdvancedAvançado

Migrating to your projectMigrar para o seu projeto

Most people just use Create Project from the template and drop their assets inside — then you can skip this page. Read on only if you want to bring the template's content into a project you already have. A maioria só usa Create Project a partir do template e coloca os assets dentro — aí você pode pular esta página. Continue só se quiser trazer o conteúdo do template para um projeto que você já tem.

  1. Enable the pluginsHabilitar os plugins

    In your project, open Edit → Plugins and enable Variant Manager (the configurator needs it for visual swaps), then restart the editor. If you also import archviz scenes, enable the Datasmith / Interchange tools too. See Requirements & plugins.No seu projeto, abra Edit → Plugins e habilite o Variant Manager (o configurador precisa dele para as trocas visuais), depois reinicie o editor. Se você também importa cenas de archviz, habilite as ferramentas Datasmith / Interchange também. Veja Requisitos e plugins.

  2. Migrate the contentMigrar o conteúdo

    Open the template project, right-click the template's top content folder in the Content Browser, and choose Migrate. Point it at your project's Content folder. Unreal copies the assets and everything they depend on.Abra o projeto do template, clique com o botão direito na pasta de conteúdo raiz do template no Content Browser, e escolha Migrate. Aponte para a pasta Content do seu projeto. A Unreal copia os assets e tudo de que eles dependem.

  3. Set the Game InstanceDefinir a Game Instance

    In Project Settings → Maps & Modes, set Game Instance Class to BPS_ConfiguratorGameInstance. This holds the shared runtime state and the login client-table default, so the runtime does not work without it.Em Project Settings → Maps & Modes, defina o Game Instance Class para BPS_ConfiguratorGameInstance. É o que guarda o estado compartilhado do runtime e o default da tabela de clientes do login, então o runtime não funciona sem ele.

  4. Set the maps and game modesDefinir os mapas e game modes

    In the same Maps & Modes section, set the Editor Startup Map and Game Default Map to L_Entry. Its game mode should be BP_EntryGameMode. On each product level, set the GameMode Override in World Settings to BP_ConfiguratorGameMode (which uses BP_HUD). See Entry level, game modes, and game instance.Na mesma seção Maps & Modes, defina o Editor Startup Map e o Game Default Map para o L_Entry. O game mode dele deve ser o BP_EntryGameMode. Em cada level de produto, defina o GameMode Override em World Settings para o BP_ConfiguratorGameMode (que usa o BP_HUD). Veja Level inicial, game modes e game instance.

  5. Check the login client tableConferir a tabela de clientes do login

    Confirm the client table (DT_Clients) is still set as the default on the Game Instance, so login works. Edit that table to set your own access codes.Confirme que a tabela de clientes (DT_Clients) continua definida como default na Game Instance, para o login funcionar. Edite essa tabela para definir os seus próprios códigos de acesso.

  6. Keep projects in the scanned folderManter os projetos na pasta escaneada

    The setup tool's Home page only lists projects from a fixed folder. Keep your BPDA_Project assets there (or press Sync after moving them) so the tool finds them.A página Home da ferramenta só lista projetos de uma pasta fixa. Mantenha os seus assets BPDA_Project ali (ou aperte Sync depois de movê-los) para a ferramenta achá-los.

Confirm the specificsConfirmar os detalhes

Input mappings and any other default classes should be matched to what the sample project uses (open the sample's Project Settings and World Settings and mirror them). No Lumen or lighting setup is needed: the template runs under any lighting.Os input mappings e quaisquer outras classes default devem ser espelhados do que o projeto de exemplo usa (abra o Project Settings e o World Settings do exemplo e copie). Nenhum setup de Lumen ou iluminação é necessário: o template roda sob qualquer iluminação.

Runtime sideLado de runtime

The runtimeO runtime

The runtime is the playable configurator your customer uses. It reads the same data you set up, so it needs no separate configuration. This is the flow it follows. O runtime é o configurador jogável que o seu cliente usa. Ele lê os mesmos dados que você configurou, então não precisa de configuração à parte. Este é o fluxo que ele segue.

Splash → login → product selection → scene → room navigation → item choice per group → price → summary → order.Splash → login → seleção de produto → cena → navegação por ambientes → escolha de item por grupo → preço → resumo → pedido.

Entry level, game modes, and game instanceLevel inicial, game modes e game instance

The game boots into the entry level, L_Entry. Its game mode, BP_EntryGameMode, reads the project's Mode and spawns the matching widgets at startup, so this is where the splash, login, and product selection live. Choosing a product opens that product's level through its LevelPath. O jogo inicia no level de entrada, o L_Entry. O game mode dele, o BP_EntryGameMode, lê o Mode do projeto e cria as widgets certas na inicialização, então é aqui que ficam o splash, o login e a seleção de produto. Escolher um produto abre o level dele pelo LevelPath.

Inside a product level the game mode is BP_ConfiguratorGameMode, which runs the main HUD through BP_HUD (it spawns the on-screen HUD and uses the splash as a loading curtain until the scene settles). The Game Instance is the same across every map: BPS_ConfiguratorGameInstance, which holds the shared state (current project and product, selections, budget, summary, order). Dentro de um level de produto, o game mode é o BP_ConfiguratorGameMode, que comanda o HUD principal pelo BP_HUD (cria o HUD na tela e usa o splash como cortina de carregamento até a cena assentar). A Game Instance é a mesma em todos os mapas: o BPS_ConfiguratorGameInstance, que guarda o estado compartilhado (projeto e produto atuais, seleções, orçamento, resumo, pedido).

Runs inRoda emClassClasseJobFunção
Entry levelLevel de entrada (L_Entry)BP_EntryGameModeReads the project Mode and spawns the startup widgets (splash, login, product menu).Lê o Mode do projeto e cria as widgets de inicialização (splash, login, menu de produto).
Product levelsLevels de produtoBP_ConfiguratorGameMode (+ BP_HUD)Runs the in-scene main HUD during configuration.Comanda o HUD principal na cena durante a configuração.
Every mapTodos os mapasBPS_ConfiguratorGameInstanceThe Game Instance holding the shared state across the session.A Game Instance que guarda o estado compartilhado durante a sessão.

Exploration vs ConfigurationExploration x Configuration

The project's Mode decides how the entry screen works. Set it before you deploy. O Mode do projeto decide como a tela de entrada funciona. Defina antes do deploy.

  • Configurationthe entry opens the client login. The project needs a client table with at least one client, each pointing to a product; the client logs in and their product loads, with live pricing, summary, and order. This is the per-client sales flow.a entrada abre o login de cliente. O projeto precisa de uma client table com pelo menos um cliente, cada um apontando para um produto; o cliente loga e o produto dele carrega, com preço ao vivo, resumo e pedido. É o fluxo de vendas por cliente.
  • Explorationthe entry opens a product selector, with no login and no client table, and prices are not shown. Good for a public showroom or a sales stand where the price is not needed or not wanted. The customer picks a product and explores it.a entrada abre um seletor de produtos, sem login e sem client table, e os preços não aparecem. Bom para showroom público ou stand de vendas onde o preço não é necessário ou não é desejado. O cliente escolhe um produto e explora.
Three different things, don't mix them upTrês coisas diferentes, não confunda

Exploration mode (the project field above) is not the same as the Explore button or Cinema mode, which exist in both modes: the Explore button sits with the room icons and toggles the minimap on and off even while you are inside a room; Cinema mode (top-right corner) hides the interface for a clean view.O modo Exploration (o campo do projeto acima) não é a mesma coisa que o botão Explore nem o modo Cinema, que existem nos dois modos: o botão Explore fica junto dos ícones de ambiente e liga/desliga o minimapa mesmo dentro de um ambiente; o modo Cinema (canto superior direito) esconde a interface para uma vista limpa.

Splash and loginSplash e login

The splash uses the project's hero image and display name. The login validates against the project's client table (DT_Clients, set on the Project page), which needs at least one client or there is no way in (see Client table). It is a demo gate, meant to be swapped for your own auth if you need one.O splash usa a hero image e o display name do projeto. O login valida contra a tabela de clientes do projeto (DT_Clients, definida na página Project), que precisa de pelo menos um cliente ou não há como entrar (veja Tabela de clientes). É uma trava de demonstração, pensada para ser trocada pela sua própria autenticação se você precisar.

Product selectionSeleção de produto

Product cards show the thumbnail, display name, description, and optional badge. Choosing one opens the product's level with the product's camera (FPS walkthrough or orbital).Os cards de produto mostram o thumbnail, o display name, a descrição e o selo opcional. Escolher um abre o level do produto com a câmera do produto (FPS walkthrough ou orbital).

Room navigation and item choiceNavegação e escolha de itens

Zones activate by trigger overlap or manually, depending on the zone's detection type. The rail and minimap show the rooms by name and icon. In each room, the root groups always appear; dependent groups appear once an item unlocks them. The customer picks items from the groups.As zonas ativam por overlap de trigger ou manualmente, conforme o detection type da zona. O rail e o minimapa mostram os ambientes por nome e ícone. Em cada ambiente, os root groups sempre aparecem; os dependent groups aparecem depois que um item os destrava. O cliente escolhe os itens dos grupos.

Price, summary, and orderPreço, resumo e pedido

Each item's price is multiplied by its group's multiplier in that room, and the currency symbol comes from the project. A running total follows the session. The summary screen builds the lines per room; confirming the order saves a local record and prepares a JSON payload — see Order data & export.O preço de cada item é multiplicado pelo multiplicador do grupo dele naquele ambiente, e o símbolo de moeda vem do projeto. Um total corrente acompanha a sessão. A tela de resumo monta as linhas por ambiente; confirmar o pedido grava um registro local e prepara um payload JSON — veja Dados do pedido e export.

Language and themeIdioma e tema

If the project allows a language switch, the selector shows up in the pause settings; the starting language is the project default. The pause settings also hold a Light / Dark theme switch, and the whole look comes from the UI theme (see Themes). The project's mode is covered above under Exploration vs Configuration.Se o projeto permite troca de idioma, o seletor aparece nas settings da pausa; o idioma inicial é o default do projeto. As settings da pausa também trazem uma troca de tema Light / Dark, e todo o visual vem do tema de UI (veja Temas). O mode do projeto está coberto acima em Exploration x Configuration.

The main UI panelsOs painéis principais da UI

One source of truthUma fonte de verdade

Behind the screens sits the Game Instance (BPS_ConfiguratorGameInstance) that holds the current project and product, the selection per zone, the budget per zone, the grouped summary, and the order. The panels do not talk to each other; they read from it and react to its events. That is why the rail, the status pill, the cards, and the detail panel all stay in sync the moment an option is applied.Por trás das telas está a Game Instance (BPS_ConfiguratorGameInstance) que guarda o projeto e o produto atuais, a seleção por zona, o orçamento por zona, o resumo agrupado e o pedido. Os painéis não conversam entre si; eles leem dela e reagem aos eventos dela. É por isso que o rail, a status pill, as cartas e o painel de detalhe se mantêm em sincronia no instante em que uma opção é aplicada.

The runtime screens, in the order the customer meets them: As telas do runtime, na ordem em que o cliente as encontra:

  • Splash (WBP_Splash)a brand curtain with a progress bar, also used as the loading cover while a product level materializes. It steps aside when its animation finishes.uma cortina de marca com barra de progresso, usada também como cobertura de carregamento enquanto o level do produto materializa. Ela sai quando a animação termina.
  • Login (WBP_Login)shows the active project (hero, company, name). The customer types an access code, matched against the client table; on success it loads the client's name (the save slot), their product, and a pre-assigned order id used later on the summary. The demo password is plain text.mostra o projeto ativo (hero, empresa, nome). O cliente digita um código de acesso, casado contra a tabela de clientes; no sucesso carrega o nome do cliente (o slot de save), o produto dele e um id de pedido pré-atribuído, usado depois no resumo. A senha de demonstração é texto plano.
  • Product cardCard de produto (WBP_ProductCard)one card in the start menu per product, with thumbnail, name, description, a badge (hidden when empty), and a room icon per zone. Selecting it loads the product and opens its level.um card no menu inicial por produto, com thumbnail, nome, descrição, um selo (escondido quando vazio) e um ícone de cômodo por zona. Selecionar carrega o produto e abre o level dele.
  • Main HUDHUD principal (WBP_MainHUD)the overlay that stays on screen during the experience. It shows and hides the sub-panels by state (navigating, in a zone, editing), keeps the rail, category bar, options panel, and detail panel in step, and toggles the minimap. The zone status pill shows how many groups you have chosen in the active zone (for example "3 of 5"). It also drives cinema mode, which hides the chrome for a clean view.o overlay que fica na tela durante a experiência. Ele mostra e esconde os sub-painéis conforme o estado (navegando, numa zona, editando), mantém o rail, a barra de categorias, o painel de opções e o painel de detalhe alinhados, e liga/desliga o minimapa. A status pill da zona mostra quantos grupos você escolheu na zona ativa (por exemplo "3 de 5"). Também comanda o modo cinema, que esconde a interface para uma vista limpa.
  • Zone railRail de zonas (WBP_ZoneRail)the side list of rooms. Collapsed it shows only the icons; on hover it expands to show the zone names, and a pin button keeps it open. The active zone is tinted (the shade comes from the theme). A "done" badge appears over a zone once every group in it has a chosen item. Because the collapsed rail is narrow, keep zone names short so they don't clip.a lista lateral de ambientes. Recolhida mostra só os ícones; no hover ela expande e mostra os nomes das zonas, e um botão de pin a mantém aberta. A zona ativa fica com um tom diferente (a cor vem do tema). Um badge de "done" aparece sobre a zona quando todo grupo dela tem um item escolhido. Como o rail recolhido é estreito, use nomes de zona curtos para não cortar.
  • Category barBarra de categorias (WBP_CategoryBar)the tabs for the current zone's groups, one tab per group, kept in sync with the active group.as abas dos grupos da zona atual, uma aba por grupo, em sincronia com o grupo ativo.
  • Options panelPainel de opções (WBP_OptionsPanel)lists the items of the active group as cards, with a search box when there is more than one. It pre-selects the card matching the zone's current choice and re-reads the selection after an undo or a restore, so it always shows the right item. It asks the HUD to open the detail panel rather than opening it itself.lista os itens do grupo ativo como cartas, com uma busca quando há mais de um. Pré-seleciona a carta que casa com a escolha atual da zona e relê a seleção após um undo ou um restore, então sempre mostra o item certo. Ele pede ao HUD para abrir o painel de detalhe, em vez de abrir sozinho.
  • Item cardCarta de item (WBP_ItemCard)one option in the list: name, brand, thumbnail, and price (unit price plus price × quantity, with a per-unit suffix from the measure). Clicking it applies the item; the info button opens the detail panel instead. Idle / hover / selected states come from the theme. Cards have a fixed width and the name shrinks to fit, so keep item names short and leave longer text for the detail panel.uma opção na lista: nome, marca, thumbnail e preço (preço unitário mais preço × quantidade, com sufixo por unidade vindo da medida). Clicar aplica o item; o botão de info abre o painel de detalhe em vez de aplicar. Os estados idle / hover / selected vêm do tema. Os cards têm largura fixa e o nome encolhe para caber, então use nomes de item curtos e deixe o texto mais longo para o painel de detalhe.
  • Detail panelPainel de detalhe (WBP_DetailPanel)the full sheet for one option: hero image, name, brand, description, a spec line per custom attribute (from the item's CustomData), base price and quantity, and the computed total. Its button reads "Apply" when the option is not the active one, and "Applied" (disabled) when it is.a ficha completa de uma opção: imagem hero, nome, marca, descrição, uma linha de spec por atributo custom (do CustomData do item), preço-base e quantidade, e o total calculado. O botão mostra "Apply" quando a opção não é a ativa, e "Applied" (desabilitado) quando é.
  • Budget popoverPopover de orçamento (WBP_BudgetPopover)the per-zone breakdown: one line per zone from the budget map, plus the overall total. "View Summary" opens the full summary.o detalhamento por zona: uma linha por zona a partir do mapa de orçamento, mais o total geral. "View Summary" abre o resumo completo.
  • Summary screenTela de resumo (WBP_SummaryScreen)the final review, one block per room with the product name, total, and counts. Confirming generates the order (using the order payload and the order id from login).a revisão final, um bloco por cômodo com o nome do produto, o total e as contagens. Confirmar gera o pedido (usando o order payload e o id de pedido do login).
  • Pause (WBP_Pause)a paused overlay with pages (menu, settings, controls, and reset / exit guards). Settings hold the language switch (hidden when the project disallows it) and the Light / Dark theme switch.um overlay de pausa com páginas (menu, settings, controles, e guardas de reset / saída). As settings trazem a troca de idioma (escondida quando o projeto não permite) e a troca de tema Light / Dark.
  • Resume dialogDiálogo de retomar (WBP_ResumeDialog)on return, offers Continue (keep the save) or Start Over (delete it).ao voltar, oferece Continue (mantém o save) ou Start Over (apaga).
🎬
images/vid-zonerail.mp4
The zone rail: collapsed (icons) vs hovered (names), and the pinO zone rail: recolhido (ícones) vs hover (nomes), e o pin
The zone rail collapsing, expanding on hover, and pinned open.O zone rail recolhendo, expandindo no hover, e fixado aberto.

Annotated screensTelas anotadas

The two HUD captures below carry numbered markers; the same number is the same panel in both modes. Exploration has no total, no category bar, and no options panel (no prices), and its status pill reads "Exploring". The panels that only open on a click are shown after. As duas capturas do HUD abaixo trazem marcadores numerados; o mesmo número é o mesmo painel nos dois modos. O Exploration não tem total, barra de categorias nem painel de opções (sem preços), e a status pill dele diz "Exploring". Os painéis que só abrem no clique vêm depois.

#PanelPainel
1Brand header.Cabeçalho de marca.
2Explore button — toggles the floor-plan minimap, even inside a room. Labelled "Explore" in the expanded rail.Botão Explore — liga/desliga a planta/minimapa, mesmo dentro de um ambiente. Aparece escrito "Explore" no rail expandido.
3Zone rail — the rooms. A green dot marks a room whose groups are all chosen; the active room is highlighted. Collapsed it shows icons; hover expands to names; the pin keeps it open.Zone rail — os ambientes. Um ponto verde marca o ambiente com todos os grupos escolhidos; o ativo fica destacado. Recolhido mostra ícones; o hover expande para nomes; o pin mantém aberto.
4Status pill — Configuration: room + "x of y selected"; Exploration: "Exploring · product".Status pill — Configuration: ambiente + "x de y selecionados"; Exploration: "Exploring · produto".
5Cinema mode — hides the whole interface for a clean view (toggle, or ESC to return).Modo cinema — esconde toda a interface para uma vista limpa (botão, ou ESC para voltar).
6Total / budget — the running total; opens the per-zone breakdown. Configuration only.Total / orçamento — o total corrente; abre o detalhamento por zona. Só em Configuration.
7Category bar — the groups of the current room. Configuration only.Barra de categorias — os grupos do ambiente atual. Só em Configuration.
8Options panel — the item cards with prices; the ⓘ on a card opens the detail panel. Configuration only.Painel de opções — os cards de item com preços; o ⓘ de um card abre o painel de detalhe. Só em Configuration.
9Floor-plan minimap — shown when Explore (2) is on.Planta / minimapa — aparece quando o Explore (2) está ligado.
HUD in Configuration mode, numbered
📷
images/hud-configuration-numbered.png
HUD in Configuration mode, with numbered markersHUD no modo Configuration, com marcadores numerados
Configuration mode: login flow, with prices, groups, and the options panel.Modo Configuration: fluxo com login, com preços, grupos e o painel de opções.
HUD in Exploration mode, numbered
📷
images/hud-exploration-numbered.png
HUD in Exploration mode, with numbered markersHUD no modo Exploration, com marcadores numerados
Exploration mode: product tour, no login and no prices; the floor plan is on.Modo Exploration: passeio pelo produto, sem login e sem preços; a planta está ligada.
Applying an itemAplicando um item

When you apply an item, a short toast appears under the status pill (for example "Light Oak Veneer applied + $2.080"). The detail panel (opened by the ⓘ on a card) shows the item's specs and price and an Apply button — which reads Applied (disabled) on the item that is already active.Ao aplicar um item, um toast curto aparece embaixo da status pill (por exemplo "Light Oak Veneer applied + $2.080"). O painel de detalhe (aberto pelo ⓘ de um card) mostra as specs e o preço do item e um botão Apply — que vira Applied (desabilitado) no item que já está ativo.

Item detail panel — not applied
📷
images/hud-detail-panel-apply.png
Detail panel of an item that is not applied — the button reads ApplyPainel de detalhe de um item não aplicado — o botão mostra Apply
Detail panel of an item that is not applied yet: the button reads Apply.Painel de detalhe de um item ainda não aplicado: o botão mostra Apply.
Item detail panel — applied
📷
images/hud-detail-panel-applied.png
Detail panel of the active item — the button reads Applied (disabled)Painel de detalhe do item ativo — o botão mostra Applied (desabilitado)
Detail panel of the item that is currently applied: the button reads Applied and is disabled.Painel de detalhe do item que está aplicado: o botão mostra Applied e fica desabilitado.
Cinema mode
📷
images/hud-cinema.png
Cinema mode: the interface hidden for a clean viewModo cinema: a interface escondida para uma vista limpa
Cinema mode hides the interface.O modo cinema esconde a interface.
Zone rail expanded and pinned
📷
images/hud-rail-expanded.png
The rail expanded (ROOMS, Explore, room names) with the pin onO rail expandido (ROOMS, Explore, nomes dos ambientes) com o pin ligado
The zone rail expanded and pinned open.O zone rail expandido e fixado aberto.
Budget popover
📷
images/budget-popover.png
The budget popover (opens from the total)O budget popover (abre a partir do total)
The budget popover, opened from the running total.O budget popover, aberto a partir do total corrente.
Summary screen
📷
images/summary-screen.png
The summary screen (opens from View Summary)A tela de resumo (abre pelo View Summary)
The summary screen, opened from the budget popover.A tela de resumo, aberta pelo budget popover.

MinimapMinimapa

The minimap is a calibrated static floor plan, not a live top-down camera. This matters when you prepare a new level: you place a calibrator and a floor-plan image, you do not configure a scene capture. O minimapa é uma planta baixa estática calibrada, não uma câmera de topo ao vivo. Isso importa quando você prepara um level novo: você coloca um calibrador e uma imagem de planta, não configura um scene capture.

Setting it up in a levelConfigurando num level

  1. Place a BP_MinimapCalibrator actor in the level and set its FloorPlanTexture to your floor-plan image.Coloque um ator BP_MinimapCalibrator no level e defina o FloorPlanTexture dele com a sua imagem de planta.
  2. In the editor, the plan draws on a plane. Move and scale that plane over the level until it lines up with the real rooms; that calibrates the world rectangle that becomes the map.No editor, a planta é desenhada num plano. Mova e escale esse plano sobre o level até casar com os ambientes reais; isso calibra o retângulo de mundo que vira o mapa.
  3. At play, the plane hides itself (it is only a calibration guide) and registers with the subsystem, which then knows how to turn a world position into a map coordinate. The floor-plan image becomes the minimap background.No play, o plano se esconde (é só um guia de calibração) e se registra no subsistema, que passa a saber converter uma posição de mundo em coordenada de mapa. A imagem da planta vira o fundo do minimapa.
No calibrator, no minimapSem calibrador, sem minimapa

Without a valid calibrator, the minimap does not show at all. A level with no minimap set up simply has none, which is fine if that product does not need one.Sem um calibrador válido, o minimapa não aparece. Um level sem minimapa configurado simplesmente não tem, o que está ok se aquele produto não precisar de um.

Labels and the player pinRótulos e o marcador do jogador

The minimap widget (WBP_Minimap) projects world positions to pixels on the map. For each zone it finds the registered zone trigger and drops a room label (WBP_MinimapLabel) at the trigger's position; a label turns "done" once that room has at least one choice. A timer moves the player pin to the pawn's position and rotates it to the camera heading, so the marker points where the customer is looking. O widget do minimapa (WBP_Minimap) projeta posições de mundo em pixels no mapa. Para cada zona ele acha o zone trigger registrado e coloca um rótulo de cômodo (WBP_MinimapLabel) na posição do trigger; um rótulo fica "done" quando aquele cômodo tem ao menos uma escolha. Um timer move o marcador do jogador para a posição do pawn e o gira para a direção da câmera, então o marcador aponta para onde o cliente está olhando.

The player pin's rotation adds a +90° offset to the camera yaw to line the icon up with the viewing direction. If you swap the pin art and it ends up rotated, adjust that offset (90, -90, or 180) in UpdatePlayerPin on WBP_Minimap. A rotação do marcador do jogador soma um offset de +90° ao yaw da câmera para alinhar o ícone com a direção do olhar. Se você trocar a arte do marcador e ele ficar girado, ajuste esse offset (90, -90 ou 180) em UpdatePlayerPin no WBP_Minimap.

🎬
images/vid-runtime-tour.mp4
Short runtime tour: navigating rooms, picking items, price updatingTour curto do runtime: navegando ambientes, escolhendo itens, preço atualizando
A short tour of the runtime configurator.Um tour curto do configurador de runtime.
Runtime sideLado de runtime

Order data & exportDados do pedido e export

When the customer confirms the order, the configurator builds the full order, saves a local record on disk, and prepares a JSON payload ready for integration. All of this is pure Blueprint — no external plugin is needed to generate and store the data — and it works in the packaged build. Quando o cliente confirma o pedido, o configurador monta o pedido inteiro, grava um registro local em disco e prepara um payload JSON pronto para integração. Tudo isso é Blueprint puro — nenhum plugin externo é necessário para gerar e guardar os dados — e funciona no build empacotado.

What happens on confirmO que acontece ao confirmar

Confirming the order (the ConfirmOrder flow) does, in order: builds the order payload, serializes it to a JSON string, saves a local order record, fires the OnOrderConfirmed event, calls the SendVendorEmail hook, and saves the resume session. Confirmar o pedido (o fluxo ConfirmOrder) faz, nesta ordem: monta o payload do pedido, serializa em uma string JSON, grava um registro local do pedido, dispara o evento OnOrderConfirmed, chama o hook SendVendorEmail e salva a sessão de retomada.

Where the order is savedOnde o pedido é salvo

The order is written as an Unreal SaveGame to the slot Order_{OrderId} (the OrderId with no spaces or # — e.g. LMR #0802Order_LMR0802). The physical file is: O pedido é gravado como um SaveGame da Unreal no slot Order_{OrderId} (o OrderId sem espaços e sem # — ex.: LMR #0802Order_LMR0802). O arquivo físico é:

{GameDir}/Saved/SaveGames/Order_{OrderId}.sav

It is a binary .sav, next to the executable in the packaged build — not a human-readable .json. The record holds the OrderId, client name, client email, project, product, currency, grand total, timestamp, and the full order JSON string. Saving is an upsert per client: one record per client, and a new confirmation overwrites the previous one for the same client (no history is kept). É um .sav binário, ao lado do executável no build empacotado — não é um .json legível. O registro guarda o OrderId, o nome e o e-mail do cliente, o projeto, o produto, a moeda, o total geral, o timestamp e a string JSON completa do pedido. A gravação é um upsert por cliente: um registro por cliente, e uma nova confirmação sobrescreve a anterior do mesmo cliente (não guarda histórico).

The JSON payloadO payload JSON

The JSON carries the client and project data, the total, and the breakdown per zone. Each zone line has the item's code, name, brand, unit, basePrice, quantity, and subtotal. O JSON carrega os dados do cliente e do projeto, o total, e o detalhamento por zona. Cada linha de zona tem o code, name, brand, unit, basePrice, quantity e subtotal do item.

{
  "project": "Lumora Residences",
  "orderId": "LMR #0802",
  "client": "João Pereira",
  "email": "joao_pereira@testemail.com",
  "timestamp": "2026-07-29 16:27",
  "currency": "$",
  "total": 5005.0,
  "zones": [
    {
      "zone": "Kitchen",
      "subtotal": 2954.0,
      "lines": [
        { "code": "CtrK_GreyMist", "name": "Grey Mist Granite", "brand": "StoneWorks Studio",
          "unit": "m²", "basePrice": 310.0, "quantity": 2.4, "subtotal": 744.0 }
      ]
    }
  ]
}

Resume sessionSessão de retomada

Separately, the configurator saves a resume session to the slot Config_{OrderId} (per client), so the customer can pick up where they left off. Restoring brings back only the customer's choices and the confirmation state; the identity (name, email, OrderId) always comes from the login, never from the save. That makes it safe when several clients use the same machine (for example a builder inviting clients to configure on-site): each one resumes only their own configuration. À parte, o configurador salva uma sessão de retomada no slot Config_{OrderId} (por cliente), para o cliente continuar de onde parou. A restauração traz de volta só as escolhas do cliente e o estado de confirmação; a identidade (nome, e-mail, OrderId) vem sempre do login, nunca do save. Isso deixa seguro quando vários clientes usam a mesma máquina (por exemplo, uma construtora convidando clientes a configurar no local): cada um retoma só a própria configuração.

Sending it out (CRM / email hook)Enviando para fora (hook de CRM / e-mail)

By design, the template does not send the order anywhere on its own (so it carries no email or HTTP dependency). It gives you two places to plug in your own integration: Por design, o template não envia o pedido para lugar nenhum sozinho (assim não carrega dependência de e-mail nem de HTTP). Ele te dá dois lugares para plugar a sua integração:

  • The SendVendorEmail hook — a function with a placeholder log. Replace its body with your call (CRM plugin, HTTP request, file write).O hook SendVendorEmail — uma função com um log placeholder. Substitua o corpo pela sua chamada (plugin de CRM, requisição HTTP, escrita de arquivo).
  • The OnOrderConfirmed dispatcher — fires at confirmation; bind your own logic to it.O dispatcher OnOrderConfirmed — dispara na confirmação; dê bind na sua própria lógica.

In either one, the data is in LastOrderPayload (the struct) and LastOrderJson (the string). Because the order is upsert per client, your CRM integration should also upsert by OrderId rather than create a new order each time. Em qualquer um dos dois, os dados estão em LastOrderPayload (a struct) e LastOrderJson (a string). Como o pedido é upsert por cliente, a sua integração de CRM também deve fazer upsert pelo OrderId em vez de criar um pedido novo a cada envio.

Writing a real .json file needs a pluginEscrever um .json de verdade precisa de plugin

Pure Blueprint saves the order to disk as a SaveGame, but cannot, on its own, write a readable .json file to a folder — that needs C++ or a file-IO plugin. The JSON string already exists (in the .sav and at the hook); taking it and writing a readable file, or pushing to a CRM in real time, is a separate plugin tutorial, outside what the template ships.Blueprint puro grava o pedido em disco como SaveGame, mas não consegue, sozinho, escrever um .json legível numa pasta — isso precisa de C++ ou de um plugin de file-IO. A string JSON já existe (no .sav e no hook); pegar ela e escrever um arquivo legível, ou mandar pro CRM em tempo real, é um tutorial de plugin à parte, fora do que o template entrega.

Coming: JSON export guideEm breve: guia de export JSON

A step-by-step for exporting the data as a real JSON file using a plugin will be added here.Um passo a passo para exportar os dados como um arquivo JSON de verdade usando um plugin será adicionado aqui.

Orphan choices are prunedEscolhas órfãs são podadas

Dependent groups (the finishes) only count while the item that unlocks them is still chosen. If the customer swaps the sofa, the previous sofa's finish loses its meaning, so it is dropped from the selection right away. The progress counter, the total, and the order JSON always read the cleaned selection — an orphan finish never inflates the count or the price. Grupos dependentes (os acabamentos) só contam enquanto o item que os destrava continua escolhido. Se o cliente troca o sofá, o acabamento do sofá anterior perde o sentido, então é removido da seleção na hora. O contador de progresso, o total e o JSON do pedido leem sempre a seleção já limpa — um acabamento órfão nunca infla a contagem nem o preço.

AppearanceAparência

ThemesTemas

The whole runtime interface takes its colors and style from one asset, the theme. Swap the theme, and every screen repaints. A interface de runtime inteira tira as cores e o estilo de um asset, o tema. Troque o tema, e toda tela se repinta.

What a theme isO que é um tema

BPDA_UITheme is a data asset that holds the runtime UI's color and style tokens (around 40 fields). The project points at one through its Theme field, and that theme drives the look across every runtime screen. Currency symbol and languages are project fields, not theme fields, so they do not change when you swap the theme. O BPDA_UITheme é um data asset que guarda os tokens de cor e estilo da UI de runtime (cerca de 40 campos). O projeto aponta para um pelo campo Theme, e esse tema comanda o visual em toda tela do runtime. Símbolo de moeda e idiomas são campos do projeto, não do tema, então eles não mudam quando você troca o tema.

Almost every runtime widget reads the theme through three hooks: one reapplies everything, one applies the fonts, and one rebuilds the borders and brushes from the colors. Swapping the theme fires these in cascade, so a token change lands across the whole interface at once. Documenting the tokens is, in practice, documenting the product's style kit. Quase todo widget de runtime lê o tema por três ganchos: um reaplica tudo, um aplica as fontes, e um reconstrói as bordas e os brushes a partir das cores. Trocar o tema dispara esses ganchos em cascata, então uma mudança de token vale para a interface inteira de uma vez. Documentar os tokens é, na prática, documentar o kit de estilo do produto.

Create or swap a themeCriar ou trocar um tema

  1. In the Content Browser, duplicate an existing theme (or the theme template) and rename it.No Content Browser, duplique um tema existente (ou o template de tema) e renomeie.
  2. Open it and edit the color and style fields to taste.Abra e edite os campos de cor e estilo a gosto.
  3. Set it on the project's Theme field. The runtime repaints from it.Aponte ele no campo Theme do projeto. O runtime se repinta a partir dele.

The template already includes a Light and a Dark theme. The pause menu lets the customer switch between them at runtime, and the project's Theme sets which one it opens with. To offer your own look, edit those two (or add more) and keep BrandLogo paired to each so a dark theme carries a light logo. O template já inclui um tema Light e um Dark. O menu de pausa deixa o cliente alternar entre eles em runtime, e o campo Theme do projeto define com qual ele abre. Para oferecer o seu próprio visual, edite esses dois (ou adicione mais) e mantenha o BrandLogo pareado a cada um, para um tema escuro levar uma logo clara.

The two places a theme appearsOs dois lugares onde o tema aparece

Theme enters the product in two spots, and it is worth telling them apart because they behave differently. O tema entra no produto em dois lugares, e vale separá-los porque eles se comportam de formas diferentes.

  • The project's base theme — the Theme field on BPDA_Project (covered above). It sets the theme the whole interface opens with. Point it at a different DA_UITheme and the entire look changes, with no code.O tema base do projeto — o campo Theme do BPDA_Project (visto acima). Define o tema com que a interface inteira abre. Aponte para outro DA_UITheme e o visual todo muda, sem código.
  • The pause theme switcherSeg_Theme in WBP_Pause, a two-option segmented control (Light / Dark) the customer can flip at runtime. This list is fixed, not an automatic list of every theme: BuildThemeOptions fills it with two labels, and the control's OnSelectionChanged branches by index — index 0 calls SetTheme(DA_UIThemeLight), otherwise SetTheme(DA_UIThemeDark). The two assets are DA_UIThemeLight and DA_UIThemeDark, in Configurator/UI/UI_Themes.O seletor de tema na pausa — o Seg_Theme no WBP_Pause, um controle segmentado de duas opções (Light / Dark) que o cliente troca em runtime. Essa lista é fixa, não é uma lista automática de todos os temas: o BuildThemeOptions enche com dois rótulos, e o OnSelectionChanged do controle ramifica por índice — índice 0 chama SetTheme(DA_UIThemeLight), senão SetTheme(DA_UIThemeDark). Os dois assets são o DA_UIThemeLight e o DA_UIThemeDark, em Configurator/UI/UI_Themes.

One difference from the language selector: language has a project-level toggle (bAllowLanguageSwitch, read by Get_Seg_Language_Visibility) that shows or hides it. Theme has no equivalent toggle, so hiding the theme switcher is a widget edit, not a project field. Uma diferença em relação ao seletor de idioma: o idioma tem uma trava no nível do projeto (bAllowLanguageSwitch, lida pelo Get_Seg_Language_Visibility) que o mostra ou esconde. O tema não tem trava equivalente, então esconder o seletor de tema é uma edição de widget, não um campo de projeto.

Add a third theme to the pause switcherAdicionar um terceiro tema no seletor da pausa

  1. Create the theme: duplicate DA_UIThemeLight (or Dark), rename it DA_UITheme<Name>, and adjust its tokens (the colors, fonts, and measures in the token map below).Crie o tema: duplique o DA_UIThemeLight (ou Dark), renomeie para DA_UITheme<Nome> e ajuste os tokens (as cores, fontes e medidas no mapa de tokens abaixo).
  2. Open WBP_Pause. In BuildThemeOptions, add a third entry to the options Make Array (the new theme's label).Abra o WBP_Pause. No BuildThemeOptions, adicione uma terceira entrada no Make Array de opções (o rótulo do novo tema).
  3. Still in WBP_Pause, in Seg_Theme's OnSelectionChanged, replace the branch-by-index with a Switch on Int: 0 → SetTheme(DA_UIThemeLight), 1 → SetTheme(DA_UIThemeDark), 2 → SetTheme(DA_UITheme<Name>). Each output calls the GameInstance's SetTheme with the matching data asset.Ainda no WBP_Pause, no OnSelectionChanged do Seg_Theme, troque o branch por índice por um Switch on Int: 0 → SetTheme(DA_UIThemeLight), 1 → SetTheme(DA_UIThemeDark), 2 → SetTheme(DA_UITheme<Nome>). Cada saída chama o SetTheme da GameInstance com o data asset correspondente.
  4. Fix the initial highlight: the DefaultIndex in BuildThemeOptions today resolves between 0 and 1 by comparing the current theme. With three themes, generalize it to return the current theme's index (for example a Select that matches the current theme against each asset).Ajuste o realce inicial: o DefaultIndex do BuildThemeOptions hoje resolve entre 0 e 1 comparando o tema atual. Com três temas, generalize para devolver o índice do tema atual (por exemplo, um Select que casa o tema atual com cada asset).

Ship one theme and hide the switcherEntregar um tema só e esconder o seletor

In WBP_Pause, set Seg_Theme to Collapsed (in the Designer tab, or by setting its visibility when the pause opens). The interface then uses only the theme pointed at by BPDA_Project.Theme, and the customer switches nothing. This is the path when you want to deliver a single locked look. No WBP_Pause, ponha o Seg_Theme como Collapsed (na aba Designer, ou setando a visibilidade quando a pausa abre). A interface passa a usar só o tema apontado em BPDA_Project.Theme, e o cliente não troca nada. É o caminho quando você quer entregar um visual único e travado.

RoadmapRoadmap

Two theme improvements are planned: choosing in the setup tool which themes a project offers (a themes list, like languages already have, instead of the fixed Light/Dark pair), and a project toggle to show or hide the pause theme switcher (like the one that already exists for language). Until then, the steps above are the way to do both by hand.Duas melhorias de tema estão planejadas: escolher na ferramenta de setup quais temas o projeto oferece (uma lista de temas, como os idiomas já têm, em vez do par Light/Dark fixo), e uma trava no projeto para mostrar ou esconder o seletor de tema na pausa (como a que já existe para o idioma). Até lá, os passos acima são o jeito de fazer os dois na mão.

Token mapMapa de tokens

The template ships a Light and a Dark theme; the pause menu's theme switch toggles between them. Each field below is a token you can recolour or restyle, and the names come straight from the BPDA_UITheme asset. They fall into six groups: surfaces, accent, text, feedback, fonts, and measures. O template já vem com um tema Light e um Dark; o seletor de tema no menu de pausa alterna entre eles. Cada campo abaixo é um token que você pode recolorir ou reestilizar, e os nomes vêm direto do asset BPDA_UITheme. Eles se dividem em seis grupos: superfícies, acento, texto, feedback, fontes e medidas.

Colors — background & surfacesCores — fundo e superfícies

TokenTokenControlsControla
ColorBackgroundApp background color.Cor de fundo do app.
ColorSurfaceBase surface / panel color.Cor base de superfície / painel.
ColorSurfaceRaisedRaised surface (hovered / elevated elements).Superfície elevada (elementos em hover / elevados).
ColorSurfaceSubtleSubtle surface tint (low-emphasis fills).Tinta sutil de superfície (preenchimentos de baixa ênfase).
ColorSurfaceBorderBorder color for solid surfaces.Cor de borda para superfícies sólidas.
ColorOutlineDefault outline / divider color.Cor padrão de contorno / divisor.
ColorGlassFillGlass panel fill (frosted).Preenchimento do painel de vidro (fosco).
ColorGlassFillLightLighter glass fill variant.Variante mais clara do preenchimento de vidro.
ColorGlassBorderGlass panel border.Borda do painel de vidro.

Colors — accent (brand)Cores — acento (marca)

TokenTokenControlsControla
ColorAccentPrimary accent (brand color).Acento primário (cor da marca).
ColorAccentLightLighter accent (hover).Acento mais claro (hover).
ColorAccentDarkDarker accent (pressed).Acento mais escuro (pressed).
ColorOnAccentText / icon color over the accent.Cor de texto / ícone sobre o acento.
ColorAccent12Accent at 12% opacity (subtle fills).Acento a 12% de opacidade (preenchimentos sutis).
ColorAccent25Accent at 25%.Acento a 25%.
ColorAccent45Accent at 45%. Minimum alpha for borders to anti-alias cleanly (do not go lower on outlines).Acento a 45%. Alpha mínimo para bordas fazerem anti-alias limpo (não usar menos em contornos).

Colors — textCores — texto

TokenTokenControlsControla
ColorTextPrimaryPrimary text color.Cor de texto primária.
ColorTextSecondarySecondary / dimmed text color.Cor de texto secundária / apagada.
ColorTextDisabledDisabled text color.Cor de texto desabilitado.

Colors — feedbackCores — feedback

TokenTokenControlsControla
ColorSuccessSuccess / confirmation color.Cor de sucesso / confirmação.
ColorSuccess18Success at 18% (subtle success fills).Sucesso a 18% (preenchimentos sutis de sucesso).
ColorDestructiveDestructive / error color.Cor destrutiva / erro.
ColorDestructive18Destructive at 18%.Destrutivo a 18%.

FontsFontes

TokenTokenUsed forUsada em
FontDisplayHeroHero display font (the largest).Fonte de display hero (a maior).
FontDisplayXLExtra-large display.Display extra-grande.
FontDisplayLLarge display.Display grande.
FontDisplayMMedium display.Display média.
FontDisplayDisplay font (large titles).Fonte de display (títulos grandes).
FontHeadingHeading font.Fonte de título.
FontBodyBody text font.Fonte de corpo de texto.
FontLabelLabel font (small UI labels).Fonte de label (rótulos pequenos de UI).
FontLabelStrongEmphasized label.Label enfatizada.
FontCaptionCaption font (the smallest text).Fonte de legenda (o menor texto).
FontPriceFont used for prices.Fonte usada nos preços.
FontEyebrowEyebrow font: a small (usually uppercase) label above a title.Fonte "eyebrow": rótulo pequeno (geralmente maiúsculo) acima de um título.

Measures & brandMedidas e marca

TokenTokenControlsControla
RadiusSMSmall corner radius.Raio de canto pequeno.
RadiusMDMedium radius (buttons, cards).Raio médio (botões, cards).
RadiusLGLarge radius (panels, pills).Raio grande (painéis, pills).
WidthBorder / outline thickness of the themed brushes.Espessura de borda / contorno dos brushes temáticos.
BrandLogoLogo paired to the theme (dark theme → light logo, and vice versa).Logo pareada ao tema (tema escuro → logo clara, e vice-versa).
ReferenceReferência

Field referenceReferência de campos

Every field of the data assets and the item table, for when you need the exact meaning of one.Todo campo dos data assets e da tabela de itens, para quando você precisar do sentido exato de um.

Project fieldsCampos de Project

FieldCampoWhat it doesO que faz
DisplayNameProject name; shows on the splash, login, and welcome.Nome do projeto; aparece no splash, login e welcome.
CompanyCompany name (branding; fallback for the brand label).Nome da empresa (branding; fallback do brand label).
LogoLogo in the header. If empty, the header falls back to the Company text.Logo no cabeçalho. Se vazio, o cabeçalho cai para o texto de Company.
HeroImageBackground image for the splash and login.Imagem de fundo do splash e do login.
ModeMode the project opens in (Exploration or Configuration).Modo em que o projeto abre (Exploration ou Configuration).
VendorMailVendor/agent email an order notice would go to (demo).E-mail do vendedor/agente para onde iria um aviso de pedido (demo).
ProductsThe products the project offers.Os produtos que o projeto oferece.
ThemeUI theme applied across the whole project.Tema de UI aplicado no projeto todo.
CurrencySymbolCurrency symbol prefixed to every price (for example $, R$, EUR). Project-level; it does not change with the UI language.Símbolo de moeda prefixado em todo preço (por exemplo $, R$, EUR). É do projeto; não muda com o idioma da UI.
LanguagesLanguages the project offers.Idiomas que o projeto oferece.
DefaultLanguageIndexIndex in Languages the configurator opens with.Índice em Languages com que o configurador abre.
bAllowLanguageSwitchWhether the language selector appears in the pause settings.Se o seletor de idioma aparece nas settings da pausa.

Product fieldsCampos de Product

FieldCampoWhat it doesO que faz
DisplayNameProduct name (splash/start, product card).Nome do produto (splash/start, card do produto).
DescriptionShort description on the start / product card.Descrição curta no start / card do produto.
ThumbnailPreview image on the start menu card.Imagem de preview no card do menu inicial.
LevelPathThe level to open for this product (used by Open Level).O level a abrir para esse produto (usado pelo Open Level).
CameraTypeDefault camera (FPS walkthrough or Orbital).Câmera padrão (FPS walkthrough ou Orbital).
ZonesThe rooms available in the product.Os ambientes disponíveis no produto.
ItemsTableDataTable with every selectable item.DataTable com todos os itens selecionáveis.
BadgeTextOptional badge on the product (for example 'New').Selo opcional no produto (por exemplo 'New').

Zone fieldsCampos de Zone

FieldCampoWhat it doesO que faz
DisplayNameRoom name, shown on the rail, minimap, and HUD.Nome do ambiente, no rail, minimapa e HUD.
IconRoom icon for the rail / minimap.Ícone do ambiente para o rail / minimapa.
DetectionTypeHow the room activates (Trigger overlap or Manual).Como o ambiente ativa (Trigger overlap ou Manual).
RootGroupsGroups always shown for this room.Grupos sempre exibidos para esse ambiente.
DependentGroupsGroups shown conditionally, keyed by the item that unlocks them.Grupos exibidos condicionalmente, chaveados pelo item que os destrava.
ZoneIdStable room ID (PascalCase, no dots); the single source of the zone identifier.ID estável do ambiente (PascalCase, sem pontos); a fonte única do identificador da zona.

Group fieldsCampos de Group

FieldCampoWhat it doesO que faz
GroupIdGroup identifier. The key used in the trigger's multiplier map.Identificador do grupo. A chave usada no mapa de multiplicadores do trigger.
DisplayNameDisplayed group name.Nome exibido do grupo.
IconGroup icon.Ícone do grupo.
ItemRowsThe item codes (row names) that make up the group.Os códigos de item (row names) que compõem o grupo.
DependsOnFor dependent groups, the item code that unlocks the group. Empty on root groups.Para grupos dependentes, o código do item que destrava o grupo. Vazio nos root groups.

Items table columnsColunas da tabela de itens

ColumnColunaWhat it holdsO que guarda
Row NameRow NameUnique item code. Groups and validation reference the item by this.Código único do item. Os grupos e a validação referenciam o item por ele.
DisplayNameDisplayed item name.Nome exibido do item.
BrandBrand.Marca.
DescriptionItem description (shown on the detail panel).Descrição do item (mostrada no painel de detalhe).
PriceGross price (raw number; the UI formats it with the currency symbol).Preço bruto (número cru; a UI formata com o símbolo de moeda).
MeasureTypeUnit of measure, an enum (for example SquareMeter). Drives the per-unit suffix shown next to the price.Unidade de medida, um enum (por exemplo SquareMeter). Define o sufixo por unidade mostrado ao lado do preço.
ThumbnailPath to the item's thumbnail texture.Caminho da textura de thumbnail do item.
VariantSetName / VariantNamePair that links the item to a visual variant (optional; an item with no variant drives no swap).Par que liga o item a uma variante visual (opcional; item sem variante não dirige troca).
CustomDataA map of key → value pairs. Each pair becomes a spec line on the detail panel (for example Finish → Matte). See Custom specs.Um mapa de pares chave → valor. Cada par vira uma linha de spec no painel de detalhe (por exemplo Acabamento → Matte). Veja Specs customizadas.
GroupThe GroupId the item belongs to. Editable via the grid's Group dropdown.O GroupId a que o item pertence. Editável pela dropdown Group do grid.

Zone Trigger fieldsCampos do Zone Trigger

FieldCampoWhat it doesO que faz
ZoneRefThe zone Data Asset this trigger represents. Set per instance in the level.O Data Asset da zona que esse trigger representa. Setado por instância no level.
MultipliersArea / quantity multiplier per group in this room (map GroupId → float). Read for pricing.Multiplicador de área / quantidade por grupo neste ambiente (mapa GroupId → float). Lido para o preço.

Hidden templatesTemplates ocultos

The New buttons clone hidden template assets: DA_Project_Template, DA_Product_Template, DA_Zone_Template, and DT_Items_Template. They are hidden from the lists (anything ending in "_Template" is filtered out) and must not be deleted, or the New buttons stop working. Os botões New clonam assets de template ocultos: DA_Project_Template, DA_Product_Template, DA_Zone_Template e DT_Items_Template. Eles ficam ocultos das listas (tudo que termina em "_Template" é filtrado) e não podem ser apagados, ou os botões New param de funcionar.

Adding a languageAdicionar um idioma

Adding a language takes two steps: create the entry in the project's Languages, and compile its culture in the Localization Dashboard (Window → Localization Dashboard). The dashboard step is outside the setup tool; without it, the entry exists but the translated text will not load. Adicionar um idioma tem dois passos: criar a entrada em Languages do projeto, e compilar a cultura dele no Localization Dashboard (Window → Localization Dashboard). O passo do dashboard é fora da ferramenta de setup; sem ele, a entrada existe mas o texto traduzido não carrega.

The dashboard only covers fixed UI textO dashboard cobre só o texto fixo da UI

Localization applies to the template's built-in UI strings. Your own catalog data (item names, descriptions, CustomData) is not translated automatically — enter those translations yourself if you need them per language.A localização se aplica aos textos fixos da UI do template. Os seus dados de catálogo (nomes de item, descrições, CustomData) não são traduzidos automaticamente — coloque essas traduções você mesmo se precisar delas por idioma.

🎬
images/vid-add-language.mp4
Adding a language entry on the project and compiling its cultureAdicionando um idioma no projeto e compilando a cultura
Adding a language to the project.Adicionando um idioma ao projeto.
HelpAjuda

Troubleshooting & FAQProblemas e FAQ

I edited something and it vanishedEditei algo e sumiu

Catalog edits and multiplier values live in memory until you press Save in the sidebar. Creating a project, product, zone, or group and assigning items to groups save on their own; everything else waits for Save. See the Save rule.Edições do catálogo e valores de multiplicador ficam em memória até você apertar Save na barra lateral. Criar projeto, produto, zona ou grupo e atribuir itens a grupos salvam sozinhos; todo o resto espera o Save. Veja a regra do Save.

Items show up free in the runtimeOs itens aparecem de graça no runtime

A group priced its items at zero because it has no multiplier, or its zone has no trigger in the scene. Run Validation: it flags root groups with no multiplier and zones with no trigger. Add the trigger and set the multiplier, then Save.Um grupo precificou os itens a zero porque não tem multiplicador, ou a zona dele não tem trigger na cena. Rode a Validation: ela sinaliza root groups sem multiplicador e zonas sem trigger. Adicione o trigger e defina o multiplicador, depois Save.

I reimported a CSV but the grid looks the sameReimportei um CSV mas o grid está igual

Press Reload on the Catalog page to rebuild the grid from the table. The grid is a working copy, so it does not refresh by itself after an external import.Aperte Reload na página Catalog para reconstruir o grid a partir da tabela. O grid é uma cópia de trabalho, então ele não atualiza sozinho depois de um import externo.

My project is not on the Home listMeu projeto não está na lista da Home

Home only scans a fixed projects folder. Keep your project assets there, or press Sync to re-scan after moving them.A Home só escaneia uma pasta fixa de projetos. Mantenha os seus assets de projeto ali, ou aperte Sync para re-escanear depois de movê-los.

A group is missing from the Catalog's Group dropdownUm grupo não aparece na dropdown Group do Catalog

The Group dropdown lists the root groups of every zone in the product. If a group is missing, create it on the Zones page first. Then use Sync groups if you want existing rows reconciled.A dropdown Group lista os root groups de todas as zonas do produto. Se um grupo falta, crie-o antes na página Zones. Depois use Sync groups se quiser reconciliar as linhas existentes.

I changed the tool itself and nothing updatedMudei a própria ferramenta e nada atualizou

If you extend the Editor Utility Widget (its widgets or graph), close and reopen its tab to see the result. This only matters if you are customizing the tool, not for normal use.Se você estende o Editor Utility Widget (os widgets ou o grafo dele), feche e reabra a aba para ver o resultado. Isso só importa se você está customizando a ferramenta, não no uso normal.

Sales Configurator — Unreal Engine 5 template. This documentation is bilingual; use the English / Português switch in the sidebar. Every heading has a copyable link (hover the title, click the #). Sales Configurator — template de Unreal Engine 5. Esta documentação é bilíngue; use o botão English / Português na barra lateral. Todo título tem um link copiável (passe o mouse no título e clique no #).