UI na Tela

Aprenda como criar uma UI para jogadores em sua cena. Isso é útil, por exemplo, para exibir informações relacionadas ao jogo.

Você pode construir uma UI para sua cena, para ser exibida no espaço 2D fixo da tela, em vez do espaço 3D do mundo.

Os elementos de UI só são visíveis quando o jogador está dentro dos parcelas de LAND da cena, pois cenas vizinhas podem ter sua própria UI para exibir. Partes da UI também podem ser acionadas para abrir quando certos eventos ocorrem no espaço do mundo, por exemplo se o jogador clicar em um lugar específico.

Construa uma UI definindo uma estrutura de UIEntity objetos em JSX. A sintaxe usada para UIs é muito semelhante à do Reactarrow-up-right (uma biblioteca baseada em javascript muito popular para construir UIs web).

circle-exclamation

Uma UI simples com elementos estáticos pode parecer muito com HTML, mas quando você adiciona elementos dinâmicos que respondem a uma mudança de estado, você pode fazer coisas muito mais poderosas.

A UI padrão do Explorer do Decentraland inclui um widget de chat, um mapa e outros elementos. Esses elementos de UI são sempre exibidos na camada superior, acima de qualquer UI específica da cena. Portanto, se sua cena tiver elementos de UI que ocupem o mesmo espaço da tela que esses, eles serão ocultados.

Veja UX guidelines para dicas sobre como projetar o visual e a sensação da sua UI.

Quando o jogador clica no botão fechar UI no canto inferior direito da tela, todos os elementos de UI são ocultados.

Renderizar uma UI

Para exibir uma UI na sua cena, use a ReactEcsRenderer.setUiRenderer() função, passando-a uma estrutura válida de entidades, descrita em um .tsx arquivo.

Cada entidade é definida como um nó parecido com HTML, com propriedades para cada um de seus componentes.

arquivo ui.tsx:

import { UiEntity, ReactEcs } from '@dcl/sdk/react-ecs'
import { Color4 } from '@dcl/sdk/math'

export const uiMenu = () => (
  <UiEntity
    uiTransform={{
      width: 700,
      height: 400,
      margin: { top: '35px', left: '500px' },
    }}
    uiBackground={{ color: Color4.Red() }}
  />
)

arquivo index.ts:

Você também pode definir uma estrutura de entidade e renderizá-la, tudo em um mesmo comando em um .tsx arquivo.

arquivo ui.tsx:

arquivo index.ts:

circle-exclamation

Entidades de UI

Cada elemento na UI deve ser definido como um UiEntity, seja uma imagem, texto, fundo, uma caixa de alinhamento invisível, etc. Assim como no espaço 3D da cena, cada UiEntity tem seus próprios componentes para lhe dar posição, cor, etc.

A sintaxe parecida com React permite especificar cada componente como uma propriedade dentro do UiEntity, isso torna o código mais curto e mais legível.

Os componentes usados em um UiEntity são diferentes daqueles usados em entidades regulares. Você não pode aplicar um componente de UI a uma entidade regular, nem um componente regular a uma entidade de UI.

Os seguintes componentes estão disponíveis para uso em um UiEntity:

  • uiTransform

  • uiBackground

  • uiText

  • onClick

Como com tags HTML, você pode definir componentes como self-closing ou aninhar um dentro do outro.

arquivo ui.tsx:

arquivo index.ts:

Uma definição de um módulo de UI só pode ter uma entidade no nível pai. Você pode definir quantas outras entidades quiser, mas todas devem caber dentro de uma estrutura com um único pai no topo.

Escala Virtual da Tela

Defina uma largura e altura virtual para a UI. Isso é recomendado para garantir que sua UI pareça a mesma em diferentes tamanhos de tela, independentemente do tamanho real da tela em pixels.

Se você definir uma largura virtual de 1920 e uma altura virtual de 1080, a UI será escalada para caber no tamanho da tela. Se a tela for 1920x1080, a UI será exibida no mesmo tamanho que o tamanho virtual. Se a tela for maior ou menor, quaisquer valores em pixels serão escalados para caber no tamanho virtual. Por exemplo, se a tela for 3840x2160, um item definido como 100 pixels de largura será exibido em 200 pixels reais.

O cálculo real para o Fator de Escala da UI que é multiplicado nos valores em pixels é Math.min(realWidth / virtualWidth, realHeight / virtualHeight)arrow-up-right

Múltiplos módulos de UI

Se sua cena contém múltiplos sistemas ou módulos que definem cada um sua própria UI, você pode renderizar cada módulo de UI com ReactEcsRenderer.addUiRenderer(). Isso é especialmente útil ao trabalhar em uma cena complexa com múltiplos componentes de UI, ou ao definir UIs para um smart itemarrow-up-right, que deve ser utilizável independentemente do que está no código do restante da cena.

A função ReactEcsRenderer.addUiRenderer() exige que você forneça uma entidade como proprietária da UI. Isso pode ser qualquer entidade, até mesmo uma entidade dummy criada apenas para ser usada como proprietária da UI.

Esse trecho pode existir independentemente de qualquer outro código de UI na cena. O resto da cena pode incluir um ReactEcsRenderer.setUiRenderer(), ou nenhum, e a UI ainda será renderizada.

Uma addUiRenderer() chamada também pode incluir uma largura e altura virtuais, assim como setUiRenderer(). Entretanto, se a cena tem uma setUiRenderer() chamada que também define uma largura e altura virtuais, a largura e altura virtuais da addUiRenderer() chamada serão ignoradas.

Essa UI pode ser removida com ReactEcsRenderer.removeUiRenderer(dummyEntity) , também se a entidade que possui a UI for destruída, a UI será removida também. Se ReactEcsRenderer.addUiRenderer() for chamada novamente para a mesma entidade mas com um UiRenderer diferente, o anterior é limpo e o novo o substitui.

Compartilhando uma única declaração setUiRenderer

Em vez de chamar ReactEcsRenderer.addUiRenderer() para cada módulo de UI, você pode chamar ReactEcsRenderer.setUiRenderer() uma vez com um array de módulos de UI, que podem estar em arquivos diferentes.

Abaixo está um exemplo mais completo:

arquivo ui.tsx:

arquivo index.ts:

Atualizado