Instalar o plugin
O XR Device Sense é um plugin somente de conteúdo — não tem código C++. Isso significa que ele não exige Visual Studio, não converte o projeto para C++ e não precisa de compilação. É só copiar a pasta.
- Descompacte o zip e copie a pasta
XRDeviceSenseparaSeuProjeto/Plugins/ - Abra o projeto. Em Edit > Plugins, confirme que XR Device Sense está habilitado
- Reinicie o editor se ele pedir
- No Content Browser, clique na engrenagem e marque Show Plugin Content
A pasta XRDeviceSense Content passa a aparecer na árvore do Content Browser.
É lá que moram os Blueprints do plugin.
Configurar o projeto
Três chaves em Project Settings > Engine > Input. As três precisam estar exatamente assim — é a combinação que faz o resto funcionar.
| Seção | Opção | Valor |
|---|---|---|
| Mobile | Always Show Touch Interface | marcado |
| Mobile | Default Touch Interface | None |
| Mouse Properties | Use Mouse for Touch | desmarcado |
O Always Show Touch Interface parece errado à primeira vista — dá a impressão
de que vai mostrar o joystick para todo mundo. Não vai. Numa build Windows, é essa opção que
faz a Engine criar o widget do joystick virtual. Sem ela, o comando de ativar a interface
executa sem erro nenhum e não acontece nada. Como o Default Touch Interface
fica em None, o widget nasce vazio — quem preenche é o componente.
O Use Mouse for Touch serve para simular toque com o mouse durante o teste,
mas enquanto ele estiver marcado a câmera não responde ao mouse — todo movimento é convertido
em toque antes de chegar na IA_Look. Marque só para testar, e desmarque antes de empacotar.
Preparar o Touch Interface
O TI_Mobile é o asset que desenha os dois joysticks. Ele mora no
Content do projeto, não no plugin, porque os valores de sensibilidade
mudam de cena para cena.
Use a cópia calibrada que está no Drive. Se precisar recriar do zero: marque
Show Engine Content, busque por DefaultVirtualJoysticks,
duplique e salve em Content/UI/.
| Campo | Valor | Por quê |
|---|---|---|
| Input Scale | 0,35 / 0,28 | Sensibilidade. O eixo vertical incomoda mais que o horizontal, por isso é sempre menor |
| Visual Size | 240 | Raio maior exige mais deslocamento do dedo para o mesmo ângulo — é o que dá controle fino |
| Thumb Size | 112 | Proporcional ao Visual Size |
| Interaction Size | 300 / 260 | Área que responde ao toque, maior que a área visível |
No Controls [0], o joystick esquerdo de movimento, use os mesmos
Visual Size e Thumb Size para simetria visual, e deixe o
Input Scale em 1,0. Caminhar não sofre do mesmo
problema de precisão que olhar em volta.
Os Controls começam no índice zero: [0] é o joystick da
esquerda e [1] é o da direita. Para conferir sem
depender do número, olhe o Main Input Key — o da câmera tem "Right" no nome.
Ajustar a câmera
No IMC_Default, a IA_Look precisa de dois mapeamentos: um para o
joystick e outro para o mouse. Cada um com tratamento próprio.
| Ordem | Modifier | Valor |
|---|---|---|
| Index [0] | Dead Zone | 0,15 / 1,0 · Smoothed Radial |
| Index [1] | Response Curve — Exponential | 2,0 / 2,0 |
| Index [2] | Smooth | sem parâmetro |
| Index [3] | Scalar | 0,35 / 0,28 |
A ordem importa: os modifiers são aplicados de cima para baixo. O Dead Zone mata o tremor do dedo parado. A curva exponencial é a que mais muda a sensação — movimento pequeno vira movimento pequeno, e a velocidade só cresce quando a pessoa arrasta de verdade. O Smooth tira o serrilhado entre frames.
| Ordem | Modifier | Valor |
|---|---|---|
| Index [0] | Negate | só o Y marcado |
| Index [1] | Scalar | 0,5 / 0,4 |
Não replique os modifiers do joystick aqui. Dead Zone, curva e Smooth corrigem a imprecisão do dedo — no mouse eles só criam atraso. O Negate existe porque o eixo Y do mouse é invertido em relação ao pitch da câmera.
Ligar no personagem
Abra o Blueprint do personagem — BP_FirstPersonCharacter ou
BP_ThirdPersonCharacter, conforme o template.
- No painel Components, clique em + Add e adicione o
BPC_XRDeviceSense - Com ele selecionado, no painel Details preencha Interface De Toque com o
TI_Mobile - Confirme que Classe Do Dispositivo e Confianca estão nos valores esperados (veja a nota abaixo)
No Event Graph, um único nó de ligação. O evento de toque pertence ao ator que recebe input, então essa parte não dá para encapsular no plugin:
Event BeginInputTouch → Registrar Toque (Target: BPC XR Device Sense)
Na versão em uso hoje, o default de Classe Do Dispositivo está em
Tablet. Isso faz o joystick aparecer também no desktop. É proposital e provisório:
nos templates First Person, os eventos de toque dependem da interface de toque já estar na tela,
o que cria uma dependência circular — sem o joystick, o toque não é detectado; sem detectar
o toque, o joystick não aparece. Joystick sobrando no desktop é um incômodo estético;
joystick faltando no celular impede a pessoa de navegar. A correção definitiva passa pelo
Web SDK da plataforma de streaming.
Configurar a plataforma
No painel da Streampixel, em Settings > Inputs. Estas opções decidem o que chega no Unreal, e uma delas sozinha pode inutilizar tudo que você configurou até aqui.
| Opção | Valor | Efeito |
|---|---|---|
| Touch | ligado | Sem isso, o celular não manda toque nenhum |
| Mouse | ligado | Câmera no desktop |
| Keyboard | ligado | WASD |
| Gamepad | ligado | Opcional, para controle físico pelo navegador |
| Converter toque em mouse | desligado | Ligado, o dedo chega como clique e o componente nunca detecta o celular |
| Fake Mouse Touch | desligado | Ligado, o mouse chega como toque e o desktop ganha joystick |
Testar
Para testar sem celular, marque temporariamente Use Mouse for Touch em Project Settings > Input e rode no PIE. O clique passa a disparar o evento de toque. Lembre de desmarcar depois.
Se precisar descobrir onde a cadeia parou, coloque um Print String no início da
função Registrar Toque. Se ele imprimir, o toque está chegando e o problema
está adiante — normalmente o campo Interface De Toque vazio. Se não imprimir,
o toque não está chegando ao Unreal, e a causa está na etapa 06.
O nó Print String é Development Only. Numa build de Shipping ele não
executa, e você não vê nada mesmo com tudo funcionando. Para diagnosticar, empacote em
Development.
Calibragem final sempre pelo celular, através do stream — nunca pelo editor. A latência do Pixel Streaming faz a câmera parecer mais sensível do que é, porque o retorno chega atrasado e a pessoa corrige demais. Os valores desta página já vêm com folga para baixo por causa disso.
Os nós do componente
| Nó | O que faz |
|---|---|
| Registrar Toque | Marca a sessão como tátil no primeiro toque e classifica entre celular e tablet pelo tamanho da tela |
| Avaliar Viewport | Palpite inicial pela proporção da tela. Chame no Begin Play |
| Aplicar Controles | Liga ou desliga a interface de toque conforme o dispositivo. Pode chamar à vontade — só age quando o estado muda |
| Eh Sessao Mobile | Retorna verdadeiro para celular ou tablet |
| Definir Dispositivo | Uso interno. Só aceita a nova classificação se a confiança for maior ou igual à atual |
| On Device Identified | Dispatcher que dispara quando a identificação melhora. Use para trocar HUD ou tutorial por dispositivo |
A escala de confiança existe para impedir que um palpite fraco sobrescreva uma certeza: 1 proporção de tela, 2 toque detectado, 3 informado pelo navegador, 4 forçado manualmente.
Armadilhas conhecidas
Cada uma destas já custou tempo. Confira antes de abrir chamado.
Ao criar uma variável de enum em Blueprint, o valor padrão não assume automaticamente o primeiro item. Sempre confira em Class Defaults. Um default errado aqui faz o componente se considerar celular antes de qualquer detecção.
É propriedade do Spring Arm. Em projetos First Person não há onde aplicar — e nem se deve:
atrasar a câmera em primeira pessoa causa desconforto, porque a câmera é a cabeça da pessoa.
Toda a suavização fica nos modifiers da IA_Look.
Antes de copiar o plugin para outro projeto, rode o Reference Viewer no
BPC_XRDeviceSense. Se ele referenciar algum asset que more em /Game/,
o plugin quebra ao ser copiado sozinho. É por isso que a Interface De Toque
é Instance Editable em vez de ter valor default.
O TI_Mobile, os modifiers do IMC_Default, as três chaves de
Project Settings e a ligação do evento de toque no personagem. Tudo isso é por projeto —
por isso este guia existe.