Firebase 원격 구성으로 Unity 게임 구현

1. 소개

Firebase 원격 구성을 사용하여 앱에서 매개변수라고도 하는 키-값 쌍을 정의하고 클라우드에서 값을 업데이트하면 앱 업데이트를 배포하지 않고도 앱의 모양과 동작을 수정할 수 있습니다.

이 새로운 기능은 샘플 게임인 MechaHamster: Level Up with Firebase Edition에 추가됩니다. 이 샘플 게임은 기본 Firebase 게임 MechaHamster의 새로운 버전으로, 기본 제공 Firebase 기능의 대부분을 제거하므로 대신 Firebase의 새로운 용도를 구현할 수 있습니다.

앱이 의도한 대로 작동하도록 샘플 게임 코드에서 값의 기본 구성을 설정합니다. 이 값은 Firebase Console의 원격 구성에서 설정한 값으로 재정의할 수 있습니다.

학습할 내용

  • 클라우드에서 원격 구성 값을 설정하고 검색하는 방법
  • 검색된 값을 자동으로 사용하도록 Unity C# 코드를 계측하는 방법
  • 복합 값/객체를 JSON 값으로 저장, 계측, 재정의하는 방법
  • 원격 구성 조건을 사용하여 다양한 사용자 그룹에 다양한 값 대안을 제공하는 방법

필요한 사항

  • iOS 또는 Android 빌드가 지원되는 Unity 2019.1.0f1 이상
  • 게임을 빌드하고 실행하기 위한 실제 Android/iOS 기기 또는 시뮬레이터/에뮬레이터

2. 개발 환경 설정

다음 섹션에서는 Firebase로 레벨업 코드를 다운로드하여 Unity에서 열고 Firebase 프로젝트를 추가하는 방법을 설명합니다. 이 Firebase 레벨업 샘플 게임은 다른 여러 Firebase + Unity Codelab에서 사용되므로 이 섹션의 작업을 이미 완료했을 수도 있습니다. 이 경우 이 단계를 건너뛰고 Unity용 Firebase SDK 추가 단계로 진행하여 원격 구성을 샘플 게임 코드에 추가합니다.

코드 다운로드

명령줄에서 이 Codelab의 GitHub 저장소를 클론합니다.

git clone https://github.com/firebase/level-up-with-firebase

또는 git이 설치되어 있지 않으면 저장소를 ZIP 파일로 다운로드할 수 있습니다.

Unity 편집기에서 Firebase로 레벨업을 엽니다.

  1. Unity Hub를 실행하고 Projects(프로젝트) 탭에서 Open(열기) 옆에 있는 드롭다운 화살표를 클릭합니다.
  2. 디스크에서 프로젝트 추가를 클릭합니다.
  3. 코드가 있는 디렉터리로 이동한 후 OK를 클릭합니다.
  4. 메시지가 표시되면 사용할 Unity 편집기 버전과 대상 플랫폼 (Android 또는 iOS)을 선택합니다.
  5. 프로젝트 이름 level-up-with-firebase를 클릭하면 프로젝트가 Unity 편집기에서 열립니다.
  6. 편집기에서 자동으로 열리지 않으면 Unity 편집기의 Project(프로젝트) 탭에 있는 Assets(애셋) > Hamster(햄스터)에서 MainGameScene을 엽니다.

Unity 설치 및 사용에 관한 자세한 내용은 Unity에서 작업을 참고하세요.

3. Unity 프로젝트에 Firebase 추가

Firebase 프로젝트 만들기

  1. Firebase Console에서 프로젝트 추가를 클릭합니다.
  2. 새 프로젝트를 만들려면 원하는 프로젝트 이름을 입력합니다.
    그러면 프로젝트 ID (프로젝트 이름 아래에 표시됨)도 프로젝트 이름에 따른 항목으로 설정됩니다. 필요한 경우 프로젝트 ID에서 수정 아이콘을 클릭하여 추가로 맞춤설정할 수 있습니다.
  3. 메시지가 표시되면 Firebase 약관을 검토하고 이에 동의합니다.
  4. 계속을 클릭합니다.
  5. 이 프로젝트에 Google 애널리틱스 사용 설정 옵션을 선택하고 계속을 클릭합니다.
  6. 사용할 기존 Google 애널리틱스 계정을 선택하거나 새 계정 만들기를 선택하여 새 계정을 만듭니다.
  7. 프로젝트 만들기를 클릭합니다.
  8. 프로젝트가 생성되면 계속을 클릭합니다.

Firebase에 앱 등록

  1. Firebase Console을 열고 프로젝트 개요 페이지 중앙에서 Unity 아이콘을 클릭하여 설정 워크플로를 시작하거나 이미 Firebase 프로젝트에 앱을 추가한 경우 앱 추가를 클릭하여 플랫폼 옵션을 표시합니다.
  2. Apple (iOS) 및 Android 빌드 대상을 모두 등록하려면 선택하세요.
  3. Unity 프로젝트의 플랫폼별 ID를 입력합니다. 이 Codelab에서는 다음을 입력합니다.
    • Apple (iOS) - iOS 번들 ID 필드에 com.google.firebase.level-up를 입력합니다.
    • Android의 경우 - Android 패키지 이름 필드에 com.google.firebase.level_up를 입력합니다.
  4. 원하는 경우 Unity 프로젝트의 플랫폼별 닉네임을 입력합니다.
  5. 앱 등록을 클릭하고 구성 파일 다운로드 섹션으로 이동합니다.
  6. 처음 수행하지 않은 빌드 대상에 대해 이 과정을 반복합니다.

Firebase 구성 파일 추가

앱 등록을 클릭하면 두 개의 구성 파일 (빌드 대상별로 구성 파일 하나씩)을 다운로드하라는 메시지가 표시됩니다. Unity 프로젝트에서 Firebase에 연결하려면 이러한 파일에 Firebase 메타데이터가 필요합니다.

  1. 사용 가능한 두 가지 구성 파일을 모두 다운로드합니다.
    • Apple (iOS): GoogleService-Info.plist를 다운로드합니다.
    • Android: google-services.json을 다운로드합니다.
  2. Unity 프로젝트의 프로젝트 창을 연 다음 두 구성 파일을 모두 Assets(애셋) 폴더로 이동합니다.
  3. Firebase Console로 돌아가 설정 워크플로에서 다음을 클릭하고 Unity용 Firebase SDK 추가를 진행합니다.

참고: 프로젝트의 일반 설정을 열고 아래로 스크롤하여 내 앱 섹션으로 이동한 다음 원하는 구성 파일의 다운로드 버튼을 클릭하여 나중에 언제든지 이러한 파일을 다시 다운로드할 수 있습니다.

Unity용 Firebase SDK 추가

  1. Firebase Console에서 Firebase Unity SDK 다운로드를 클릭합니다.
  2. 편리한 위치에 SDK의 압축을 풉니다.
  3. Unity 프로젝트를 열고 Assets(애셋) > Import Package(패키지 가져오기) > Custom Package(커스텀 패키지)로 이동합니다.
  4. Import package 대화상자에서 압축을 푼 SDK가 포함된 디렉터리로 이동하여 FirebaseAnalytics.unitypackage를 선택한 다음 Open을 클릭합니다.
  5. Import Unity Package 대화상자가 표시되면 Import를 클릭합니다.
  6. 이전 단계를 반복하여 다음 두 패키지를 가져옵니다.
    • FirebaseRemoteConfig.unitypackage
    • FirebaseCrashlytics.unitypackage
      Crashlytics는 가벼운 실시간 비정상 종료 보고 도구로 앱 품질을 저하하는 안정성 문제를 추적하고 우선순위를 지정하고 문제를 해결하는 데 도움이 됩니다. 이전에 사용한 적이 없다면 Unity용 Crashlytics 학습 과정을 완료하는 것이 좋습니다.
  7. Firebase Console로 돌아가 설정 워크플로에서 다음을 클릭합니다.

Firebase SDK를 Unity 프로젝트에 추가하는 방법에 관한 자세한 내용은 추가 Unity 설치 옵션을 참고하세요.

4. 원격 구성 기본값 설정 및 새 값 가져오기

이 Codelab에서는 코드에 정의된 값을 사용하거나 Unity 편집기에서 직렬화된 객체를 업데이트하여 원격 구성으로 계측된 값을 사용합니다. SetDefaultsAsync를 사용하여 각 매개변수의 기본값을 구성하여 앱이 원격 구성 백엔드에 연결되기 전에 의도한 대로 작동하도록 합니다. 원격 구성에서 새 값을 가져오고 이를 활성화하여 코드에서 사용할 수 있도록 함으로써 앱을 최신 상태로 유지합니다.

원격 구성에서 새 값을 가져오려면 Assets/Hamster/Scripts/MainGame.cs 파일에 완료되어야 하는 구현되지 않은 메서드가 이미 많이 있습니다.

  1. MainGame.cs에 다음 using 문을 추가합니다.
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    using Firebase.RemoteConfig;
    
    Firebase.Extensions 모듈에는 콜백을 사용한 초기화 프로세스를 더 간단하게 관리하는 데 도움이 되는 C# Tasks API의 확장 프로그램이 포함되어 있습니다.
  2. 기존 InitializeCommonDataAndStartGame() 메서드를 현재 구현되지 않은 메서드 InitializeFirebaseAndStartGame()로 바꿔 MainGame.cs Start() 메서드에 Firebase 초기화를 추가합니다.
    void Start()
    {
       Screen.SetResolution(Screen.width / 2, Screen.height / 2, true);
       InitializeFirebaseAndStartGame();
    }
    
  3. MainGame.cs에서 InitializeFirebaseAndStartGame()를 찾습니다. 다음과 같이 앱 변수를 선언하고 메서드의 구현을 덮어씁니다.
    public Firebase.FirebaseApp app = null;
    
    // Begins the firebase initialization process and afterwards, opens the main menu.
    private void InitializeFirebaseAndStartGame()
    {
       Firebase.FirebaseApp.CheckAndFixDependenciesAsync()
       .ContinueWithOnMainThread(
          previousTask =>
          {
             var dependencyStatus = previousTask.Result;
             if (dependencyStatus == Firebase.DependencyStatus.Available) {
             // Create and hold a reference to your FirebaseApp,
             app = Firebase.FirebaseApp.DefaultInstance;
             // Set the recommended Crashlytics uncaught exception behavior.
             Crashlytics.ReportUncaughtExceptionsAsFatal = true;
             SetRemoteConfigDefaults();
             } else {
             UnityEngine.Debug.LogError(
                $"Could not resolve all Firebase dependencies: {dependencyStatus}\n" +
                "Firebase Unity SDK is not safe to use here");
             }
          });
    }
    
  4. Firebase 초기화는 성공 시 SetRemoteConfigDefaults를 호출하여 인앱 기본값을 설정합니다. 구현되지 않은 SetRemoteConfigDefaults 메서드를 다음으로 바꿉니다.
    private void SetRemoteConfigDefaults()
    {
       var defaults = new System.Collections.Generic.Dictionary < string, object > ();
       defaults.Add(
          Hamster.MapObjects.AccelerationTile.AccelerationTileForceKey,
          Hamster.MapObjects.AccelerationTile.AccelerationTileForceDefault);
       defaults.Add(
          Hamster.States.MainMenu.SubtitleOverrideKey,
          Hamster.States.MainMenu.SubtitleOverrideDefault);
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       remoteConfig.SetDefaultsAsync(defaults).ContinueWithOnMainThread(
          previousTask =>
          {
             FetchRemoteConfig(InitializeCommonDataAndStartGame);
          }
       );
    }
    

5. 새 값 가져오기 및 활성화 (필요한 경우)

이제 기존 FetchRemoteConfig 메서드를 완료해야 합니다. 이렇게 하면 onFetchAndActivateSuccessful라는 콜백 매개변수를 사용하여 원격 구성의 메서드 FetchAsync (원격 구성에서 새 값을 가져옴) 및 ActivateAsync (획득한 값을 활성화하여 코드에서 사용할 수 있음)에 대한 호출이 체이닝됩니다.

이전 단계에서 추가한 시작 코드는 시퀀스 끝에서 게임을 시작하기 위해 InitializeCommonDataAndStartGame를 콜백으로 사용하여 FetchRemoteConfig를 호출합니다. 다른 결과로 가져오기를 호출하기 위해 대체 콜백을 FetchRemoteConfig에 전달할 수 있습니다. 원격 구성 값에 따라 새 UI 메뉴를 여는 메서드 (나중에 구현하게 됨)를 전달하는 경우를 들 수 있습니다. 이렇게 하면 해당 값을 가져와서 활성화한 후에만 메뉴가 열립니다.

  1. 아래 코드를 FetchRemoteConfig에 붙여넣습니다.
    public void FetchRemoteConfig(System.Action onFetchAndActivateSuccessful)
    {
       if(app==null)
       {
          Debug.LogError($"Do not use Firebase until it is properly initialized by calling {nameof(InitializeFirebaseAndStartGame)}.");
          return;
       }
    
       Debug.Log("Fetching data...");
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       remoteConfig.FetchAsync(System.TimeSpan.Zero).ContinueWithOnMainThread(
          previousTask=>
          {
             if (!previousTask.IsCompleted)
             {
             Debug.LogError($"{nameof(remoteConfig.FetchAsync)} incomplete: Status '{previousTask.Status}'");
             return;
             }
             ActivateRetrievedRemoteConfigValues(onFetchAndActivateSuccessful);
          });
    }
    
  2. 다음으로, 전달된 콜백 onFetchAndActivateSuccessful를 수신하는 ActivateRetrievedRemoteConfigValues 메서드를 완료합니다. 활성화가 완료되면 지정된 콜백이 호출됩니다.
    private void ActivateRetrievedRemoteConfigValues(System.Action onFetchAndActivateSuccessful)
    {
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       var info = remoteConfig.Info;
       if(info.LastFetchStatus == LastFetchStatus.Success)
       {
          remoteConfig.ActivateAsync().ContinueWithOnMainThread(
             previousTask =>
             {
             Debug.Log($"Remote data loaded and ready (last fetch time {info.FetchTime}).");
             onFetchAndActivateSuccessful();
             });
       }
    }
    

초기화 컨텍스트에서 SetRemoteConfigDefaults에 의해 다운스트림으로 호출되면 ActivateRetrievedRemoteConfigValues는 이전 시작점인 InitializeCommonDataAndStartGame를 호출하여 기본 메뉴를 열어 게임을 시작합니다.

6. 원격 구성 로딩 전략 설정

앱을 사용하는 동안 다른 시점에 값을 가져오고 활성화하려면 이러한 함수를 다시 호출해야 하며, 객체가 값을 캐시한 경우 업데이트를 수행하도록 알려야 합니다. 원격 구성 값을 다시 가져오는 전략을 개발하려면 새 값이 필요한 시점과 새 값의 가져오기 및 활성화를 시작하여 사용 중 값이 변경되지 않도록 할 시점을 고려하세요.

현재 구현된 대로 앱이 시작될 때 원격 구성 값을 가져와서 활성화합니다. 메뉴를 변경하는 동안 가져오기를 숨기고 전환 중에는 상호작용을 차단할 수 있습니다. 또한 메뉴 상태의 변경을 통해 플레이어가 가고 있는 '위치'를 파악하고 값이 사용될 것으로 예측하는 데 사용할 수 있으므로 새 값을 가져오는 데 가장 적합한 시점인 경우가 많습니다.

Mechahamster의 메뉴 시스템을 살펴보면 UI 차단 메뉴 새로고침을 추가하는 가장 쉬운 방법은 기본 메뉴가 다시 시작되기 전에 (특히 다른 메뉴에서 뒤로 이동하여 액세스할 때) 이를 호출하고 UI 표시 메서드를 onFetchAndActivateSuccessful 콜백으로 전달하는 것입니다. 층 선택 메뉴에서도 동일한 작업을 수행할 수 있습니다.

앱 시작의 일부로 초기 로드를 사용하면 기본 메뉴를 통해 이동하는 모든 메뉴 탐색이 첫 번째 메뉴에 의해 처리되며, Level Select 메뉴를 다시 입력하면 새로고침됩니다. 층 선택 메뉴로 처음 들어가는 것은 기본 메뉴에서만 액세스할 수 있고 이미 포함되어 있으므로 중요하지 않습니다.

앱에서 이 기능을 사용 설정하려면 기본 메뉴에서 관련 메서드를 완료하고 레벨 선택 파일에서 이를 완료합니다. 그러면 FetchAsyncActivateAsync가 완료될 때까지 UI 표시가 차단됩니다.

  1. Assets/Hamster/Scripts/States/MainMenu.cs를 열고 기존 Resume 메서드를 다음으로 바꿉니다.
    public override void Resume(StateExitValue results) {
       CommonData.mainGame.SelectAndPlayMusic(CommonData.prefabs.menuMusic, true);
       CommonData.mainGame.FetchRemoteConfig(InitializeUI);
    }
    
  2. 파일을 저장합니다.
  3. Assets/Hamster/Scripts/States/BaseLevelSelect.cs를 열고 기존 Resume 메서드를 다음으로 바꿉니다.
    public override void Resume(StateExitValue results) {
       CommonData.mainGame.FetchRemoteConfig(ShowUI);
    }
    
  4. 파일을 저장합니다.

7. 가져오기 동작 디버그/검증

이 시점에서 진단/유효성 검사를 하는 것이 좋습니다. 다음 절차를 통해 앱을 수동으로 테스트하고 원격 구성 값을 가져오고 활성화하는 방법을 테스트할 수 있습니다.

정보는 시뮬레이터, 기기 또는 편집기 로그의 일부로 출력됩니다. iOS의 경우 Xcode에서 기기 및 시뮬레이터 로그를 볼 수 있습니다. Android의 경우 adb logcat를 실행하여 로그를 확인합니다. 편집기에서 재생을 눌러 Unity에서 코드를 실행하면 로그가 Console 탭에 표시됩니다.

  1. 앱을 다시 빌드하고 실행합니다 (편집기에서 기기 또는 시뮬레이터 사용).
  2. 게임의 기본 메뉴가 표시되면 게임의 로그 출력을 검토합니다. 여기에는 FetchRemoteConfigActivateRetrievedRemoteConfigValuesDebug.Log에서 생성한 로그가 포함됩니다. '데이터 가져오는 중...' 및 '원격 데이터가 로드되었으며 준비되었습니다'라는 메시지가 표시됩니다. 메시지 시작 부분의 타임스탬프를 참고하세요.
  3. 게임에서 라이선스를 누릅니다.
  4. 확인을 누릅니다.
  5. 게임의 기본 메뉴가 표시될 때까지 기다립니다.
  6. 게임의 로그 출력 (게임을 실행 중인 시스템 시계에 설정된 시간과 일치함)이 있는 이전 단계와 유사한 로그 출력을 검토합니다.
  7. 게임에서 플레이를 누릅니다.
  8. Let's Roll을 누릅니다.
  9. 키보드 화살표를 사용해 골대까지 공을 이동시키면 레벨 완료 메뉴가 열립니다.
  10. Levels(레벨)를 누릅니다.
  11. Level Select(레벨 선택) 메뉴가 로드될 때까지 기다립니다.
  12. 게임의 로그 출력을 다시 검토합니다. 이전 단계의 로그 메시지와 새로운 타임스탬프 (게임을 실행하는 시스템 시계에 설정된 시간과 일치)와 일치해야 합니다.

이 중 하나라도 앱에 표시되지 않는다면 가져오기 및 활성화 흐름의 일부 (또는 기기)가 잘못 구성되었을 수 있습니다. 첫 번째 로그가 표시되지 않으면 게임이 시작되지 않을 수 있습니다. 편집기 콘솔 또는 기기/에뮬레이터 로그에서 프로젝트/환경에 대한 경고 및 오류를 검토하고 조사합니다. 이 문제는 인터넷에 연결하는 것만큼 간단할 수 있습니다.

메뉴를 로드하는 초기 로그가 표시되지만 후속 로그 중 하나가 표시되지 않는 경우 Assets/Hamster/Scripts/States/MainMenu.csAssets/Hamster/Scripts/States/BaseLevelSelect.csResume 메서드를 조사/다시 구현합니다.

8. 코드 구현

SetDefaultsAsync()에서 인앱 매개변수 값을 구성하고 FetchAsync()ActivateAsync()에서 사용할 수 있는 최신 버전을 만들었으므로 이제 코드에서 이러한 값을 참조하고 사용합니다.

원격 구성 백엔드에서 값을 설정한 후 값을 가져와서 활성화한 후 (또는 한 번에 둘 다 수행) 해당 값을 앱에 적용할 수 있습니다. 이 값을 사용하려면 GetValue(string key)를 호출하고 매개변수 키를 인수로 선택하세요. 이렇게 하면 지원되는 다양한 유형(string, bool, long, double)으로 값에 액세스하는 속성이 있는 ConfigValue가 반환됩니다. 이 프로젝트와 대부분의 게임 사용 사례에서는 마지막 두 유형을 좀 더 자연스러운 intfloat로 변환해야 합니다. 이러한 전환으로 인해 문제가 발생하지 않도록 하려면 원격 구성에 설정된 초깃값이 앱 코드에서 사용할 유형의 유효한 범위 내에 있는지 확인하세요.

  1. 다음 파일 상단에 using Firebase.RemoteConfig;를 추가하여 원격 구성을 가져옵니다.
    • Assets/Hamster/Scripts/States/MainMenu.cs
    • Assets/Hamster/Scripts/MapObjects/AccelerationTile.cs
  2. AccelerationTile.csStart 메서드를 바꿉니다.
    private void Start() {
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       Acceleration = (float)remoteConfig.GetValue(AccelerationTileForceKey).DoubleValue;
    }
    
    이 변경으로 가속 타일이 받는 힘의 양이 원격 구성에서 수신되는 힘으로 변경됩니다.
  3. MainMenu.csInitializeUI 메서드 본문을 수정합니다.
    private void InitializeUI() {
       if (menuComponent == null) {
          menuComponent = SpawnUI<Menus.MainMenuGUI>(StringConstants.PrefabMainMenu);
       }
    
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       var subtitleOverride = JsonUtility.FromJson<Menus.MainMenuGUI.SubtitleOverride>(
          remoteConfig.GetValue(SubtitleOverrideKey).StringValue);
       // Only sets values if all fields of the override are non-default.
       if(subtitleOverride != null && subtitleOverride.IsValidOverride())
       {
          menuComponent.MenuSubtitleText.text = subtitleOverride.text;
          menuComponent.MenuSubtitleText.fontSize = subtitleOverride.fontSize;
          menuComponent.MenuSubtitleText.color = subtitleOverride.textColor;
       }
       ShowUI();
    }
    
    여기서 subtitleOverride는 클라우드의 모든 필드가 유형 기본값이 아닌 다른 값으로 설정된 경우 기본 메뉴 화면에서 자막을 변경하도록 설정되어 있습니다.

9. 원격으로 매개변수 값 설정

이제 앱이 완전히 계측화되었으므로 원격 구성 서버에서 매개변수와 값을 구성할 준비가 되었습니다. 이 Codelab에서는 Firebase Console을 사용하여 이를 설정합니다.

  1. Firebase Console에서 프로젝트를 엽니다.
  2. 메뉴에서 원격 구성을 선택하여 원격 구성 대시보드를 표시합니다.
  3. 앱에 정의한 매개변수별로 다음 표에 나열된 각 매개변수에 대해 매개변수 추가를 클릭하고 매개변수 이름 (키)을 붙여넣고, 표에 나열된 데이터 유형을 선택한 다음, 인앱 기본값 사용을 사용 중지한 후 새 기본값을 붙여넣습니다.

    매개변수 이름 (키)

    데이터 유형

    기본값

    가속_타일_힘

    숫자

    100

    부제목 재정의

    JSON

    {"text":"We overwrote the subtitle","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}

    acceleration_tile_force가 채워진 원격 구성 매개변수\n편집기
  4. 저장을 클릭하여 변경사항을 저장합니다.
  5. 게시를 클릭하여 새 구성을 게시하고 게임에 새 값을 사용할 수 있도록 합니다.
  6. 이러한 원격 매개변수를 설정한 후 앱을 다시 실행하고 원래 기본값을 재정의하는 방법을 관찰합니다.디버그 메뉴가 사용 설정된\nMechahamster 기본 화면

10. 원격 구성 조건을 사용하여 대안 게재

사용자가 사용하는 언어, 위치, 시간대 또는 사용하는 플랫폼에 따라 사용자에게 앱 경험을 제공하는 것이 좋습니다. 원격 구성 조건을 사용하면 이러한 속성 및 기타 속성을 개별적으로 또는 조합하여 사용하여 사용자에게 서로 다른 값 (대안이라고 함)을 제공할 수 있습니다.

조건의 일반적인 용도 중 하나는 iOS 플랫폼과 Android 플랫폼 간에 콘텐츠를 변경하는 것입니다. 아래 단계에 따라 사용 중인 플랫폼에 따라 subtitle_override에 다른 값을 제공하는 조건을 구현합니다.

  1. Firebase Console에서 프로젝트의 원격 구성 탭을 엽니다.
  2. subtitle_override.의 수정 버튼을 클릭합니다.
  3. 왼쪽 하단에서 새로 추가를 클릭합니다.
  4. 표시되는 드롭다운에서 조건부 값 위로 마우스를 가져가 새 조건 만들기를 클릭합니다.원격 구성 매개변수 편집기:\n조건부 값 옵션
  5. iOS를 타겟팅하는 경우 메시지가 표시되면 조건의 이름을 'is iOS'로, Android를 타겟팅하는 경우 'is Android'로 지정합니다. 둘 다 타겟팅하는 경우 여기에서 하나를 선택하고 Codelab의 나머지 부분에서 사용하기만 하면 됩니다.새 조건 정의 대화상자를 사용하여\niOS 관련 조건 정의
  6. 적용 조건...에서 선택... 드롭다운을 클릭하고 플랫폼을 선택합니다. 적절한 플랫폼을 선택합니다.새 조건 정의 편집기를 사용하여\niOS 플랫폼 선택
  7. 조건 만들기를 클릭하여 조건을 만듭니다. 매개변수 수정 대화상자가 다시 나타나고 이제 값을 설정할 수 있습니다.
    • Android를 타겟팅하는 경우 을 다음과 같이 설정합니다.
      {"text":"Level Up Android Version","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
      
    • iOS를 타겟팅하는 경우 을 다음과 같이 설정합니다.
      {"text":"Level Up iOS Version","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
      
  8. 저장을 클릭하여 변경사항을 저장합니다.
  9. 게시를 클릭하여 새 구성을 게시하고 게임에 새 값을 사용할 수 있도록 합니다.

게임을 다시 빌드하고 실행하면 게임의 부제목이 플랫폼별 변형으로 대체된 것을 볼 수 있습니다.

11. 실시간 업데이트를 수신하도록 원격 구성 구성

이제 원격 구성에서 실시간으로 원격 구성 템플릿 업데이트를 리슨하고 처리할 수 있습니다. 앱은 새로운 실시간 Remote Config API를 구독하여 구성 변경사항 및 업데이트된 값을 수신 대기할 수 있습니다.

작동 방식

업데이트를 수신 대기하려면 앱에서 OnConfigUpdateListener 이벤트를 구독하는 메서드를 구현해야 합니다. 하나 이상의 구성 업데이트 리스너가 구독되는 동안 새 원격 구성 템플릿을 자동으로 가져오고 구독한 핸들러가 호출되어 응답으로 로직을 실행하는 데 사용할 수 있습니다(예: 새 값을 활성화하여 애플리케이션의 나머지 부분에서 사용할 수 있게 함).

실시간 원격 구성 구현

게임에서 이 작동 방식을 보여주기 위해 코드를 다음과 같이 변경합니다.

구성 업데이트 핸들러 만들기

구성 업데이트 이벤트를 사용하는 첫 번째 단계는 이를 리슨할 수 있는 메서드를 만드는 것입니다. Assets/Hamster/Scripts/MainGame.cs에 다음 메서드를 배치합니다.

   void ActivateValuesOnConfigUpdate( object sender, ConfigUpdateEventArgs args)
   {
      if (args.Error != RemoteConfigError.None) {
         Debug.Log($"Error occurred while listening: {args.Error}");
         return;
      }

      Debug.Log("Updated keys: " + string.Join(", ", args.UpdatedKeys));
      // Activate all fetched values and then logs.
      var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
      remoteConfig.ActivateAsync().ContinueWithOnMainThread(
         task => {
            Debug.Log($"Keys from {nameof(ActivateValuesOnConfigUpdate)} activated.");
         });
   }

이 메서드는 새 값이 활성화될 때 업데이트된 키 목록과 성공 메시지를 로그에 출력합니다.

업데이트 이벤트 구독

이벤트가 호출될 때 ActivateValuesOnConfigUpdate를 활성화하려면 이벤트를 구독합니다. Assets/Hamster/Scripts/MainGame.csInitializeCommonDataAndStartGame() 메서드를 다음으로 바꿉니다.

   void InitializeCommonDataAndStartGame()
   {
      CommonData.prefabs = FindObjectOfType<PrefabList>();
      CommonData.mainCamera = FindObjectOfType<CameraController>();
      CommonData.mainGame = this;

      Screen.orientation = ScreenOrientation.LandscapeLeft;

      musicPlayer = CommonData.mainCamera.GetComponentInChildren<AudioSource>();

      CommonData.gameWorld = FindObjectOfType<GameWorld>();

      // Set up volume settings.
      MusicVolume = PlayerPrefs.GetInt(StringConstants.MusicVolume, MaxVolumeValue);
      // Set the music to ignore the listeners volume, which is used for sound effects.
      CommonData.mainCamera.GetComponentInChildren<AudioSource>().ignoreListenerVolume = true;
      SoundFxVolume = PlayerPrefs.GetInt(StringConstants.SoundFxVolume, MaxVolumeValue);

      // Subscribes to on config update after first initial fetch and activate
      FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener += ActivateValuesOnConfigUpdate;

      stateManager.PushState(new States.MainMenu());
   }

+= ActivateValuesOnConfigUpdate;로 끝나는 새 줄은 이벤트 핸들러를 이벤트를 구독합니다.

핸들러의 소유 객체가 소멸되면 구독 취소

null 참조 오류를 방지하기 위해 이벤트를 구독하는 메서드가 있는 객체는 소멸 시 해당 메서드를 구독 취소해야 합니다. Assets/Hamster/Scripts/MainGame.cs에 다음 메서드를 추가합니다.

   private void OnDestroy() 
   {
      FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener -= ActivateValuesOnConfigUpdate;
   }

새 기능 테스트

새로운 기능의 유효성을 검사하려면 빌드된 앱을 사용해 봅니다. 다음 절차에서는 실제 기기를 사용하여 로그를 읽고 디버그할 수 있어야 합니다.

acceleration_tile_force를 변경하고 관찰

앱을 시작한 후 Firebase Console의 원격 구성 섹션에서 다음을 수행합니다.

  1. acceleration_tile_force 옆에 있는 수정 버튼을 누릅니다.

dc602d4db54e50a4.png

  1. 값을 '120'으로 변경하고 저장을 누릅니다.

fcbc1df848f88009.png

  1. 변경사항 게시 버튼을 클릭합니다.

3785c1e00e7a6359.png

  1. 로그를 검사합니다.
  2. '수신 대기 중에 오류가 발생했습니다'로 시작하는 로그 메시지가 표시되면 나머지 내용을 읽고 출력되는 오류 메시지를 사용하여 디버깅을 시도합니다.
  3. '업데이트된 키'로 시작하는 로그가 표시되면 앱에서 변경된 값을 받은 것입니다.
  4. 둘 다 표시되지 않으면 나머지 로그를 살펴본 다음 구성 업데이트 핸들러 만들기의 안내를 다시 검토하고 로그를 다시 테스트하고 다시 확인하여 잘못된 항목이 있는지 확인하세요.

12. 수고하셨습니다.

원격 구성을 사용하여 게임 내 가치를 앱에서 가져오고 다양한 변형을 제공하는 조건을 사용하여 원격으로 제어했습니다.

학습한 내용

  • 원격 구성 값을 설정하고 가져오는 방법
  • 검색된 값을 사용하도록 Unity C# 코드를 계측하는 방법
  • 복합 값/객체를 JSON 값으로 저장, 계측, 재정의하는 방법
  • 원격 구성 조건을 사용하여 다양한 값 대안을 제공하는 방법

다음 단계

앱 인스턴스가 조건 또는 지역으로 인해 여러 값을 갖는 매개변수를 사용할 때 앱 인스턴스가 어떤 값을 가져오는지 로직을 더 잘 이해하려면 매개변수 값 우선순위를 참고하세요.