Unity 6.3
0 онлайн 54 гостей 3 в системе
Вход

Изменить код моста 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 Конвейер построения Это может перезаписать любые изменения, которые вы сделали в экспортированном проекте. Если вы хотите, чтобы ваши изменения сохранились:

  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. Создайте скрипт C# в Unity и назовите его SendMessageReceiver.cs.

    using UnityEngine;
    
    public class SendMessageReceiver : MonoBehaviour
    {
        public void SendMessageFromCpp(string message)
        {
            Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, message);
        }
    }
    
  2. Создайте новый GameObject и назовите его SendMessageReceiver.

  3. Прикрепить скрипт SendMessageReceiver к SendMessageReceiver GameObject.

  4. Создать MyFile.cpp в \<unityproject\>/ExtraSourceFiles каталог.

    Примечание: Не помещайте файлы .cpp в папку Ассеты, потому что они будут связаны с общей библиотекой IL2CPP libil2cpp.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");
                 }
            }
         });
    }
    
  5. Поместите следующий скрипт редактора 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)
        {
        }
    }
    
    
  6. Из Android Окно настроек игрока, перейдите в Другие настройки > Конфигурация > Точка входа приложения и выберите GameActivity.

  7. Выберите Build & Run.

  8. Прикоснитесь к экрану телефона и проверьте logcat.

Теперь вы можете проверить журнал HelloFromBridge, отправленный из MyFile.cpp и отпечатанный скриптом SendMessageReceiver.cs.

Примечания::

  • UnityGameActivityPluginLoad в MyFile.cpp слабо связан и вызывается при инициализации моста GameActivity. Есть также ShutdownUserCode, если вам это нужно.
  • MyFile.cpp содержит событие UnityEventProcessInput. Больше событий можно найти в файле UGAEvents.h.

Дополнительные ресурсы