Version: Unity 6.0 (6000.0)
语言 : 中文
GameActivity 要求和兼容性
更新 GameActivity 库

修改 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 文件中找到更多事件。

其他资源

GameActivity 要求和兼容性
更新 GameActivity 库