Изменить код моста 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’s Конвейер построения Это может перезаписать любые изменения, которые вы сделали в экспортированном проекте. Если вы хотите, чтобы ваши изменения сохранились:
- Экспортируйте свой проект.
- Создайте новую директорию вне вашего проекта Unity. Эта новая директория будет вашей модифицированной директорией кодов моста.
- Скопируйте файлы кодов, которые вы хотите изменить, из каталога
<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/в каталог кодов модифицированного моста. - В Unity создайте новый скрипт C#, который использует Android.IPostGenerateGradleAndroidProject для копирования файлов кодов из вашего модифицированного каталога кодов моста обратно в каталог
<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/. Когда Unity компилирует ваше приложение, этот код перезапишет файлы кодов моста по умолчанию вашими модифицированными версиями. - Внесите любые изменения в код моста в файлах в каталоге измененного кода моста.
Развернуть код моста GameActivity
Вы можете добавить дополнительные исходные файлы к существующим файлам моста GameActivity, которые затем компилируются вместе.
Например (Вы можете найти пример проекта здесь):
-
Создайте скрипт C# в Unity и назовите его SendMessageReceiver.cs.
using UnityEngine; public class SendMessageReceiver : MonoBehaviour { public void SendMessageFromCpp(string message) { Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, message); } } Создайте новый GameObject и назовите его SendMessageReceiver.
Прикрепить скрипт SendMessageReceiver к SendMessageReceiver GameObject.
-
Создать
MyFile.cppв\<unityproject\>/ExtraSourceFilesкаталог.Примечание: Не помещайте файлы
.cppв папку Ассеты, потому что они будут связаны с общей библиотекой IL2CPPlibil2cpp.soи не будут компилироваться.Следующий код вызывает
SendMessageFromCppна GameObject под названием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"); } } }); } -
Поместите следующий скрипт редактора PostProcessor.cs в 2000 году Активы/Редактор папка:
(Это обеспечивает, что ‘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.
Выберите Build & Run.
Прикоснитесь к экрану телефона и проверьте logcat.
Теперь вы можете проверить журнал HelloFromBridge, отправленный из MyFile.cpp и отпечатанный скриптом SendMessageReceiver.cs.
Примечания::
UnityGameActivityPluginLoadвMyFile.cppслабо связан и вызывается при инициализации моста GameActivity. Есть также ShutdownUserCode, если вам это нужно.MyFile.cppсодержит событиеUnityEventProcessInput. Больше событий можно найти в файлеUGAEvents.h.