Voltar ao Blog

Godot no XREAL AURA: Um Guia Prático para Desenvolvimento Espacial Nativo

Publicado em 3 de novembro de 2026
Godot no XREAL AURA: Um Guia Prático para Desenvolvimento Espacial Nativo Gerada com a ajuda de IA

Em resumo

Descubra como desenvolver com Godot no XREAL AURA: editor no dispositivo, containers espaciais OpenXR, passthrough óptico e armadilhas de exportação.

Seu pipeline de build XR atualmente significa conectar a um desktop, exportar um APK, fazer sideload via ADB, colocar o headset, descobrir um typo e recomeçar. O XREAL AURA remove esse loop por completo, e o Godot está na lista de lançamento com um editor completo que roda nos próprios óculos. Isso muda o que "iterar" significa para o desenvolvimento espacial.

Este guia percorre o fluxo de trabalho real: colocar o editor para rodar no AURA, estruturar uma cena espacial com OpenXR Spatial Containers, lidar com o modelo de passthrough/see-through que torna os óculos ópticos diferentes de headsets de VR, e as armadilhas que vão te morder no primeiro export.

Por Que o Optical See-Through Muda Suas Premissas de Design

O XREAL AURA é o primeiro dispositivo optical see-through no Android XR. Essa única frase quebra premissas embutidas na maioria dos tutoriais de Godot XR.

Em um headset de VR, a câmera do headset renderiza tudo. O usuário vê seu ambiente e nada mais. Em óculos optical see-through, o usuário vê através das lentes o mundo real, e seu conteúdo renderizado é composto por cima. Isso não é o mesmo que video passthrough em um Quest — video passthrough captura a realidade com câmeras e a reexibe, o que introduz latência e perda de luz. Optical see-through tem zero latência de compositor para o mundo real.

Consequências práticas para seu orçamento de renderização:

  • Você não pode escurecer o mundo real. Preto em um display transparente é transparente. Você não tem um fundo opaco, então UI que depende de contraste contra painéis escuros vai falhar em uma sala iluminada.
  • Conteúdo com aparência aditiva vence. Conteúdo emissivo brilhante se lê bem; conteúdo escuro e dessaturado desaparece. Projete sua paleta com 2-3x a luminância que você usaria em VR.
  • O campo de visão é mais estreito que em VR. Conteúdo colocado em ângulos extremos fica fora da área do display. Mantenha os alvos primários de interação dentro de aproximadamente ±30 graus do centro frontal.

Se você já lançou VR antes, espere reajustar cada material e cada painel de UI. Reserve um dia inteiro para isso por cena.

Configurando o Editor do Godot nos Óculos

O editor é distribuído no Google Play, não como um APK sideloaded. Isso importa porque significa que você pode atualizá-lo como qualquer outro app.

A sequência de configuração:

  1. Instale o editor do Godot no XREAL AURA pela Play Store.
  2. Instale o app complementar de ambiente de build Gradle. Ele acompanha a toolchain de exportação Android, então você não precisa montar um JDK e Android SDK do zero no dispositivo.
  3. Entre com uma identidade de desenvolvedor Android se você planeja assinar e publicar builds a partir do dispositivo.
  4. Inicie o editor — ele abre em um workspace espacial multi-janela em vez de uma única janela plana.

Esse quarto ponto é o interessante. O editor te dá o conjunto de funcionalidades estilo desktop, mas organizado como janelas flutuantes no espaço. Você pode manter a Scene tree em um volume e o viewport 2D em outro.

O Que o Fluxo de Trabalho no Dispositivo Realmente Te Dá

A resposta honesta: iteração rápida em sensação, iteração mais lenta em assets.

Editar shaders, ajustar transforms de nodes e testar mapeamentos de input no dispositivo alvo elimina o ciclo inteiro de exportação-teste. Esse ciclo normalmente leva 3-8 minutos quando você considera tempo de build, transferência e relançamento. Dez iterações é uma hora perdida.

O que ele não ajuda: importar atlas de texturas grandes, rodar bakes de lightmap longos, ou qualquer coisa pesada de CPU. Faça isso em uma workstation. A divisão realista é criação de assets no desktop, montagem e ajuste de cena nos óculos.

Construindo Conteúdo Espacial com OpenXR Spatial Containers

O suporte Android XR do Godot inclui OpenXR Spatial Containers — volumes gerenciados pelo sistema onde seu app coloca conteúdo espacial. A analogia da própria plataforma é quase precisa: apps tradicionais desenham conteúdo 2D dentro de janelas em um desktop; apps espaciais desenham conteúdo 3D dentro de containers em uma sala.

Há dois tipos de container que valem a pena entender antes de escrever código:

Tipo de container Melhor para Trade-off
Volume Objetos 3D com profundidade real, posicionamento world-locked O sistema pode limitar os limites do volume
Panel Superfícies de UI, texto, jogos 2D Renderizado em um plano fixo; pistas de profundidade são planas

O erro que a maioria dos desenvolvedores comete é escolher volume para UI. Texto em um container de volume é escalado e movido pelo sistema de maneiras que você não consegue prever totalmente, e seu widget de radar cuidadosamente posicionado deriva. Coloque UI em um container de painel e deixe o sistema lidar com o posicionamento.

Trabalhando com a API de Spatial Container

O Godot expõe spatial containers através de classes de extensão OpenXR. Os nomes exatos das classes dependem da sua versão do Godot, então verifique a lista de features do engine para os bindings atuais de spatial container antes de escrever código de produção. O padrão abaixo reflete como conteúdo XR baseado em containers é tipicamente estruturado.

extends Node3D

signal container_created(handle: int)

# Spatial container setup for Android XR.
# Class names are version-dependent; verify against the
# OpenXR extension bindings shipped with your Godot build.

var volume_container: SpatialContainer
var panel_container: SpatialContainer

func _ready() -> void:
    var xr_interface: XRInterface = XRServer.find_interface("OpenXR")
    if xr_interface == null or not xr_interface.is_initialized():
        push_error("OpenXR interface unavailable on this device.")
        return

    # Volume container for the 3D board.
    volume_container = SpatialContainer.new()
    volume_container.container_type = SpatialContainer.TYPE_VOLUME
    volume_container.extent = Vector3(0.6, 0.4, 0.6)  # 60cm x 40cm x 60cm
    if volume_container.request_container() != OK:
        push_error("Volume container request failed.")
        return

    # Panel container for the HUD.
    panel_container = SpatialContainer.new()
    panel_container.container_type = SpatialContainer.TYPE_PANEL
    panel_container.extent = Vector3(0.4, 0.4, 0.02)
    panel_container.request_container()

    add_child(volume_container)
    add_child(panel_container)

    container_created.emit(volume_container.get_container_handle())

func _process(_delta: float) -> void:
    # Containers can be rejected or resized by the system.
    if volume_container and not volume_container.is_active():
        _handle_container_loss()

func _handle_container_loss() -> void:
    push_warning("Volume container lost - repositioning.")
    # Never assume the container survives; re-request on loss.
    volume_container.request_container()

A linha crítica é _handle_container_loss(). Containers gerenciados pelo sistema são, por definição, gerenciados pelo sistema. O usuário se afasta, o assistente reposiciona o conteúdo, ou o dispositivo recupera espaço. Se seu tratamento de input não sobrevive a uma perda de container, seu app vai ficar parado com um tabuleiro invisível e um jogador esmagando botões.

A Armadilha Que Quase Todo Mundo Encontra: Anchor Drift

Aqui está o problema específico, e é o que vai te custar mais tempo de debug.

Você coloca um tabuleiro 3D em um container de volume. Aperta Play. Tudo parece certo. Você tira os óculos, coloca de volta dois minutos depois, e o tabuleiro agora está meio metro à esquerda e rotacionado 20 graus.

Por quê? Porque você ancorou seu conteúdo à world origin em vez do container. A world origin em um dispositivo espacial não é um lugar estável — ela é definida relativa à pose de início da sessão. Quando a sessão re-ancora, a world origin se move.

A correção é manter cada peça da sua cena como filha do transform do container, e nunca ler ou escrever posição global para conteúdo espacial:

# WRONG: assumes world origin is stable
func place_piece(piece: Node3D, board_pos: Vector3) -> void:
    piece.global_position = board_pos

# RIGHT: position relative to the container transform
func place_piece(piece: Node3D, board_pos: Vector3) -> void:
    piece.position = board_pos   # local to container
    piece.rotation = Vector3.ZERO

Faça um grep no seu projeto por .global_position e .global_transform antes de publicar. Cada ocorrência em conteúdo espacial é um bug potencial de drift. Essa classe de bug também aparece em trabalho 3D convencional e multiplayer — erros de âncora e ownership em um transform replicado produzem exatamente o mesmo sintoma de "objeto teleportou para alguns clientes", e é por isso que tratar transforms como locais ao container em vez de absolutos é um hábito que vale levar para qualquer projeto Godot em rede.

Verificando a Correção

Para confirmar que a ancoragem está correta:

  1. Inicie sua cena e anote a posição do tabuleiro.
  2. Remova o dispositivo, espere 60 segundos, reentre no app.
  3. O tabuleiro deve aparecer na mesma localização física relativa à sala, não no mesmo offset de onde você está.
  4. Repita com o dispositivo em uma orientação diferente — sentado, depois em pé.

Se ele deriva, sua árvore de conteúdo ainda tem referências absolutas. Se ele pula mas permanece consistente após o pulo, o container está sendo reposicionado e seu conteúdo está seguindo corretamente — isso é comportamento esperado, não um bug.

Lidando com Identidade do Jogador e Estado Persistente

Apps espaciais no Android XR são apps Android. Eles suspendem, eles retomam, o usuário pode ter múltiplas identidades conectadas no dispositivo, e seus dados de save vivem no mesmo ecossistema de contas que todo o resto.

O modo de falha é sutil: um jogador joga espacialmente nos óculos, depois abre o mesmo jogo no celular. Se seu estado de save é local ao dispositivo, eles agora têm dois mundos divergentes e nenhuma maneira de reconciliá-los. Corrigir isso não é um problema de renderização, é um problema de identidade de conta.

Fazer isso direito significa implementar fluxos de sign-in, um armazenamento de save no servidor e — a parte que todo mundo subestima — tratamento de conflitos quando dois dispositivos escrevem no mesmo slot de save. Um modelo de leitura/escrita ciente de revisão onde o cliente compara versões e resolve conflitos explicitamente é a única versão que sobrevive ao contato com usuários reais. Construir isso do zero é um trabalho de várias semanas; o horizOn fornece cloud save vinculado à conta com leituras e escritas cientes de revisão exatamente para esse caso, junto com autenticação por email, anônima, Google e Apple, para que a mesma identidade de jogador atravesse os óculos e o celular.

Qualquer que seja o backend que você use, decida a política de conflito antes de publicar. Last-write-wins destrói progresso silenciosamente. Perguntar ao jogador é melhor do que perder dados.

Melhores Práticas para Publicar no XREAL AURA

  1. Projete para luz ambiente. Teste cada painel de UI ao ar livre ao meio-dia e em uma sala escura. Se seu texto ficar ilegível em qualquer um dos casos, aumente o contraste e adicione um contorno brilhante sutil em vez de uma sombra escura — sombras não fazem nada em um display transparente.
  2. Mantenha containers pequenos e re-solicitáveis. Um volume de 60cm é mais fácil para o sistema posicionar de forma confiável do que um de 2m. Assuma que todo container pode ser perdido a qualquer momento e escreva o caminho de recuperação primeiro, não por último.
  3. Limite seu orçamento de renderização agressivamente. Estes são óculos, não uma GPU de desktop. Mire um frame time abaixo de 11ms (classe 90Hz) com temporal anti-aliasing desligado em favor de MSAA, que custa menos em resoluções espaciais.
  4. Coloque UI em painéis, conteúdo em volumes. Não brigue com a lógica de posicionamento do sistema para texto. Reserve volumes para coisas com profundidade genuína que o jogador inspeciona de múltiplos ângulos.
  5. Verifique no dispositivo antes de cada milestone. O editor nos óculos torna isso barato. Resultados de simulador não vão revelar anchor drift, falhas de luminância ou comportamento de perda de container.

Dando o Próximo Passo

O editor no dispositivo é a manchete real aqui. Ele comprime o loop de iteração espacial de minutos para segundos, e essa é a diferença entre ajustar um design e adivinhar um.

Comece instalando o editor e o app Gradle complementar no AURA, depois reconstrua um pequeno projeto existente como uma cena espacial em vez de começar do zero — você vai encontrar os problemas de ancoragem e luminância imediatamente, em conteúdo que você já entende. A partir daí, adicione um container de volume 3D e um painel de UI e deixe ambos estáveis em um ciclo de suspend/resume. Quando isso se sustentar, você está pronto para projetar para a plataforma em vez de contra ela.

Se estado persistente de jogador entre dispositivos está na sua lista, o horizOn lida com cloud save vinculado à conta com resolução de conflitos no lado do cliente, para que sua sessão espacial e sua sessão em tela plana permaneçam em acordo.


Fonte: Pronto para XREAL AURA