Unreal Engine に向けて Android を設定する
ASIS (Android Single Instance Service) を適切にパッケージ化するには、Android SDK および NDK を設定する必要があります。 Unreal Engine (UE) は、Android プロジェクトの開発に必要な Android SDK コンポーネントをダウンロードし、インストールするために Android Studio と Android SDK コマンドライン ツールを使用します。 以下のドキュメントを参照してください。
Unreal Engine 5.5.x をご使用の場合は、以下の SDK プラットフォームおよびツールを有効にしてください。
テンプレートからプロジェクトを作成する
Android SDK/NDK をインストールすると、ASIS テンプレート プラグインを設定できます。 プラグインは個別のアーカイブとして提供されるため、UE ソース コードを準備するために手動の手順を実行する必要があります。
UE5.* ソース コードを取得する
UE5 Main (Perforce または Github) から最新のソース コードを取得します。
Perforce:
Github:
ASIS プラグインを設定する
Perforce を使用している場合:
次の ASIS プラグイン フォルダに移動します。
UE5_Main\Engine\Restricted\NotForLicensees\Plugins\AndroidSingleInstanceServiceAndroidSingleInstanceServiceフォルダ内で、次の「Templates」フォルダを開きます。UE5_Main/Engine\Restricted\NotForLicensees\Plugins\AndroidSingleInstanceService\Templates\
Github を使用している場合:
Epic から提供されたアーカイブを解凍して、ASIS プラグイン コンテンツを次にコピーします。Engine\Restricted\NotForLicensees\Plugins\AndroidSingleInstanceService
テンプレートをコピーする
「TP_HMI_ASIS」フォルダを「UE5/Templates/」にコピーします。
次に、以下のコードを「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)UnrealEditor を実行します。 Unreal Engine のプロジェクト ブラウザを開くと新しい HMI テンプレートが表示されます。
HMI テンプレートからプロジェクトを作成する
プロジェクトは以下のようになります。
ASIS プラグインを既存のプロジェクトに追加する
既存のプロジェクトに ASIS プラグインを追加する必要がある場合は、以下の手順に従ってください。
プラグイン設定で ASIS を有効にします。
再マップ プラグイン ディレクトリを追加します。 {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")プロジェクトを開き、以下の ASIS プラグイン設定を有効にします。
ASIS サンプルをパッケージ化および実行する
Unreal engine で Android SDK/NDK とテンプレートを設定すると、プロジェクトを Android アプリケーションとしてパッケージ化できます。
アプリケーションの通信
Unreal Engine からアプリケーションをパッケージ化したら、サンプルのクライアント アプリケーションを使用して Unreal Engine APK と通信します。
Unreal Engine パッケージには 3 つのアーティファクトが含まれます。
Android サービスを含む APK。 これは、プロジェクト パッケージ ダイアログで選択したフォルダ内に配置されています。
クライアント アプリケーションで使用される ASIS ヘルパー ライブラリ。
C++Binaries/Android/aars ├── asisclientlib-1.0.1-debug.aar ├── asisclientlib-1.0.1-debug.jar ├── asiscommon-1.0.1-debug.aarサービスと通信するサンプルのクライアント アプリケーション。 これはパッケージ化された Unreal Engine プロジェクトではなく、Unreal Engine プロジェクトのバイナリ フォルダ ( 「\Unreal Projects\*Project_Name*\Binaries\Android 」) に配置されています。
Android Studio を使用して Android プロジェクトを開くことができます。 プロジェクトを開くと、Android のビルドプロセスが自動的に実行されます。
または、コマンドラインを使用することもできます。
コマンドを使用してクライアント APK を生成できます。
cd {Project_Name}\Binaries\Android\ExampleUseCase_{Project_Name}\
gradlew assembleDebugAPK は以下の場所に生成されます。
{Project_Name}\Binaries\Android\ExampleUseCase_{Project_Name}\app\build\outputs\apk\debug\app-debug.apk
Android Studio に戻り、Android デバイスを選択した状態で Shift + F10 キーを押すか、トップ メニューで緑色の再生ボタンを選択すると、アプリケーションを実行できます。
インストール サービス後
Unreal Engine APK をデバイスにインストールし、アプリケーションを実行します。 Unreal Engine パッケージ フォルダでコマンドラインを使用して、adb を実行できます。
Android アプリケーションで [Activate View1 (アクティブビュー 1)]、[Activate View2 (アクティブビュー 2)]、[Activate View3 (アクティブビュー 3)] を選択し、Android サービスが Unreal Engine アプリケーションと通信していることを確認します。
マルチビューを有効化する
マルチビューはバージョン UE 5.6 から使用できます。 マルチビューを有効にするには、AndroidSingleInstanceService プラグインが必要です。 前述の手順に従って ASIS を有効にしてからこちらの手順を開始してください。
プラグイン設定でマルチビューを有効にします。
レベルにカメラを 2 つ作成してマルチビューをテストします。 この例では TP_HMI_Automotive を使用します。
次に、レベル ブループリントを開きます。 カメラ アクタをブループリントに追加します。 カメラ アクタ ノードをドラッグして [Get Camera View (カメラビューを取得)] を選択します。 次に、カメラ取得ノードを削除します。必要なのはカメラ コンポーネント オブジェクト参照のみであるためです。
次に、Register Camera for Asis を作成します。 カメラ オブジェクト ノードをそれぞれのノードに接続します。 各カメラの ID は 1 と 2 に設定してください。 実行ピンを Event Begin Play に接続します。
Android 用にプロジェクトをパッケージ化します。
次に、Android Studio でクライアント アプリケーションを開きます。 サンプルのクライアント Android アプリケーション プロジェクトを開きます。 これはパッケージ化された Unreal Engine プロジェクトではなく、Unreal Engine プロジェクトのバイナリ フォルダ ( クライアント アプリケーションのソース コードの場所は以下のとおりです。
{Project_Name}\Binaries\Android\ExampleUseCase_{Project_Name}\
次に、標準の ASIS から MultiviewEdit に切り替えます。
Binaries\Android\ExampleUseCase_{Project_Name}\app\src\main\AndroidManifest.xml を編集し、22 行目のゲーム アクティビティを ActivityForMultiView に変更します。
Android デバイスが接続されている場合、Android Studio で、Shift + F10 を押すかトップ メニューで緑色の再生ボタンを選択することでアプリケーションを実行できます。
インストール サービス後
Unreal Engine APK をデバイスにインストールし、アプリケーションを実行します。 Unreal Engine パッケージ フォルダでコマンドラインを使用して、adb を実行できます。
[Attach/Detach View1 (アタッチ/デタッチビュー 1)] と [Attach/Detach View2 (アタッチ/デタッチビュー 2)] を選択してカメラを表示します。 これで、Android でマルチビュー対応の ASIS が機能するようになりました。
アーキテクチャの概要
サポートされるアプローチ
インターフェースの説明
クラス ASISConnection
このクラスによって、ASIS サービスとの接続と通信を確立できます。 この通信の複雑さをカプセル化し、データとコマンドの送受信を容易にする使いやすいインターフェースを提供します。
ASISConnection.ASISConnectionCallBacks インターフェースは、ASISConnection イベントのコールバックを定義します。 接続完了イベントを処理する場合は、このインターフェースを実装してください。
public interface ASISConnectionCallBacks
{
void onConnectionSuccess();
void onServiceDisconnected();
}
onConnectionSuccess() - サービスへの接続が正常に確立されると呼び出されます。
onServiceDisconnected() - サービスへの接続が失われた場合に呼び出されます。
ASISConnection.EngineMessagesListener インターフェースはエンジンのメッセージのリスナーを定義します。 エンジンからのメッセージを処理する場合はこのインターフェースを実装してください。
public interface EngineMessagesListener
{
void onEngineMessage(Message message);
}
onEngineMessage(Message message) - エンジンからメッセージを受信すると呼び出されます。
Message - 受信メッセージの値。
クラス ASISConnection.ConnectionBuilder
このクラスは、ビルダーの設計パターンを実装して ASISConnection のインスタンスを作成します。 これは、メソッドを連結できる流れるようなスタイルに従っており、複数のパラメータが必要な場合に可読性が向上します。
ConnectionBuilder(Context ctx)指定されたコンテキストを使用して `ConnectionBuilder` クラスの新しいインスタンスを初期化します。
パラメータ
ctx- ConnectionBuilder を作成するコンテキスト。
public ConnectionBuilder withConnectionListener(ASISConnectionCallBacks connectionListener)ASISConnection の ASISConnectionCallBacks リスナーを設定します。
パラメータ
connectionListener- 設定する ASISConnectionCallBacks リスナー。
デフォルトでは
メソッドの連結を可能にする ConnectionBuilder インスタンス。
public ConnectionBuilder withEngineMessageListener(EngineMessagesListener engineMessageListener)ASISConnection の EngineMessagesListener を設定します。
パラメータ
engineMessageListener- 設定する EngineMessagesListener リスナー。
デフォルトでは
メソッドの連結を可能にする ConnectionBuilder インスタンス。
public ConnectionBuilder withConnectionId(String connectionID)ASISConnection の connectionID を設定します。
パラメータ
connectionID- connectionID の文字列。
デフォルトでは
メソッドの連結を可能にする ConnectionBuilder インスタンス。
public ConnectionBuilder withServicePackageName(String packageName)デフォルトのサービス パケージ名をオーバーライド
パラメータ
packageName- サービス パッケージ名 (com.epicgames.PROJECTNAME)
デフォルトでは
メソッドの連結を可能にする ConnectionBuilder インスタンス。
public ConnectionBuilder withServiceClassName(String className)デフォルトのサービス クラス名をオーバーライド
パラメータ
className- サービス クラス名 (com.epicgames.makeaar.UnrealSharedInstanceService)
デフォルトでは
メソッドの連結を可能にする ConnectionBuilder インスタンス。
public ConnectionBuilder withObbModuleName(String obbModuleName)デフォルトの obbModuleName をオーバーライド
パラメータ
obbModuleName - コンテンツの OBB 名 (UE プロジェクト名)
デフォルトでは
メソッドの連結を可能にする ConnectionBuilder インスタンス。
public ConnectionBuilder withInsightsTracing()InsightsTracing を有効化
デフォルトでは
メソッドの連結を可能にする ConnectionBuilder インスタンス。
public ConnectionBuilder withCommandLineArgs(String cmdArgs)デフォルトのコマンドライン引数をオーバーライド
パラメータ
cmdArgs - UE を開始するコマンドライン引数
デフォルトでは
メソッドの連結を可能にする ConnectionBuilder インスタンス。
public ConnectionBuilder withOverridePropagateAlpha(boolean value)デフォルトのモバイル Propagate Alpha 値をオーバーライド
パラメータ
value- モバイル Propagate Alpha 値をオーバーライド。
デフォルトでは
メソッドの連結を可能にする ConnectionBuilder インスタンス。
public ASISConnection build()設定したパラメータを使用して ASISConnection インスタンスをビルドします。
デフォルトでは
新しい ASISConnection インスタンス。
例:
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)ConnectionBuilder を argument.ConnectionBuilder とするコンストラクタ。
通常このコンストラクタは、ConnectionBuilder の build() メソッドで使用されます。
public boolean bindToUnrealInstanceService()指定された呼び出し元によって、Unreal Android 単一インスタンスサービスにバインドします。
デフォルトでは
バインドが成功した場合は
true、そうでない場合は false を返します。
public void unbindToUnrealInstanceService()Unreal インスタンス サービスからバインドを解除します。
public boolean isBoundToService()アプリケーションが現在サービスにバインドされているかどうかをチェックします。
デフォルトでは
アプリケーションがサービスにバインドされている場合、このメソッドは true を返します。
public int attachSurfaceToService(int displayIndex, Surface externalSurface)レンダリング用に、外部サーフェスをサービスにアタッチします。
パラメータ:
displayIndex:ディスプレイのインデックス。単一ディスプレイの場合は 0 です。
externalSurface:アタッチするサーフェス。
戻り値:
アタッチするサーフェスの ID。
public boolean detachSurfaceFromService(int attachId, Handler.Callback callback)ID をアタッチすることで、サービスからサーフェスをデタッチします。
パラメータ:
attachId:Surface をデタッチするアタッチメントの ID。
callback:デタッチメントの完了時に呼び出されるコールバック。
デフォルトでは
デタッチメントが正常に開始された場合は true、そうでない場合は false を返します。
public boolean sendData(String key, Object value)このメソッドにより、ASIS サービスにキー/値データを送信できます。
パラメータ
key:送信されるデータのキーを表す文字列。
value:送信されるデータの部分。
デフォルトでは
このメソッドは、データが正常に送信されたかどうかを示すブール値を返します。
public boolean consoleCommand(String consoleCommand)接続されたサービスにコンソール コマンドを送信します。
パラメータ
consoleCommand:コンソールコマンドを表す文字列
デフォルトでは
メッセージが正常に送信された場合は true を返します。
public boolean sendTouchEvent(MotionEvent event, int attachId)アタッチされたサーフェスからサービスにタッチ イベントを転送します。
パラメータ
event:タッチ イベントを表す Android MotionEvent。
attachId:サーフェスに関連付けられた ID。
デフォルトでは
タッチ イベントが正常に送信された場合は true、そうでない場合は false を返します。
Android アプリケーションの統合
ASIS Java ライブラリをプロジェクトにインポートします。
「{Project_Name}\Binaries\Android\aars」から生成されたライブラリをアプリケーション スペースにコピーします (例: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
build.gradle を介してリグにインポートを追加します。
android {
...
repositories {
flatDir { dirs 'libs' }
}
...
}
def asiscommonVersion = "1.0.1"
def asisclientlibVersion = "1.0.1"
アプリケーション アクティビティのライフサイクル シーケンスの図: