Version: 6000.3
语言: 中文
GameActivity 要求和兼容性
更新 GameActivity 库

修改 GameActivity 桥接代码

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 的增量生成管道可能会覆盖您在导出项目中所做的任何更改。如果您希望更改保留,请执行以下作:

  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. 创建一个新的游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
    请参阅术语表
    并将其命名为 SendMessageReceiver

  3. SendMessageReceiver 脚本附加到 SendMessageReceiver 游戏对象。

  4. 创造MyFile.cpp\<unityproject\>/ExtraSourceFiles目录。

    注意:不要放置.cpp文件,因为它们将链接到 IL2CPP 的libil2cpp.so共享库,并且不会编译。

    以下代码调用SendMessageFromCpp在名为SendMessageReceiver并且,通过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. 选择“生成并运行”

  8. 触摸手机屏幕并检查 logcat。

您现在可以检查HelloFromBridge日志,发送自MyFile.cpp并由SendMessageReceiver.cs脚本。

笔记

  • UnityGameActivityPluginLoadMyFile.cpp是弱链接的,并在 GameActivity 桥初始化时调用。如果需要,还可以使用 ShutdownUserCode。
  • MyFile.cpp包含UnityEventProcessInput事件。您可以在以下位置找到更多活动UGAEvents.h文件。

其他资源

GameActivity 要求和兼容性
更新 GameActivity 库