Android Application Entries Game Activity Modify Bridge
Make changes to the code that connects the Unity runtime to the GameActivity library.
阅读时间5 分钟最后更新于 1 个月前
修改 GameActivity 桥接代码
GameActivity 通过桥接代码与 Unity 进行交互,您可以修改该桥接代码以实现更改或添加额外功能。桥接代码是用 C++ 编写的,在构建过程中,GameActivity 将其构建到名为 的共享库中。
libgame.so您无法在 Unity 内部直接修改桥接代码;必须先导出项目。导出项目后,您可以在 中找到桥接代码的文件。该目录中的大多数文件包含工具代码。下表列出了最重要的桥接代码文件及其用途:
<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/File | 目的 |
|---|---|
| 输入事件:在此可以调整或转换输入数据,然后由 GameActivity 传递给 Unity。 |
| 生命周期事件在此处可以更改如何处理暂停、恢复、聚焦和取消聚焦等事件。这是桥接代码的核心部分。 |
| 触摸屏键盘:在此处可以更改屏幕键盘的实现。默认实现使用 GameTextInput。 |
在项目导出过程中,Unity 的增量构建管线可能会覆盖您在导出项目中所做的更改。如果希望您的更改持续存在,请按照以下步骤操作:
- 导出项目。
- 在 Unity 项目外部创建一个新目录,作为您修改后的桥接代码目录。
- 将要修改的代码文件从 目录复制到已修改的桥代码目录中。
<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/ - 在 Unity 中,创建一个新的 C# 脚本,使用 Android.IPostGenerateGradleAndroidProject 接口,将修改后的代码文件从您的桥接代码目录复制回 目录。当 Unity 构建应用程序时,此脚本将使用您的修改版本覆盖默认的桥接代码文件。
<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/ - 在修改后的桥接代码目录中对文件进行任何必要的修改。
扩展 GameActivity 桥接代码
您还可以向现有的 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注意:不要将文件放在 Assets 文件夹中,因为它们会被链接到 IL2CPP 的.cpp共享库中,从而无法正确编译。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.cppSendMessageReceiver.csHelloFromBridge注意:
- 中的
MyFile.cpp链接较弱,在 GameActivity 桥接初始化时调用。如果需要,还可以使用 ShutdownUserCode。UnityGameActivityPluginLoad - 包含
MyFile.cpp事件。您可以在UnityEventProcessInput文件中找到更多事件。UGAEvents.h