Einrichten von Android für Unreal Engine
Um ASIS (Android Single Instance Service) erfolgreich zu paketieren, müssen Sie Android SDK und NDK einrichten. Unreal Engine (UE) verwendet Android Studio sowie die Android-SDK-Befehlszeilenwerkzeuge, um die für die Entwicklung von Android-Projekten erforderlichen Android-SDK-Komponenten herunterzuladen und zu installieren. Folgen Sie der folgende Dokumentation:
Wenn Sie Unreal Engine 5.5.x verwenden, aktivieren Sie die folgenden SDK-Plattformen und Werkzeuge:
Erstellen eines Projekt aus der Vorlage
Nachdem Android SDK/NDK installiert ist, können wir nun das ASIS-Vorlagen-Plugin einrichten. Das Plugin wird als separates Archiv ausgeliefert. Daher müssen manuelle Schritte zur Vorbereitung des UE-Quellcodes durchgeführt werden.
Abrufen des Quellcodes für UE5.*
Rufen Sie den neuesten Quellcode von UE5 Main (Perforce oder Github) ab.
Perforce:
Github:
Einrichten des ASIS-Plugins
Wenn Sie Perforce verwenden:
Navigieren Sie zum ASIS-Plugin-Ordner:
UE5_Main\Engine\Restricted\NotForLicensees\Plugins\AndroidSingleInstanceService.Öffnen Sie im Ordner
AndroidSingleInstanceServicedenTemplates-Ordner:UE5_Main/Engine\Restricted\NotForLicensees\Plugins\AndroidSingleInstanceService\Templates\.
Wenn Sie Github verwenden:
Entpacken Sie das von Epic bereitgestellte Archiv und kopieren Sie die Inhalte des ASIS-Plugin nach Engine\Restricted\NotForLicensees\Plugins\AndroidSingleInstanceService.
Kopieren der Vorlage
Kopieren Sie den Ordner TP_HMI_ASIS nach UE5/Templates/.
Kopieren Sie anschließend den folgenden Code in die Datei 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)Führen Sie UnrealEditor aus. Jetzt sollten Sie die neue HMI-Vorlage sehen, wenn Sie den Projektbrowser von Unreal Engine öffnen:
Erstellen eines Projekts aus einer HMI-Vorlage
Das Projekt sollte so aussehen:
Hinzufügen des ASIS-Plugins zu einem bestehenden Projekt
Wenn Sie ein bestehendes Projekt haben, dem Sie ASIS hinzufügen müssen, gehen Sie wie folgt vor:
Aktivieren Sie ASIS in den Plugin-Einstellungen.
Fügen Sie das Remap-Plugin-Verzeichnis hinzu. Fügen Sie den folgenden Code zur Datei {ProjectName}/Config/DefaultGame.ini hinzu.
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")Öffnen Sie Ihr Projekt und aktivieren Sie die folgenden ASIS-Plugin-Einstellungen.
Paketieren und Ausführen eines ASIS-Beispiels
Mit Android SDK/NDK und der eingerichteten Vorlage in Unreal Engine können wir das Projekt nun als Android-Anwendung paketieren:
App-Kommunikation
Mit der mit Unreal Engine paketierten App nutzen wir eine Beispiel-Client-App, um mit der Unreal Engine APK zu kommunizieren.
Das Unreal Engine-Paket wird 3 Artefakte haben.
APK mit Android Service. Es befindet sich in dem Ordner, der im Paket-Dialogfeld ausgewählt wurde.
ASIS-Hilfsbibliotheken, die in den Client-Anwendungen verwendet werden
C++Binaries/Android/aars ├── asisclientlib-1.0.1-debug.aar ├── asisclientlib-1.0.1-debug.jar ├── asiscommon-1.0.1-debug.aarBeispiel einer Client-Anwendung, die mit Service kommuniziert. Diese finden Sie NICHT im paketierten Unreal-Projekt, sondern im Binärdateien-Ordner Ihres Unreal Engine-Projekts. Der Speicherort ist \Unreal Projects\*Project_Name*\Binaries\Android.
Sie können Android Studio verwenden, um das Android-Projekt zu öffnen. Es durchläuft automatisch den Android-Buildvorgang, sobald Sie es öffnen.
Oder Sie können die Befehlszeile verwenden.
Sie können cmd nutzen, um das Client-APK zu generieren.
cd {Project_Name}\Binaries\Android\ExampleUseCase_{Project_Name}\
gradlew assembleDebugDas APK wird erstellt in:
{Project_Name}\Binaries\Android\ExampleUseCase_{Project_Name}\app\build\outputs\apk\debug\app-debug.apk
Zurück in Android Studio können Sie auf einem ausgewählten Android-Gerät die App mit Umschalttaste+F10 ausführen oder auf die grüne Spielen-Schaltfläche im oberen Menü klicken.
Nach der Installation von Service
Führen Sie nun die installierten Unreal Engine APK-Anwendungen auf Ihrem Gerät aus. Sie können die Befehlszeile im Unreal Engine-Paket nutzen und adb ausführen.
Wählen Sie in der Android-App „Activate View1/View2/View3“, um zu sehen, wie der Android-Dienst mit der Unreal-Engine-Anwendung kommuniziert.
Aktivieren der Mehrfachansicht
Die Mehrfachansicht funktioniert ab Version UE 5.6. Die Aktivierung der Mehrfachansicht erfordert das AndroidSingleInstanceService-Plugin. Durchlaufen Sie die vorherigen Schritte, um ASIS zu aktivieren. Beginnen Sie dann hier.
Aktivieren Sie das Multiview-Plugin in den Plugin-Einstellungen.
Erstellen Sie zwei Kameras im Level, um Multiview zu testen. Für dieses Beispiel wird TP_HMI_Automotive verwendet.
Als Nächstes öffnen Sie den Level-Blueprint. Fügen Sie die Kamera-Actors zu den Blueprints hinzu. Ziehen Sie den „Camera Actor“-Knoten und wählen Sie „Kameraansicht abrufen“. Löschen Sie dann den „Get Camera-“-Knoten. Wir brauchen nur noch die Kamerakomponenten-Objektreferenz.
Erstellen Sie dann Register Kamera for Asis. Verbinden Sie den Kameraobjekt-Knoten mit den entsprechenden Knoten. Stellen Sie sicher, dass Sie die Kamera-ID für jede Kamera auf 1 und 2 setzen. Verbinden Sie die Ausführungs-Pins mit Event Spielbeginn.
Paketieren Sie das Projekt für Android.
Jetzt öffnen wir die Client-App in Android Studio. Öffnen Sie das Client-Android-Anwendungsbeispielprojekt. Diese finden Sie NICHT im paketierten Unreal-Projekt, sondern im Binärdateien-Ordner Ihres Unreal Engine-Projekts. Der Speicherort für den Kurscode für die Client-App ist:
{Project_Name}\Binaries\Android\ExampleUseCase_{Project_Name}\
Wechseln Sie als Nächstes vom Standard-ASIS zu MultiviewEdit.
Bearbeiten Sie Binaries\Android\ExampleUseCase_{Project_Name}\app\src\main\AndroidManifest.xml. Ändern Sie die Spielaktivität in Zeile 22 zu ActivityForMultiView.
In Android Studio können Sie auf einem verbundenen Android-Gerät die App mit Umschalttaste + F10 ausführen oder auf die grüne Spielen-Schaltfläche im oberen Menü klicken.
Nach der Installation von Service
Führen Sie nun die installierten Unreal Engine APK-Anwendungen auf Ihrem Gerät aus. Sie können die Befehlszeile im Unreal Engine-Paket nutzen und adb ausführen.
Wählen Sie „Attach/Detach View1“ und „Attach/Detach View2“ aus, um die Kameras anzuzeigen. Sie verfügen nun über ASIS mit Mehrfachansicht, das unter Android funktioniert.
Architekturübersicht
Unterstützte Ansätze
Interface-Beschreibung
Klasse ASISConnection
Diese Klasse erlaubt den Aufbau einer Verbindung und die Kommunikation mit einem ASIS-Dienst. Sie umfasst die Komplexität dieser Kommunikation und bietet ein einfach zu verwendendes Interface zum Senden und Empfangen von Daten und Befehlen.
Das Interface ASISConnection.ASISConnectionCallBacks definiert Callbacks für ASISConnection-Events. Implementieren Sie dieses Interface, wenn Sie Verbindungserfolgs-Events verarbeiten wollen.
public interface ASISConnectionCallBacks
{
void onConnectionSuccess();
void onServiceDisconnected();
}
onConnectionSuccess() wird aufgerufen, wenn die Verbindung zum Service erfolgreich hergestellt wurde.
onServiceDisconnected() wird aufgerufen, wenn eine Verbindung zum Service unterbrochen wurde.
Das Interface ASISConnection.EngineMessagesListener definiert einen Listener für Engine-Nachrichten. Implementieren Sie dieses Interface, wenn Sie Nachrichten von der Engine verarbeiten wollen.
public interface EngineMessagesListener
{
void onEngineMessage(Message message);
}
onEngineMessage(Message Nachricht) wird aufgerufen, wenn eine Nachricht von der Engine empfangen wird.
Message – Werte der eingehenden Nachricht
Klasse ASISConnection.ConnectionBuilder
Diese Klasse implementiert das Builder-Design zur Erstellung von ASISConnection-Instanzen. Sie folgt einem fließenden Stil, bei dem die Methoden verkettet werden können, was die Lesbarkeit verbessert, wenn mehrere Parameter erforderlich sind.
ConnectionBuilder(Context ctx)Initialisiert eine neue Instanz der Klasse `ConnectionBuilder` mit dem angegebenen Kontext.
Parameter
ctx: Der Kontext, in dem der ConnectionBuilder erstellen werden soll.
public ConnectionBuilder withConnectionListener(ASISConnectionCallBacks connectionListener)Legt den ASISConnectionCallBacks-Listener für die ASISConnection fest.
Parameter
connectionListener: Der einzurichtende ASISConnectionCallBacks-Listener.
Rückgaben
Die ConnectionBuilder-Instanz, was die Verkettung von Methoden ermöglicht.
public ConnectionBuilder withEngineMessageListener(EngineMessagesListener engineMessageListener)Legt den EngineMessagesListener für die ASISConnection fest.
Parameter
engineMessageListener: Der festzulegende EngineMessagesListener-Listener.
Rückgaben
Die ConnectionBuilder-Instanz, was die Verkettung von Methoden ermöglicht.
public ConnectionBuilder withConnectionId(String connectionID)Legt die connectionID für die ASISConnection fest.
Parameter
connectionID: String mit connectioID
Rückgaben
Die ConnectionBuilder-Instanz, was die Verkettung von Methoden ermöglicht.
public ConnectionBuilder withServicePackageName(String packageName)Standard-Service-Paketname überschreiben
Parameter
packageName: Service-Paketname (com.epicgames.PROJECTNAME)
Rückgaben
Die ConnectionBuilder-Instanz, was die Verkettung von Methoden ermöglicht.
public ConnectionBuilder withServiceClassName(String className)Standard-Service-Klassenname überschreiben
Parameter
className: Service-Klassenname (com.epicgames.makeaar.UnrealSharedInstanceService)
Rückgaben
Die ConnectionBuilder-Instanz, was die Verkettung von Methoden ermöglicht.
public ConnectionBuilder withObbModuleName(String obbModuleName)Standard-obbModuleName überschreiben
Parameter
obbModuleName: Inhalt-obb-Name (UE-Projektname)
Rückgaben
Die ConnectionBuilder-Instanz, was die Verkettung von Methoden ermöglicht.
public ConnectionBuilder withInsightsTracing()InsightsTracing aktivieren
Rückgaben
Die ConnectionBuilder-Instanz, was die Verkettung von Methoden ermöglicht.
public ConnectionBuilder withCommandLineArgs(String cmdArgs)Standard-Befehlszeilen-Argumente überschreiben
Parameter
cmdArgs: Befehlszeilen-Argumente zum Starten von UE
Rückgaben
Die ConnectionBuilder-Instanz, was die Verkettung von Methoden ermöglicht.
public ConnectionBuilder withOverridePropagateAlpha(boolean value)Standard-Alpha-Wert für Mobilgerät-Propagierung überschreiben
Parameter
value: Alpha-Wert der Mobilgerät-Propagierung überschreiben
Rückgaben
Die ConnectionBuilder-Instanz, was die Verkettung von Methoden ermöglicht.
public ASISConnection build()Erstellt eine ASISConnection-Instanz mit den festgelegten Parametern.
Rückgaben
Eine neue ASISConnection-Instanz.
Beispiel:
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)Ein Constructor, der einen ConnectionBuilder als Argument verwendet.
Dieser Constructor wird üblicherweise durch die build()-Methode des ConnectionBuilder verwendet.
public boolean bindToUnrealInstanceService()Bindet durch den jeweiligen Caller an einen Unreal Android-Einzelinstanz-Service.
Rückgaben
True, wenn die Bindung erfolgreich war, andernfalls False.
public void unbindToUnrealInstanceService()Hebt die Bindung vom Unreal-Instanzdienst auf.
public boolean isBoundToService()Prüft, ob die Anwendung aktuell an den Service gebunden ist.
Rückgaben
Diese Methode gibt True zurück, wenn die Anwendung an den Service gebunden ist.
public int attachSurfaceToService(int displayIndex, Surface externalSurface)Fügen Sie dem Service eine externe Oberfläche zum Rendering hinzu.
Parameter:
displayIndex: Der Index der Anzeigen; 0 für eine einzelne Anzeige.
externalSurface: Die Oberfläche, die ankoppeln werden soll.
Rückgaben:
Die ID der angehängten Oberfläche.
public boolean detachSurfaceFromService(int attachId, Handler.Callback callback)Trennt eine Oberfläche vom Service, indem die ID angehängt wird.
Parameter:
attachId: Die ID des Anhangs, der von der Oberfläche abkoppeln werden soll.
callback: Ein Callback, der abgerufen wird, wenn das Abkoppeln abgeschlossen ist.
Rückgaben
True, wenn das Abkoppeln erfolgreich initiiert wurde, ansonsten False.
public boolean sendData(String key, Object value)Diese Methode erlaubt Ihnen, Schlüssel-Wert-Daten an den ASIS-Service zu senden.
Parameter
Key: Ein String, der den Schlüssel für die gesendeten Daten darstellt.
value: Das zu sendende Datenstück.
Rückgaben
Diese Methode gibt einen Booleschen Wert zurück, der anzeigt, ob die Daten erfolgreich gesendet wurden.
public boolean consoleCommand(String consoleCommand)Sendet einen Konsolenbefehl an den verbundenen Dienst.
Parameter
consoleCommand: Ein String mit einem Konsolenbefehl.
Rückgaben
Gibt True zurück, wenn die Nachricht erfolgreich gesendet wurde.
public boolean sendTouchEvent(MotionEvent event, int attachId)Leitet das Touch-Ereignis von angehängten Oberflächen an den Service weiter.
Parameter
Event: Android MotionEvent, das das Touch-Ereignis darstellt.
attachId: Die der Oberfläche zugeordnete ID.
Rückgaben
Gibt True zurück, wenn das Berührungsereignis erfolgreich gesendet wurde, andernfalls False.
Android-Anwendungsintegration
Importieren Sie ASIS-Java-Bibliotheken in Ihr Projekt.
Kopiert generierte Bibliotheken von {Project_Name}\Binaries\Android\aars in Ihren App-Bereich (z. B. 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
Fügt den Import zu lig über build.gradle hinzu
android {
...
repositories {
flatDir { dirs 'libs' }
}
...
}
def asiscommonVersion = "1.0.1"
def asisclientlibVersion = "1.0.1"
Das Anwendungsaktivität-Lebenszyklussequenz-Diagramm: