Verificar a disponibilidade da session e o suporte do dispositivo
Antes de iniciar o AR, normalmente é preciso primeiro verificar se a session está disponível e se o dispositivo atual suporta as funções AR necessárias. Este artigo explica como fazer essas verificações.
Antes de começar
- Consulte Introdução à ARSession para entender os conceitos básicos, a composição e o fluxo de trabalho de uma session.
- Consulte Suporte do dispositivo e relatórios para entender os conceitos básicos de suporte a dispositivos e relatórios de session no Unity.
- Aprenda como criar uma session.
Obter o relatório durante o fluxo de inicialização
Se a session for iniciada diretamente depois do assemble, você pode obter o relatório da session pelo evento StateChanged.
É preciso assinar o evento StateChanged antes do session start; normalmente é seguro fazer isso em Awake():
void Awake()
{
Session.StateChanged += HandleSessionStateChange;
}
Os estados de session a observar no handler do evento são Ready e Broken. O estado Ready indica que a session foi iniciada com sucesso, ou seja, que está disponível no dispositivo atual. O estado Broken indica que a inicialização falhou, ou seja, que a session não está disponível no dispositivo atual.
O estado Broken nem sempre aparece quando o dispositivo não é suportado. Por isso, também é necessário usar SessionReport.BrokenReason para obter o motivo exato da falha.
void HandleSessionStateChange(ARSession.SessionState status)
{
if (status == ARSession.SessionState.Ready)
{
// session disponível no dispositivo atual
}
else if (status == ARSession.SessionState.Broken)
{
// session indisponível no dispositivo atual
if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
{
// o componente selecionado não é suportado pelo dispositivo atual
}
else
{
// motivo não relacionado ao dispositivo
}
}
}
As causas SessionReport.SessionBrokenReason.NoAvailabileFrameSource e SessionReport.SessionBrokenReason.FrameFilterNotAvailabile indicam que os componentes da session não estão disponíveis no dispositivo atual; as outras causas normalmente não dependem do dispositivo. Em termos estritos, essas duas causas significam que a configuração atual, e apenas ela, não pode executar funções AR naquele dispositivo. Configuração refere-se às funções e ajustes escolhidos no objeto session. É possível obter um relatório detalhado de disponibilidade em Report.
No caso de SessionReport.SessionBrokenReason.NoAvailabileFrameSource, se durante a inicialização da session houver atualização online da lista de dispositivos e o dispositivo for detectado como suportado, a session pode se recuperar automaticamente.
Obter o relatório antes de iniciar
Se quiser decidir antes de a session iniciar e, conforme o caso, escolher se deve iniciá-la, você pode chamar manualmente Assemble() e usar o evento AssembleUpdate para obter o relatório de disponibilidade dos componentes.
É preciso assinar o evento AssembleUpdate antes do assemble da session.
Session.AssembleUpdate += OnAssembleUpdate;
Na primeira fase do assemble, ainda é possível usar ARSession.SessionState e Report para julgar se a session é suportada. Mas o relatório da segunda fase não é atualizado na session.
Por isso, quando se chama Assemble() manualmente, normalmente é preciso tratar o relatório de disponibilidade no evento AssembleUpdate para determinar se a session está disponível no dispositivo atual.
É preciso prestar atenção principalmente à disponibilidade dos componentes na lista SessionReport.AvailabilityReport.FrameSources. Se pelo menos um frame source estiver disponível, então a parte SessionReport.AvailabilityReport.FrameSources está disponível no dispositivo atual.
Também é preciso observar a disponibilidade dos componentes na lista SessionReport.AvailabilityReport.FrameFilters. Porém o critério muda conforme as opções de assemble: pode ser exigido que todos os frame filters estejam disponíveis, ou apenas alguns. Na opção padrão, todos os frame filters precisam estar disponíveis.
Na configuração padrão, você pode usar o código abaixo para verificar se os componentes da session estão disponíveis no dispositivo atual:
void OnAssembleUpdate(SessionReport.AvailabilityReport report)
{
if (report.FrameSources.Any(f => f.Availability == SessionReport.AvailabilityReport.AvailabilityStatus.Available) &&
report.FrameFilters.All(f => f.Availability == SessionReport.AvailabilityReport.AvailabilityStatus.Available))
{
Session.AssembleUpdate -= OnAssembleUpdate;
// os componentes da session estão disponíveis no dispositivo atual, a session pode ser iniciada
Session.StartSession();
}
else
{
// os componentes da session não estão disponíveis no dispositivo atual
}
if (report.PendingDeviceList.Count <= 0)
{
Session.AssembleUpdate -= OnAssembleUpdate;
}
}
Observe que o evento AssembleUpdate pode disparar duas vezes. No exemplo acima, a inscrição é removida depois de confirmar que os componentes estão disponíveis.
Esse método não consegue detectar outros erros que possam ocorrer durante a inicialização da session, mas esses erros normalmente não dependem do dispositivo. Se necessário, você pode complementar a verificação após iniciar a session pelo evento StateChanged.
O que fazer quando os componentes da session não estão disponíveis
No desenvolvimento de aplicativos, normalmente se quer suportar o maior número possível de dispositivos. Quando os componentes da session não estiverem disponíveis no dispositivo atual, você pode considerar estas opções:
Fazer downgrade para outras funções AR
Ao modificar a configuração dos componentes da session, escolha as funções AR suportadas pelo dispositivo atual. Consulte criar uma session para ver como alterar a configuração.Oferecer uma experiência não AR
Quando os componentes da session não estiverem disponíveis, ofereça uma experiência sem AR. Por exemplo, em um cenário de navegação, se a navegação AR não for possível, uma navegação 2D tradicional é muito útil.Pedir para o usuário trocar de dispositivo
Em alguns cenários, o usuário pode estar usando um dispositivo que não suporta funções AR. Nesse caso, você pode sugerir trocar de dispositivo para obter uma experiência melhor.
Ao escolher essas opções, avalie os requisitos específicos do aplicativo e o público-alvo. Em um aplicativo AR, se alguns dispositivos realmente não puderem oferecer AR ou um modo degradado, ainda assim é importante exibir uma boa mensagem para que o usuário entenda as limitações do dispositivo.
Próximos passos
- Aprenda como controlar a execução da session
- Aprenda fonte de frames e seleção em runtime
- Você também pode consultar estes exemplos para entender o uso após obter o relatório:
- exemplo Workflow_ARSession usa o evento StateChanged e mostra UI para o estado Broken, além de usar AssembleUpdate para exibir a disponibilidade de cada componente na UI
- O exemplo SpatialMap_Sparse_AllInOne usa o evento AssembleUpdate para verificar com antecedência o suporte do dispositivo e mostrar aviso quando indisponível
- O exemplo MotionTracking_DeviceMotionAndPlaneDetection usa o evento StateChanged e mostra UI para o estado Broken
- O exemplo MegaBlock_Basic usa o evento StateChanged e mostra UI para o estado Broken