GameActivity は、Unity との相互作用にブリッジを使用します。ブリッジには変更を加えたり、追加機能を実装したりできます。ブリッジを構成するコードは C++ で記述され、ビルドプロセス中に GameActivity によって libgame.so と呼ばれる共有ライブラリにビルドされます。
Unity 自体ではブリッジコードは変更できません。最初に プロジェクトをエクスポート する必要があります。プロジェクトをエクスポートすると、ブリッジコードを構成するファイルが <exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/ に作成されます。このディレクトリのほとんどのコードファイルにはユーティリティコードが含まれています。以下の表は、最も重要なブリッジコードファイルの目的を示しています。
| ファイル | 説明 |
|---|---|
UGAInput.cpp |
入力イベント: ここでは、GameActivity が Unity に渡す前の入力データを調整または変換できます。 |
UGAApplication.cpp |
ライフサイクルイベント: ここでは、一時停止、再開、フォーカス、フォーカス解除などのイベントのハンドル方法を変更できます。これは、コードブリッジのコア機能です。 |
UGASoftKeyboard.cpp |
タッチスクリーンキーボード: ここでは、オンスクリーンキーボードの実装を変更できます。デフォルトの実装では、GameTextInput を使用します。 |
プロジェクトのエクスポート処理中に、Unity の インクリメンタルビルドパイプライン によって、エクスポートしたプロジェクトに加えた変更が上書きされる場合があります。変更を持続させたい場合は以下を行ってください。
<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/ ディレクトリからコピーします。<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/ ディレクトリに戻す新しい C# スクリプトを作成します。Unity がアプリケーションをビルドするとき、このコードを使ってデフォルトのブリッジコードファイルを変更後のバージョンで上書きします。既存の GameActivity ブリッジファイルにソースファイルを追加して、一緒にコンパイルできます。
以下に例を示します (サンプルプロジェクトは こちら にあります)。
Unity で C# スクリプトを作成し、SendMessageReceiver.cs という名前を付けます。
using UnityEngine;
public class SendMessageReceiver : MonoBehaviour
{
public void SendMessageFromCpp(string message)
{
Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, message);
}
}
新しいゲームオブジェクトを作成し、SendMessageReceiver という名前を付けます。
SendMessageReceiver ゲームオブジェクトに SendMessageReceiver スクリプトをアタッチします。
\<unityproject\>/ExtraSourceFiles ディレクトリに MyFile.cpp を作成します。
ノート: .cpp ファイルは Assets フォルダーには配置しないでください。IL2CPP の libil2cpp.so 共有ライブラリにリンクされ、コンパイルされないためです。
以下のコードでは、SendMessageReceiver というゲームオブジェクトで SendMessageFromCpp を呼び出し、スマートフォンの画面をタッチするたびに追加のパラメーターとして HelloFromBridge を渡します。
#include "UGAApplication.h"
#include "game-activity/native_app_glue/android_native_app_glue.h"
void UnityGameActivityPluginLoad(Unity::UnityApplication& application)
{
application.GetEvents().Register<Unity::UnityEventProcessInput>([](const Unity::UnityEventProcessInput& e)
{
auto inputBuffer = e.GetInputBuffer();
if (inputBuffer->motionEventsCount != 0) {
for (uint64_t i = 0; i < inputBuffer->motionEventsCount; ++i) {
GameActivityMotionEvent* motionEvent = &inputBuffer->motionEvents[i];
if (motionEvent->action == AKEY_EVENT_ACTION_DOWN)
e.GetApplication().SendMessage("SendMessageReceiver", "SendMessageFromCpp", "HelloFromBridge");
}
}
});
}
以下のエディタースクリプト PostProcessor.cs を Assets/Editor フォルダーに配置します。
(これにより、インクリメンタルビルドで使用できるように、‘ExtraSourceFiles/MyFile.cpp’ が ‘unityLibrary/src/main/cpp/GameActivity/CustomFolder/MyFile.cpp’ にコピーされるようにします。)
using System;
using UnityEditor.Android;
using UnityEditor;
using UnityEngine;
public class PostProcessor : AndroidProjectFilesModifier
{
const string CustomSourceFileSrc = "ExtraSourceFiles/MyFile.cpp";
const string CustomSourceFileDst = "unityLibrary/src/main/cpp/GameActivity/CustomFolder/MyFile.cpp";
public override AndroidProjectFilesModifierContext Setup()
{
var ctx = new AndroidProjectFilesModifierContext();
ctx.Dependencies.DependencyFiles = new[]
{
CustomSourceFileSrc
};
ctx.AddFileToCopy(CustomSourceFileSrc, CustomSourceFileDst);
return ctx;
}
public override void OnModifyAndroidProjectFiles(AndroidProjectFiles projectFiles)
{
}
}
Android Player 設定ウィンドウで、Other Settings > Configuration > Application Entry Point に移動し、GameActivity を選択します。
Build & Run を選択します。
スマートフォンの画面をタッチして logcat を確認します。
これで、MyFile.cpp から送信されて SendMessageReceiver.cs スクリプトによって出力された HelloFromBridge ログを確認できるようになりました。
ノート:
MyFile.cpp の UnityGameActivityPluginLoad はリンクが弱く、GameActivity のブリッジを初期化すると呼び出されます。必要に応じて ShutdownUserCode を使用することもできます。MyFile.cpp には UnityEventProcessInput イベントが含まれます。その他のイベントは UGAEvents.h ファイルにあります。