Configuração do Android para a Unreal Engine
Para empacotar o Serviço de Instância Única do Android (ASIS), você precisará configurar o SDK e o NDK do Android. A Unreal Engine (UE) usa o Android Studio e as ferramentas de linha de comando do SDK do Android para baixar e instalar os componentes do SDK do Android necessários para desenvolver projetos Android. Siga a seguinte documentação:
Se você estiver usando a Unreal Engine 5.5.x, habilite as seguintes plataformas e ferramentas de SDK:
Criar projeto a partir do modelo
Com o SDK/NDK do Android instalado, podemos configurar o plugin do modelo ASIS. O plugin é entregue como um arquivo separado, portanto é necessário seguir etapas manuais para preparar o código-fonte da UE.
Obtenha o código-fonte da UE5.*.
Extraia o código-fonte mais recente do cabeçalho principal da UE5 (Perforce ou GitHub).
Perforce:
GitHub:
Configuração do plugin ASIS
Se estiver usando Perforce:
Vá até a pasta de plugins ASIS:
UE5_Main\Engine\Restricted\NotForLicensees\Plugins\AndroidSingleInstanceService.Dentro da pasta
AndroidSingleInstanceService, abra a pastaTemplates:UE5_Main/Engine\Restricted\NotForLicensees\Plugins\AndroidSingleInstanceService\Templates\.
Se estiver usando o GitHub:
Descompacte o arquivo fornecido pela Epic e copie o conteúdo do plugin ASIS para: Engine\Restricted\NotForLicensees\Plugins\AndroidSingleInstanceService.
Copie o modelo
Copie a pasta TP_HMI_ASIS para UE5/Templates/.
Copie o código a seguir para o UE5_Main/Templates/TemplateCategories.ini.
Categories=(Key="HMI", LocalizedDisplayNames=((Language="en",Text="Automotive\nHMI &\nVehicle Cockpit using Android Single Instance Service")), LocalizedDescriptions=((Language="en",Text="Find templates for automotive vehicle cockpit using Android Single Instance Service"), Icon="TP_HMI_ASIS/Media/AutomotiveHMI_2x.png", IsMajorCategory=true)Execute o UnrealEditor. Agora devemos ver o novo modelo de IHM quando abrirmos o Navegador de Projetos da Unreal Engine:
Criar projeto a partir do modelo de IHM
O projeto deve ter a seguinte aparência:
Adicionar o plugin ASIS ao projeto existente
Se você tiver um projeto existente ao qual precisa adicionar ASIS, faça o seguinte:
Habilite o ASIS nas configurações de plugins
Adicione o diretório do plugin de remapeamento. Adicione o próximo código a {ProjectName}/Config/DefaultGame.ini.
C++[Staging] +RemapDirectories=(From="Engine/Restricted/NotForLicensees/Plugins/AndroidSingleInstanceService", To="Engine/Plugins/Runtime/AndroidSingleInstanceService") +RemapDirectories=(From="Engine/Restricted/NotForLicensees/Plugins/Experimental/MultiWindow", To="Engine/Plugins/Experimental/MultiWindow")Abra o projeto e habilite as seguintes configurações de plugin ASIS:
Empacote e execute o exemplo de ASIS.
Com o SDK/NDK do Android e a configuração do modelo na Unreal Engine, agora podemos empacotar o projeto como um aplicativo Android:
Comunicação do app
Com o app empacotado da Unreal Engine, usaremos um app cliente de exemplo para comunicar com o APK da Unreal Engine.
O pacote da Unreal Engine terá três artefatos.
O APK com Android Service. Ele está localizado na pasta escolhida na caixa de diálogo do pacote do projeto.
As bibliotecas auxiliares ASIS usadas nos aplicativos cliente.
C++Binaries/Android/aars ├── asisclientlib-1.0.1-debug.aar ├── asisclientlib-1.0.1-debug.jar ├── asiscommon-1.0.1-debug.aarExemplo de aplicativo cliente que se comunica com o serviço. Ele NÃO está localizado no projeto Unreal empacotado, e sim na pasta "Binaries" do seu projeto da Unreal Engine. A localização é \Unreal Projects\*Project_Name*\Binaries\Android .
Você pode usar o Android Studio para abrir o projeto Android. Ele passará automaticamente pelo processo de compilação para Android quando for aberto.
Ou você pode usar a linha de comando.
o cmd pode usar para gerar o apk cliente
cd {Project_Name}\Binaries\Android\ExampleUseCase_{Project_Name}\
gradlew assembleDebugO APK será gerado em:
{Project_Name}\Binaries\Android\ExampleUseCase_{Project_Name}\app\build\outputs\apk\debug\app-debug.apk.
De volta ao Android Studio e com um dispositivo Android selecionado, execute o app com Shift+F10 ou selecione o botão Play no menu superior.
Serviço após a instalação
Agora execute os aplicativos de instalação do APK da Unreal Engine no seu dispositivo. Você pode usar a linha de comando na pasta de pacotes da Unreal Engine e executar o adb.
No aplicativo do Android, selecione Activate View1, Activate View2 e Activate View3 para visualizar o Android Service se comunicando com o aplicativo da Unreal Engine
Habilitar Multi-View
O Multi-View funciona a partir da versão 5.6 da UE. Ativar a Multi-View requer o plugin AndroidSingleInstanceService. Siga as etapas anteriores para habilitar o ASIS. Você pode começar aqui.
Habilite o plugin Multi-View nas configurações do plugin.
Crie duas câmeras no nível para testar o Multi-View. A TP_HMI_Automotive será usada neste exemplo.
Em seguida, abra o Blueprint de nível. Adicione os atores de câmera aos Blueprints. Arraste o nó de ator de câmera e selecione "Obter visualização da câmera". Exclua o nó Obter câmera, pois só precisamos da referência de objeto de componente de câmera.
Em seguida, crie Registrar câmera para ASIS. Conecte o nó de objeto de câmera aos respectivos nós. Defina a Câmera Id como 1 e 2 para cada câmera. Conecte os pins de execução ao Evento de início de reprodução.
Empacote o projeto para Android.
Agora vamos abrir o app cliente no Android Studio. Abra o projeto do aplicativo cliente Android de exemplo. Ele NÃO está localizado no projeto Unreal empacotado, e sim na pasta "Binaries" do seu projeto da Unreal Engine. O localização do código do curso para o app cliente é:
{Project_Name}\Binaries\Android\ExampleUseCase_{Project_Name}\.
Em seguida, mude do ASIS padrão para o MultiviewEdit.
Edit Binaries\Android\ExampleUseCase_{Project_Name}\app\src\main\AndroidManifest.xml Mude a atividade do jogo para ActivityForMultiView linha 22.
No Android Studio e com um dispositivo Android conectado, você pode executar o app com Shift+F10 ou selecionar o botão Play verde no menu superior.
Serviço após a instalação
Agora execute os aplicativos de instalação do APK da Unreal Engine no seu dispositivo. Você pode usar a linha de comando na pasta de pacotes da Unreal Engine e executar o adb.
Selecione Attach/Detach View1 e Attach/Detach View2 para visualizar as câmeras. Agora o ASIS com Multi-View funciona no Android.
Visão geral da arquitetura
Abordagens suportadas
Descrição da interface
Classe ASISConnection
Essa classe permite estabelecer uma conexão e se comunicar com um serviço ASIS. Ela engloba as complexidades dessa comunicação e fornece uma interface fácil de usar para enviar e receber dados e comandos.
A interface ASISConnection.ASISConnectionCallBacks define retornos de chamada para eventos de ASISConnection. Implemente essa interface quando quiser processar eventos de sucesso da conexão.
public interface ASISConnectionCallBacks
{
void onConnectionSuccess();
void onServiceDisconnected();
}
onConnectionSuccess(): é chamado quando a conexão com o serviço foi estabelecida com sucesso.
onServiceDisconnected(): é chamado quando há perda de conexão com o serviço.
A interface ASISConnection.EngineMessagesListener define um ouvinte para mensagens da engine. Implemente essa interface quando quiser processar mensagens da engine.
public interface EngineMessagesListener
{
void onEngineMessage(Message message);
}
onEngineMessage(Message message): é chamado quando uma mensagem é recebida da engine.
Message: os valores da mensagem recebida.
Classe ASISConnection.ConnectionBuilder
Essa classe implementa o padrão de design do compilador para criar instâncias de ASISConnection. Ela segue um estilo fluente em que os métodos podem ser encadeados, permitindo mais legibilidade quando vários parâmetros são necessários.
ConnectionBuilder(Context ctx)Inicializa uma nova instância da classe "ConnectionBuilder" usando o contexto fornecido.
Parâmetros
ctx: o contexto no qual criar o ConnectionBuilder.
public ConnectionBuilder withConnectionListener(ASISConnectionCallBacks connectionListener)Define o ouvinte ASISConnectionCallBacks para a ASISConnection.
Parâmetros
connectionListener: o ouvinte ASISConnectionCallBacks a ser definido.
Retornos
A instância de ConnectionBuilder, que permite encadeamento de métodos.
public ConnectionBuilder withEngineMessageListener(EngineMessagesListener engineMessageListener)Define o EngineMessagesListener para a ASISConnection.
Parâmetros
engineMessageListener: o ouvinte EngineMessagesListener a ser definido.
Retornos
A instância de ConnectionBuilder, que permite encadeamento de métodos.
public ConnectionBuilder withConnectionId(String connectionID)Define o connectionID para a ASISConnection.
Parâmetros
connectionID: a string com connectioID.
Retornos
A instância de ConnectionBuilder, que permite encadeamento de métodos.
public ConnectionBuilder withServicePackageName(String packageName)Substituir nome do pacote de serviço padrão
Parâmetros
packageName: o nome do pacote de serviço (com.epicgames.PROJECTNAME).
Retornos
A instância de ConnectionBuilder, que permite encadeamento de métodos.
public ConnectionBuilder withServiceClassName(String className)Substituir nome da classe de serviço padrão
Parâmetros
className: o nome da classe de serviço (com.epicgames.makeaar.UnrealSharedInstanceService).
Retornos
A instância de ConnectionBuilder, que permite encadeamento de métodos.
public ConnectionBuilder withObbModuleName(String obbModuleName)Substituir obbModuleName padrão
Parâmetros
obbModuleName: o nome do obb de conteúdo (nome do projeto na UE).
Retornos
A instância de ConnectionBuilder, que permite encadeamento de métodos.
public ConnectionBuilder withInsightsTracing()Habilitar InsightsTracing
Retornos
A instância de ConnectionBuilder, que permite encadeamento de métodos.
public ConnectionBuilder withCommandLineArgs(String cmdArgs)Substituir argumentos de linha de comando padrão
Parâmetros
cmdArgs: os argumentos de linha de comando para iniciar a UE.
Retornos
A instância de ConnectionBuilder, que permite encadeamento de métodos.
public ConnectionBuilder withOverridePropagateAlpha(boolean value)Substituir valor alfa de propagação móvel padrão
Parâmetros
value: sobrepõe o valor alfa de propagação móvel.
Retornos
A instância de ConnectionBuilder, que permite encadeamento de métodos.
public ASISConnection build()Cria uma instância de ASISConnection usando os parâmetros definidos.
Retornos
Uma nova instância de ASISConnection.
Exemplo:
public class UseServiceActivity extends Activity
implements ASISConnection.ASISConnectionCallBacks,
ASISConnection.EngineMessagesListener
....
ASISConnection mServiceConnection ;
...
mServiceConnection = new ASISConnection.ConnectionBuilder(this) .withServicePackageName("com.epicgames.UE_PROJECT")
.withObbModuleName("UE_PROJECT")
.withConnectionListener(this)
ASISConnection(ConnectionBuilder builder)O constructor que usa um ConnectionBuilder como argument.ConnectionBuilder.
Esse constructor costuma ser usado por meio do método de build() do ConnectionBuilder.
public boolean bindToUnrealInstanceService()Vincula-se a um serviço de instância única do Android da Unreal pelo autor da chamada.
Retornos
truese a vinculação foi bem-sucedida; caso contrário, false.
public void unbindToUnrealInstanceService()Desvincula-se do serviço de instância da Unreal.
public boolean isBoundToService()Verifica se o aplicativo está vinculado ao serviço.
Retornos
Esse método retorna verdadeiro se o aplicativo estiver vinculado ao serviço.
public int attachSurfaceToService(int displayIndex, Surface externalSurface)Anexe uma superfície externa ao serviço para renderização.
Parâmetros:
displayIndex: o índice da exibição, 0 para exibição única.
externalSurface: a superfície a ser anexada.
Retorna:
o ID da superfície anexada.
public boolean detachSurfaceFromService(int attachId, Handler.Callback callback)Desanexa uma superfície do serviço anexando o ID.
Parâmetros:
attachId: o ID do anexo para desanexar a superfície.
callback: um retorno de chamada que será chamado quando a desanexação for concluída.
Retornos
true se a desanexação foi iniciada com sucesso; caso contrário, false.
public boolean sendData(String key, Object value)Esse método permite enviar dados de valor-chave ao serviço ASIS.
Parâmetros
key: uma string que representa a chave para os dados enviados.
value: os dados a serem enviados.
Retornos
Esse método retorna um booleano que indica se os dados foram enviados com sucesso.
public boolean consoleCommand(String consoleCommand)Envia um comando do console ao serviço conectado.
Parâmetros
consoleCommand: uma string com um comando do console.
Retornos
Retorna true se a mensagem foi enviada com sucesso.
public boolean sendTouchEvent(MotionEvent event, int attachId)Encaminha um evento de toque ao serviço a partir de superfícies anexadas.
Parâmetros
event: o evento de movimento do Android que representa o evento de toque.
attachId: o ID associado à superfície.
Retornos
Retorna true se o evento de toque foi enviado com sucesso; caso contrário, false.
Integração com aplicativo Android
Importe bibliotecas Java ASIS para o projeto.
Copie bibliotecas geradas de {Project_Name}\Binaries\Android\aars para o espaço do app (por exemplo, libs).
{Android_app}/libs
├── asisclientlib-1.0.1-debug.aar
├── asisclientlib-1.0.1-debug.jar
├── asiscommon-1.0.1-debug.aar
└── asiscommon-1.0.1-debug.jar
Adicionar importação à lig via build.gradle
android {
...
repositories {
flatDir { dirs 'libs' }
}
...
}
def asiscommonVersion = "1.0.1"
def asisclientlibVersion = "1.0.1"
O diagrama de sequência do ciclo de vida das atividades do aplicativo: