# Android Application Entries Game Activity Modify Bridge

> Make changes to the code that connects the Unity runtime to the GameActivity library.

## GameActivity ブリッジコードの変更##expand-gameactivity-bridge-code

GameActivity は、Unity との相互作用にブリッジを使用します。ブリッジには変更を加えたり、追加機能を実装したりできます。ブリッジを構成するコードは C++ で記述され、ビルドプロセス中に GameActivity によって `libgame.so` と呼ばれる共有ライブラリにビルドされます。

Unity 自体ではブリッジコードは変更できません。最初に [プロジェクトをエクスポート](/engine/6000.0/manual/platform-specific/android/building-and-delivering/export-process.md) する必要があります。プロジェクトをエクスポートすると、ブリッジコードを構成するファイルが `<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/` に作成されます。このディレクトリのほとんどのコードファイルにはユーティリティコードが含まれています。以下の表は、最も重要なブリッジコードファイルの目的を示しています。

| **ファイル**              | **説明**                                                                                                                                             |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `UGAInput.cpp`        | 入力イベント: ここでは、GameActivity が Unity に渡す前の入力データを調整または変換できます。                                                                                          |
| `UGAApplication.cpp`  | ライフサイクルイベント: ここでは、一時停止、再開、フォーカス、フォーカス解除などのイベントのハンドル方法を変更できます。これは、コードブリッジのコア機能です。                                                                   |
| `UGASoftKeyboard.cpp` | タッチスクリーンキーボード: ここでは、オンスクリーンキーボードの実装を変更できます。デフォルトの実装では、[GameTextInput](https://developer.android.com/games/agdk/add-support-for-text-input) を使用します。 |

プロジェクトのエクスポート処理中に、Unity の [インクリメンタルビルドパイプライン](/engine/6000.0/manual/unity-editor/editor-features/incremental-build-pipeline.md) によって、エクスポートしたプロジェクトに加えた変更が上書きされる場合があります。変更を持続させたい場合は以下を行ってください。

1. [プロジェクトをエクスポートします](/engine/6000.0/manual/platform-specific/android/building-and-delivering/export-process.md)。
2. Unity プロジェクトの外部に新しいディレクトリを作成します。この新しいディレクトリを変更後のブリッジコードディレクトリにします。
3. 変更後のブリッジコードディレクトリに、変更したいコードファイルを `<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/` ディレクトリからコピーします。
4. Unity で [Android.IPostGenerateGradleAndroidProject](/engine/6000.0/script-reference/unity-editor-android/i-post-generate-gradle-android-project.md) を使用して、変更後のブリッジコードディレクトリにあるコードファイルをコピーして `<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/` ディレクトリに戻す新しい C# スクリプトを作成します。Unity がアプリケーションをビルドするとき、このコードを使ってデフォルトのブリッジコードファイルを変更後のバージョンで上書きします。
5. 変更後のブリッジコードディレクトリ内のファイルを使用してブリッジコードを変更します。

## GameActivity ブリッジコードの拡張##additional-resources

既存の GameActivity ブリッジファイルにソースファイルを追加して、一緒にコンパイルできます。

以下に例を示します (サンプルプロジェクトは [こちら](/api/download.md?file=/engine/6000.0/media/downloads/AndroidExpandingGameActivity.zip) にあります)。

1. Unity で C# スクリプトを作成し、**SendMessageReceiver.cs** という名前を付けます。

   ```
   using UnityEngine;

   public class SendMessageReceiver : MonoBehaviour
   {
       public void SendMessageFromCpp(string message)
       {
           Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, message);
       }
   }
   ```

2. 新しいゲームオブジェクトを作成し、**SendMessageReceiver** という名前を付けます。

3. **SendMessageReceiver** ゲームオブジェクトに **SendMessageReceiver** スクリプトをアタッチします。

4. `\<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");
                }
           }
        });
   }
   ```

5. 以下のエディタースクリプト **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)
       {
       }
   }
   ```

6. Android Player 設定ウィンドウで、**Other Settings** > **Configuration** > **Application Entry Point** に移動し、**GameActivity** を選択します。

7. **Build & Run** を選択します。

8. スマートフォンの画面をタッチして logcat を確認します。

これで、`MyFile.cpp` から送信されて `SendMessageReceiver.cs` スクリプトによって出力された `HelloFromBridge` ログを確認できるようになりました。

**ノート**:

* `MyFile.cpp` の `UnityGameActivityPluginLoad` はリンクが弱く、GameActivity のブリッジを初期化すると呼び出されます。必要に応じて ShutdownUserCode を使用することもできます。
* `MyFile.cpp` には `UnityEventProcessInput` イベントが含まれます。その他のイベントは `UGAEvents.h` ファイルにあります。

## 追加リソース

* [GameActivity ライブラリの更新](/engine/6000.0/manual/platform-specific/android/developing/application-entries/game-activity/update-library.md)
