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/ 目录中。当 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);
    }
}
创建一个新的 GameObjectUnity 场景中的基本对象,可以代表角色、道具、场景、相机、航点等等。GameObject 的功能由附加到它的组件定义。 更多信息
参见 词汇表 并将其命名为 SendMessageReceiver。
将 SendMessageReceiver 脚本附加到 SendMessageReceiver GameObject。
在 \<unityproject\>/ExtraSourceFiles 目录中创建 MyFile.cpp。
注意:不要将 .cpp 文件放在 Assets 文件夹中,因为它们将链接到 IL2CPP 的 libil2cpp.so 共享库中,并且不会编译。
以下代码在名为 SendMessageReceiver 的 GameObject 上调用 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 播放器设置窗口中,转到 其他设置 > 配置 > 应用程序入口点 并选择 GameActivity。
选择 构建并运行。
触摸手机屏幕并检查 logcat。
您现在可以检查从 MyFile.cpp 发送并由 SendMessageReceiver.cs 脚本打印的 HelloFromBridge 日志。
备注:
MyFile.cpp 中的 UnityGameActivityPluginLoad 是弱链接的,并在 GameActivity 桥接初始化时调用。如果您需要,还有 ShutdownUserCode。MyFile.cpp 包含 UnityEventProcessInput 事件。您可以在 UGAEvents.h 文件中找到更多事件。