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의 증분 빌드 파이프라인이 익스포트된 프로젝트에서 수행한 변경 사항을 덮어쓸 수 있습니다. 변경 사항을 유지하려면 다음 단계를 따르십시오.
<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/
디렉토리에서 수정할 코드 파일을 수정된 브리지 코드 디렉토리에 복사합니다.<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/
디렉토리로 다시 복사합니다. 애플리케이션이 빌드되면 이 코드는 기본 브리지 코드 파일을 수정된 버전으로 덮어씁니다.기존 GameActivity 브리지 파일에 소스 파일을 추가한 다음 함께 컴파일할 수 있습니다.
예를 들면 다음과 같습니다(여기에서 예시 프로젝트를 찾을 수 있음).
using UnityEngine;
public class SendMessageReceiver : MonoBehaviour
{
public void SendMessageFromCpp(string message)
{
Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, message);
}
}
\<unityproject\>/ExtraSourceFiles
디렉토리에서 MyFile.cpp를 만듭니다.참고: .cpp 파일을 Assets 디렉토리에 두지 마십시오. IL2CPP의 libil2cpp.so 공유 라이브러리에 연결되어 컴파일되지 않습니다.
아래 코드는 휴대폰 화면을 터치할 때마다 ’SendMessageReceiver’라는 게임 오브젝트에서 C# 메서드 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");
}
}
});
}
이렇게 하면 ’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)
{
}
}
이제 MyFile.cpp에서 전송되고 SendMessageReceiver.cs 스크립트로 출력된 HelloFromBridge 로그가 표시됩니다.
참고: * MyFile.cpp의 UnityGameActivityPluginLoad가 약하게 연결되어 있으며 GameActivity 브리지가 초기화될 때 호출됩니다. 필요한 경우 ShutdownUserCode도 있습니다. * MyFile.cpp에는 UnityEventProcessInput 이벤트가 포함됩니다. UGAEvents.h 파일에서 더 많은 이벤트를 찾을 수 있습니다.