Version: 2023.1
언어: 한국어
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. Create a C# script in Unity and name it SendMessageReceiver.cs.

    using UnityEngine;
    
    public class SendMessageReceiver : MonoBehaviour
    {
        public void SendMessageFromCpp(string message)
        {
            Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, message);
        }
    }
    
  2. Create a new GameObject and name it SendMessageReceiver.

  3. Attach the SendMessageReceiver script to the SendMessageReceiver GameObject.

  4. Create MyFile.cpp in \<unityproject\>/ExtraSourceFiles directory.

    Note: Don’t place .cpp files in the Assets directory, because they will link into IL2CPP’s libil2cpp.so shared library and won’t compile.

    The following code calls a C# method SendMessageFromCpp on a GameObject called SendMessageReceiver and passes HelloFromBridge as an extra parameter whenever you touch the phone screen.

    #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. Place the following editor script PostProcessor.cs in Assets/Editor:

    (It ensures that ExtraSourceFiles/MyFile.cpp is copied to unityLibrary/src/main/cpp/GameActivity/CustomFolder/MyFile.cpp in an incremental build friendly way.)

    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. Select GameActivity Application Entry Point in Android Player settings (menu: Edit > Project Settings > Player > Other Settings > Configuration).

  7. Build & Run을 클릭합니다.

  8. Touch the phone screen and check the Logcat.

You should now see HelloFromBridge log, sent from MyFile.cpp and printed by SendMessageReceiver.cs script.

참고:

  • UnityGameActivityPluginLoad in MyFile.cpp is weakly linked and is called when GameActivity bridge initializes. There’s also ShutdownUserCode if you need it.
  • MyFile.cpp contains UnityEventProcessInput event. You can find more events in UGAEvents.h file.

추가 리소스

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