# Android Application Entries Game Activity Modify Bridge

> Make changes to the code that connects the Unity runtime to the GameActivity library.

## GameActivity 브리지 코드 수정##expand-gameactivity-bridge-code

GameActivity는 변경 사항을 적용하고 추가 기능을 구현하기 위해 수정할 수 있는 브리지를 통해 Unity와 상호 작용합니다. 브리지를 구성하는 코드는 C++로 작성되며, 빌드 프로세스 중에 GameActivity는 `libgame.so`라는 공유 라이브러리에 빌드합니다.

Unity 자체에서는 브리지 코드를 수정할 수 없으며, 먼저 [프로젝트를 익스포트](/engine/6000.0/manual/platform-specific/android/building-and-delivering/export-process.md)해야 합니다. 프로젝트를 익스포트한 후에는 `<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/`에서 브리지 코드를 구성하는 파일을 찾을 수 있습니다. 이 디렉토리에 있는 대부분의 코드 파일에는 유틸리티 코드가 포함되어 있습니다. 다음 표는 가장 중요한 브리지 코드 파일의 용도를 보여 줍니다.

| **파일**                | **목적**                                                                                                                                        |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `UGAInput.cpp`        | 입력 이벤트: 여기에서 GameActivity가 입력 데이터를 Unity에 전달하기 전에 입력 데이터를 조정하거나 변환할 수 있습니다.                                                                   |
| `UGAApplication.cpp`  | 수명 주기 이벤트: 여기에서 일시 정지, 재개, 포커스 지정, 포커스 해제와 같은 이벤트 처리 방식을 변경할 수 있습니다. 이는 코드 브리지의 핵심입니다.                                                        |
| `UGASoftKeyboard.cpp` | 터치스크린 키보드: 여기에서 온스크린 키보드의 구현을 변경할 수 있습니다. 기본 구현은 [GameTextInput](https://developer.android.com/games/agdk/add-support-for-text-input)을 사용합니다. |

프로젝트 익스포트 프로세스 중에 Unity의 [증분 빌드 파이프라인](/engine/6000.0/manual/unity-editor/editor-features/incremental-build-pipeline.md)은 익스포트한 프로젝트에서 변경한 사항을 덮어쓸 수 있습니다. 변경 사항을 유지하려면 다음 단계를 따르십시오.

1. [프로젝트를 익스포트](/engine/6000.0/manual/platform-specific/android/building-and-delivering/export-process.md)합니다.
2. Unity 프로젝트 외부에 새 디렉토리를 만듭니다. 이 새 디렉토리는 수정된 브리지 코드 디렉토리입니다.
3. 수정하려는 코드 파일을 `<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/` 디렉토리에서 수정된 브리지 코드 디렉토리로 복사합니다.
4. Unity에서 [Android.IPostGenerateGradleAndroidProject](/engine/6000.0/script-reference/unity-editor-android/i-post-generate-gradle-android-project.md)를 사용하여 수정된 브리지 코드 디렉토리에서 코드 파일을 다시 `<exported_project_directory>/unityLibrary/src/main/cpp/GameActivity/` 디렉토리로 복사하는 새로운 C# 스크립트를 생성합니다. Unity가 애플리케이션을 빌드할 때 이 코드는 수정된 버전으로 기본 브리지 코드 파일을 덮어씁니다.
5. 수정된 브리지 코드 디렉토리에 있는 파일의 브리지 코드를 수정합니다.

## GameActivity 브리지 코드 확장##additional-resources

기존 GameActivity 브리지 파일에 추가 소스 파일을 추가한 후 함께 컴파일할 수 있습니다.

예를 들면 다음과 같습니다([여기](/api/download.md?file=/engine/6000.0/media/downloads/AndroidExpandingGameActivity.zip)에서 예시 프로젝트 참조).

1. Unity에서 C# 스크립트를 생성하고 이름을 **SendMessageReceiver.cs**로 지정합니다.

   ```
   using UnityEngine;

   public class SendMessageReceiver : MonoBehaviour
   {
       public void SendMessageFromCpp(string message)
       {
           Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, message);
       }
   }
   ```

2. 새 게임 오브젝트를 생성하고 이름을 **SendMessageReceiver**로 변경합니다.

3. **SendMessageReceiver** 스크립트를 **SendMessageReceiver** 게임 오브젝트에 연결합니다.

4. `\<unityproject\>/ExtraSourceFiles` 디렉토리에 `MyFile.cpp`를 생성합니다.

   **참고**: IL2CPP의 `libil2cpp.so` 공유 라이브러리에 연결되어 컴파일되지 않으므로 `.cpp` 파일을 **Assets** 폴더에 넣지 마십시오.

   다음 코드는 스마트폰 화면을 터치할 때마다 `SendMessageReceiver`라는 게임 오브젝트에서 `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");
                }
           }
        });
   }
   ```

5. 다음 에디터 스크립트 **PostProcessor.cs**를 **Assets/Editor** 폴더에 넣습니다.

   (이렇게 하면 증분 빌드 방식으로 '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 Player 설정 창에서 **Other Settings** > **Configuration** > **Application Entry Point**로 이동하고 **GameActivity**를 선택합니다.

7. **Build & Run**을 선택합니다.

8. 스마트폰 화면을 터치하고 로그캣을 확인합니다.

이제 `MyFile.cpp`에서 전송하고 `SendMessageReceiver.cs` 스크립트로 출력한 `HelloFromBridge` 로그를 확인할 수 있습니다.

**참고**:

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

## 추가 리소스

* [GameActivity 라이브러리 업데이트](/engine/6000.0/manual/platform-specific/android/developing/application-entries/game-activity/update-library.md)
