# 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/` 中找到桥接代码的文件。该目录中的大多数文件包含工具代码。下表列出了最重要的桥接代码文件及其用途：

| **File**              | **目的**                                                                                                            |
| --------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `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 中，创建一个新的 C# 脚本，使用 [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/` 目录。当 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)
