文档

Unity Engine

Unity Engine

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

目的

UGAInput.cpp
输入事件:在此可以调整或转换输入数据,然后由 GameActivity 传递给 Unity。
UGAApplication.cpp
生命周期事件在此处可以更改如何处理暂停、恢复、聚焦和取消聚焦等事件。这是桥接代码的核心部分。
UGASoftKeyboard.cpp
触摸屏键盘:在此处可以更改屏幕键盘的实现。默认实现使用 GameTextInput。
在项目导出过程中,Unity 的增量构建管线可能会覆盖您在导出项目中所做的更改。如果希望您的更改持续存在,请按照以下步骤操作:
  1. 导出项目。
  2. 在 Unity 项目外部创建一个新目录,作为您修改后的桥接代码目录。
  3. 将要修改的代码文件从
    <exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/
    目录复制到已修改的桥代码目录中。
  4. 在 Unity 中,创建一个新的 C# 脚本,使用 Android.IPostGenerateGradleAndroidProject 接口,将修改后的代码文件从您的桥接代码目录复制回
    <exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/
    目录。当 Unity 构建应用程序时,此脚本将使用您的修改版本覆盖默认的桥接代码文件。
  5. 在修改后的桥接代码目录中对文件进行任何必要的修改。

扩展 GameActivity 桥接代码

您还可以向现有的 GameActivity 桥接文件中添加额外的源文件,并一起编译。
例如(可在此处找到示例项目):
  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
    文件中找到更多事件。

其他资源