Version: 2023.2
언어: 한국어
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에서 Android.IPostGenerateGradleAndroidProject를 사용하는 새 C# 스크립트를 생성하여 코드 파일을 수정된 브리지 코드 디렉토리에서 <exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/ 디렉토리로 다시 복사합니다. 애플리케이션이 빌드되면 이 코드는 기본 브리지 코드 파일을 수정된 버전으로 덮어씁니다.
  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);
    }
}
  1. 새 게임 오브젝트를 만들고 이름을 SendMessageReceiver로 지정합니다.
  2. SendMessageReceiver 스크립트를 SendMessageReceiver 게임 오브젝트에 연결합니다.
  3. \<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");
            }
        }
    });
}
  1. 다음 에디터 스크립트 PostProcessor.cs를 에셋/에디터에 배치합니다.

이렇게 하면 ’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)
    {
    }
}

  1. 플레이어 설정에서 GameActivity 애플리케이션 엔트리 포인트를 선택합니다.
  2. Build & Run을 클릭합니다.
  3. 휴대폰 화면을 터치하고 로그캣을 확인합니다.

이제 MyFile.cpp에서 전송되고 SendMessageReceiver.cs 스크립트로 출력된 HelloFromBridge 로그가 표시됩니다.

참고: * MyFile.cpp의 UnityGameActivityPluginLoad가 약하게 연결되어 있으며 GameActivity 브리지가 초기화될 때 호출됩니다. 필요한 경우 ShutdownUserCode도 있습니다. * MyFile.cpp에는 UnityEventProcessInput 이벤트가 포함됩니다. UGAEvents.h 파일에서 더 많은 이벤트를 찾을 수 있습니다.

추가 리소스

GameActivity 요구 사항 및 호환성
GameActivity 라이브러리 업데이트