Trang bị cho trò chơi Unity của bạn với Cấu hình từ xa Firebase

1. Giới thiệu

Bạn có thể sử dụng Cấu hình từ xa Firebase để xác định các cặp khóa-giá trị , còn được gọi là tham số, trong ứng dụng của mình và cập nhật giá trị của chúng trên đám mây, cho phép bạn sửa đổi giao diện và hành vi của ứng dụng mà không cần phân phối bản cập nhật ứng dụng.

Bạn sẽ thêm chức năng mới này vào một trò chơi mẫu, MechaHamster: Tăng cấp với phiên bản Firebase . Trò chơi mẫu này là phiên bản mới của trò chơi Firebase cổ điển MechaHamster loại bỏ hầu hết chức năng Firebase tích hợp sẵn, mang lại cho bạn cơ hội triển khai các cách sử dụng mới của Firebase thay cho chúng.

Để đảm bảo ứng dụng của bạn hoạt động như dự kiến, bạn sẽ đặt cấu hình mặc định cho các giá trị trong mã trò chơi mẫu và những giá trị này có thể bị ghi đè bởi các giá trị bạn đặt trong Cấu hình từ xa trong bảng điều khiển Firebase .

Bạn sẽ học được gì

  • Cách đặt giá trị Cấu hình từ xa trên đám mây và truy xuất chúng
  • Cách thiết lập mã Unity C# của bạn để tự động sử dụng các giá trị được truy xuất
  • Cách lưu trữ, ghi đè và ghi đè các giá trị/đối tượng kết hợp dưới dạng giá trị JSON
  • Cách sử dụng các điều kiện Cấu hình từ xa để cung cấp các biến thể giá trị khác nhau cho các nhóm người dùng khác nhau

Những gì bạn cần

  • Unity 2019.1.0f1 trở lên có hỗ trợ xây dựng iOS và/hoặc Android
  • Thiết bị Android/iOS vật lý hoặc trình mô phỏng/trình mô phỏng để xây dựng và chạy trò chơi

2. Thiết lập môi trường phát triển của bạn

Các phần sau đây mô tả cách tải xuống mã Tăng cấp bằng Firebase , mở mã đó trong Unity và thêm dự án Firebase. Trò chơi mẫu Tăng cấp với Firebase này được một số lớp học lập trình Firebase + Unity khác sử dụng, vì vậy có thể bạn đã hoàn thành các nhiệm vụ trong phần này. Nếu vậy, bạn có thể bỏ qua các bước này và tiến hành Thêm SDK Firebase cho Unity để thêm Cấu hình từ xa vào mã trò chơi mẫu.

Tải mã xuống

Sao chép kho lưu trữ GitHub của lớp học lập trình này từ dòng lệnh:

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

Ngoài ra, nếu bạn chưa cài đặt git, bạn có thể tải xuống kho lưu trữ dưới dạng tệp ZIP .

Mở Tăng cấp với Firebase trong trình chỉnh sửa Unity

  1. Khởi chạy Unity Hub và từ tab Dự án , nhấp vào mũi tên thả xuống bên cạnh Mở .
  2. Nhấp vào Thêm dự án từ đĩa .
  3. Điều hướng đến thư mục chứa mã, sau đó nhấp vào OK .
  4. Nếu được nhắc, hãy chọn phiên bản trình chỉnh sửa Unity để sử dụng và nền tảng mục tiêu của bạn (Android hoặc iOS).
  5. Nhấp vào tên dự án, tăng cấp với firebase và dự án sẽ mở trong trình chỉnh sửa Unity.
  6. Nếu trình soạn thảo của bạn không tự động mở nó, hãy mở MainGameScene trong Nội dung > Hamster trong tab Dự án của Trình chỉnh sửa Unity.

Để biết thêm thông tin về cách cài đặt và sử dụng Unity, hãy xem Làm việc trong Unity .

3. Thêm Firebase vào dự án Unity của bạn

Tạo dự án Firebase

  1. Trong bảng điều khiển Firebase , nhấp vào Thêm dự án .
  2. Để tạo một dự án mới, hãy nhập tên dự án mong muốn.
    Điều này cũng sẽ đặt ID dự án (hiển thị bên dưới tên dự án) thành giá trị nào đó dựa trên tên dự án. Bạn có thể tùy ý nhấp vào biểu tượng chỉnh sửa trên ID dự án để tùy chỉnh thêm.
  3. Nếu được nhắc, hãy xem lại và chấp nhận các điều khoản của Firebase .
  4. Nhấp vào Tiếp tục .
  5. Chọn tùy chọn Bật Google Analytics cho dự án này rồi nhấp vào Tiếp tục .
  6. Chọn tài khoản Google Analytics hiện có để sử dụng hoặc chọn Tạo tài khoản mới để tạo tài khoản mới.
  7. Nhấp vào Tạo dự án .
  8. Khi dự án đã được tạo, hãy nhấp vào Tiếp tục .

Đăng ký ứng dụng của bạn với Firebase

  1. Mở bảng điều khiển Firebase và từ giữa trang tổng quan dự án, hãy nhấp vào biểu tượng Unity để khởi chạy quy trình thiết lập hoặc nếu bạn đã thêm ứng dụng vào dự án Firebase của mình, hãy nhấp vào Thêm ứng dụng để hiển thị các tùy chọn nền tảng.
  2. Chọn để đăng ký cả mục tiêu xây dựng Apple (iOS) và Android.
  3. Nhập (các) ID dành riêng cho nền tảng của dự án Unity của bạn. Đối với lớp học lập trình này, hãy nhập thông tin sau:
    • Đối với Apple (iOS) - Nhập com.google.firebase.level-up vào trường ID gói iOS .
    • Đối với Android - Nhập com.google.firebase.level_up vào trường tên gói Android .
  4. Tùy chọn, nhập (các) biệt hiệu dành riêng cho nền tảng của dự án Unity của bạn.
  5. Nhấp vào Đăng ký ứng dụng và tiến tới phần Tải xuống tệp cấu hình .
  6. Lặp lại quy trình cho bất kỳ mục tiêu xây dựng nào mà bạn không thực hiện lần đầu tiên.

Thêm tệp cấu hình Firebase

Sau khi nhấp vào Đăng ký ứng dụng , bạn sẽ được nhắc tải xuống hai tệp cấu hình (một tệp cấu hình cho mỗi mục tiêu xây dựng). Dự án Unity của bạn cần siêu dữ liệu Firebase trong các tệp này để kết nối với Firebase.

  1. Tải xuống cả hai tệp cấu hình có sẵn:
    • Đối với Apple (iOS) : Tải xuống GoogleService-Info.plist .
    • Đối với Android : Tải xuống google-services.json .
  2. Mở cửa sổ Project của dự án Unity của bạn, sau đó di chuyển cả hai tệp cấu hình vào thư mục Nội dung .
  3. Quay lại bảng điều khiển Firebase, trong quy trình thiết lập, hãy nhấp vào Tiếp theo và tiến hành Thêm SDK Firebase cho Unity.

Lưu ý: Bạn luôn có thể tải xuống lại các tệp này sau bằng cách mở cài đặt chung của dự án, cuộn xuống phần Ứng dụng của bạn rồi nhấp vào nút tải xuống cho tệp cấu hình mong muốn.

Thêm SDK Firebase cho Unity

  1. Nhấp vào Tải xuống Firebase Unity SDK trong bảng điều khiển Firebase.
  2. Giải nén SDK ở nơi thuận tiện.
  3. Trong Dự án Unity đang mở của bạn, hãy điều hướng đến Nội dung > Gói nhập > Gói tùy chỉnh .
  4. Trong hộp thoại Nhập gói , hãy điều hướng đến thư mục chứa SDK đã giải nén, chọn FirebaseAnalytics.unitypackage rồi nhấp vào Mở .
  5. Từ hộp thoại Nhập gói thống nhất xuất hiện, nhấp vào Nhập .
  6. Lặp lại các bước trước để nhập hai gói sau:
    • FirebaseRemoteConfig.unitypackage
    • FirebaseCrashlytics.unitypackage
      Crashlytics là một trình báo cáo sự cố nhẹ, theo thời gian thực giúp bạn theo dõi, ưu tiên và khắc phục các vấn đề về độ ổn định làm giảm chất lượng ứng dụng của bạn. Nếu trước đây bạn chưa sử dụng nó, hãy cân nhắc hoàn thành Lộ trình học tập Crashlytics cho Unity .
  7. Quay lại bảng điều khiển Firebase và trong quy trình thiết lập, hãy nhấp vào Tiếp theo .

Để biết thêm thông tin về cách thêm SDK Firebase vào các dự án Unity, hãy xem Tùy chọn cài đặt Unity bổ sung .

4. Đặt mặc định Cấu hình từ xa và tìm nạp các giá trị mới

Trong lớp học lập trình này, bạn sẽ cập nhật các đối tượng sử dụng các giá trị được xác định trong mã hoặc được tuần tự hóa trong trình chỉnh sửa Unity để sử dụng các giá trị được trang bị bằng Cấu hình từ xa. Bạn sẽ định cấu hình các giá trị mặc định cho từng tham số bằng SetDefaultsAsync để ứng dụng của bạn hoạt động như dự định trước khi kết nối với phần phụ trợ Cấu hình từ xa. Ứng dụng của bạn sẽ luôn cập nhật bằng cách tìm nạp các giá trị mới từ Cấu hình từ xa và kích hoạt chúng để chúng có thể sử dụng được trong mã.

Để tìm nạp các giá trị mới từ Cấu hình từ xa, có một số phương thức chưa được triển khai đã có trong tệp Assets/Hamster/Scripts/MainGame.cs cần phải được hoàn thành.

  1. Thêm câu lệnh using sau vào MainGame.cs :
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    using Firebase.RemoteConfig;
    
    Mô-đun Firebase.Extensions chứa một số tiện ích mở rộng cho API tác vụ C# sẽ giúp quản lý quá trình khởi tạo bằng lệnh gọi lại đơn giản hơn.
  2. Thêm quá trình khởi tạo Firebase vào phương thức MainGame.cs Start() của bạn bằng cách thay thế phương thức LaunchizeCommonDataAndStartGame() hiện có bằng phương thức hiện chưa được triển khai, InitializeFirebaseAndStartGame() :
    void Start()
    {
       Screen.SetResolution(Screen.width / 2, Screen.height / 2, true);
       InitializeFirebaseAndStartGame();
    }
    
  3. Trong MainGame.cs , tìm InitializeFirebaseAndStartGame() . Khai báo một biến ứng dụng và ghi đè quá trình triển khai của phương thức như sau:
    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. Quá trình khởi tạo Firebase gọi SetRemoteConfigDefaults thành công để đặt các giá trị mặc định trong ứng dụng. Thay thế phương thức SetRemoteConfigDefaults chưa được triển khai bằng phương thức sau:
    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. Tìm nạp và kích hoạt các giá trị mới (nếu cần)

Bây giờ chúng ta cần hoàn thành phương thức FetchRemoteConfig hiện có. Điều này sẽ xâu chuỗi lệnh gọi đến các phương thức FetchAsync của Remote Config (tìm nạp các giá trị mới từ Remote Config) và ActivateAsync (kích hoạt các giá trị thu được đó để cung cấp chúng trong mã) bằng cách sử dụng tham số gọi lại có tên onFetchAndActivateSuccessful .

Mã khởi động mà chúng tôi đã thêm ở bước trước gọi FetchRemoteConfig với InitializeCommonDataAndStartGame làm lệnh gọi lại để bắt đầu trò chơi ở cuối chuỗi. Bạn có thể chuyển các lệnh gọi lại thay thế tới FetchRemoteConfig để gọi tìm nạp với các kết quả khác nhau. Một ví dụ (mà bạn sẽ triển khai sau) đang truyền vào một phương thức mở các menu giao diện người dùng mới, phụ thuộc vào các giá trị Cấu hình từ xa. Điều này sẽ khiến các menu chỉ mở sau khi các giá trị đó đã được tìm nạp và kích hoạt.

  1. Dán mã bên dưới vào 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. Tiếp theo, hãy hoàn thành phương thức ActivateRetrievedRemoteConfigValues ​​để nhận lệnh gọi lại được truyền vào, onFetchAndActivateSuccessful . Khi quá trình kích hoạt kết thúc, cuộc gọi lại được chỉ định sẽ được gọi:
    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();
             });
       }
    }
    

Khi được SetRemoteConfigDefaults gọi xuôi dòng từ ngữ cảnh khởi tạo, ActivateRetrievedRemoteConfigValues ​​gọi điểm bắt đầu trước đó, InitializeCommonDataAndStartGame , để bắt đầu trò chơi bằng cách mở menu chính.

6. Thiết lập chiến lược tải Cấu hình từ xa

Để tìm nạp và kích hoạt các giá trị vào lúc khác trong quá trình sử dụng ứng dụng, bạn cần gọi lại các hàm này và nếu bất kỳ đối tượng nào đã lưu các giá trị vào bộ nhớ đệm thì chúng phải được thông báo để thực hiện cập nhật. Để phát triển chiến lược tìm nạp lại các giá trị Cấu hình từ xa, hãy cân nhắc khi nào cần các giá trị mới và thời điểm bắt đầu tìm nạp và kích hoạt các giá trị mới để tránh thay đổi chúng trong khi sử dụng.

Như đã triển khai hiện tại, các giá trị Cấu hình từ xa được tìm nạp và kích hoạt khi ứng dụng khởi động. Tìm nạp có thể bị ẩn trong quá trình thay đổi menu đồng thời chặn tương tác trong quá trình chuyển đổi. Ngoài ra, đây thường là thời điểm phù hợp nhất để nhận các giá trị mới, vì sự thay đổi trong trạng thái menu thường có thể được sử dụng để biết "nơi" người chơi sẽ đến và dự đoán rằng một giá trị sẽ được sử dụng.

Nhìn qua hệ thống menu của Mechahamster, cách dễ nhất để thêm tính năng làm mới menu chặn giao diện người dùng là gọi nó trước khi menu chính tiếp tục lại (cụ thể là khi nó được truy cập bằng cách sao lưu khỏi menu khác) và chuyển phương thức hiển thị giao diện người dùng dưới dạng lệnh gọi lại onFetchAndActivateSuccessful . Điều tương tự có thể được thực hiện đối với menu Chọn cấp độ .

Với tải ban đầu như một phần của quá trình khởi động ứng dụng, mọi điều hướng menu đi qua menu chính sẽ được xử lý bởi menu đầu tiên trong số này, trong khi bất kỳ lần truy cập lại nào vào menu Chọn cấp độ cũng sẽ gây ra sự làm mới. Lối vào ban đầu vào menu chọn cấp độ không quan trọng vì nó chỉ có thể được truy cập từ menu chính và do đó đã bị che.

Để bật tính năng này trong ứng dụng, hãy hoàn thành các phương pháp có liên quan trong menu chính và chọn cấp độ tệp. Thao tác này sẽ chặn hiển thị giao diện người dùng cho đến khi FetchAsyncActivateAsync hoàn tất:

  1. Mở Assets/Hamster/Scripts/States/MainMenu.cs và thay thế phương thức Resume hiện có bằng phương thức sau:
    public override void Resume(StateExitValue results) {
       CommonData.mainGame.SelectAndPlayMusic(CommonData.prefabs.menuMusic, true);
       CommonData.mainGame.FetchRemoteConfig(InitializeUI);
    }
    
  2. Lưu các tập tin.
  3. Mở Assets/Hamster/Scripts/States/BaseLevelSelect.cs , thay thế phương thức Resume hiện có bằng phương thức sau:
    public override void Resume(StateExitValue results) {
       CommonData.mainGame.FetchRemoteConfig(ShowUI);
    }
    
  4. Lưu các tập tin.

7. Gỡ lỗi/xác thực hành vi tìm nạp

Tại thời điểm này, việc kiểm tra chẩn đoán/xác nhận sẽ có ích. Quy trình sau đây sẽ cho phép bạn kiểm tra ứng dụng của mình theo cách thủ công cũng như cách/liệu ứng dụng có tìm nạp và kích hoạt các giá trị Cấu hình từ xa hay không.

Thông tin sẽ được in như một phần của nhật ký mô phỏng, thiết bị hoặc trình chỉnh sửa của bạn. Đối với iOS, bạn có thể xem nhật ký thiết bị và trình mô phỏng trong Xcode. Đối với Android, xem nhật ký bằng cách chạy adb logcat . Nếu bạn chạy mã trong Unity bằng cách nhấn Phát trong trình chỉnh sửa, nhật ký sẽ xuất hiện trong tab Bảng điều khiển.

  1. Xây dựng lại và chạy ứng dụng (trong Trình chỉnh sửa, sử dụng thiết bị hoặc trình mô phỏng).
  2. Sau khi Menu chính của trò chơi xuất hiện, hãy xem lại đầu ra nhật ký trò chơi của bạn, đầu ra này sẽ chứa nhật ký được tạo bởi Debug.Log trong FetchRemoteConfigActivateRetrievedRemoteConfigValues ​​. Chúng sẽ hiển thị thông báo "Đang tìm nạp dữ liệu..." và "Đã tải và sẵn sàng dữ liệu từ xa". Lưu ý dấu thời gian ở đầu những tin nhắn này.
  3. Vào game nhấn License .
  4. Nhấn Được rồi .
  5. Đợi Menu chính của trò chơi xuất hiện.
  6. Xem lại đầu ra nhật ký của trò chơi của bạn, tương tự như đầu ra ở bước trước, với dấu thời gian mới (khớp với thời gian được đặt trên đồng hồ hệ thống nơi bạn đang chạy trò chơi).
  7. Vào game nhấn Play .
  8. Nhấn Hãy lăn .
  9. Điều hướng quả bóng đến mục tiêu bằng cách sử dụng các mũi tên trên bàn phím, thao tác này sẽ mở ra menu Hoàn thành Cấp độ.
  10. Nhấn các cấp độ .
  11. Đợi menu Chọn cấp độ tải.
  12. Xem lại đầu ra nhật ký trò chơi của bạn một lần nữa. Nó phải khớp với thông điệp tường trình từ các bước trước đó, với dấu thời gian mới hơn (khớp với thời gian được đặt trên đồng hồ hệ thống nơi bạn đang chạy trò chơi).

Nếu bất kỳ nội dung nào trong số đó không xuất hiện trong ứng dụng của bạn thì một phần của quy trình tìm nạp và kích hoạt (hoặc thiết bị của bạn) có thể bị định cấu hình sai. Nếu nhật ký đầu tiên không xuất hiện, có khả năng trò chơi của bạn sẽ không khởi động được. Xem lại Bảng điều khiển soạn thảo hoặc nhật ký thiết bị/trình mô phỏng để biết các cảnh báo và lỗi về dự án/môi trường của bạn và điều tra chúng–sự cố có thể chỉ đơn giản như việc kết nối với Internet.

Nếu nhật ký ban đầu khi tải menu xuất hiện nhưng một trong các nhật ký tiếp theo thì không, hãy điều tra/triển khai lại các phương thức Resume trong Assets/Hamster/Scripts/States/MainMenu.csAssets/Hamster/Scripts/States/BaseLevelSelect.cs .

8. Thiết lập mã của bạn

Bây giờ bạn đã định cấu hình các giá trị thông số trong ứng dụng trong SetDefaultsAsync() và cung cấp các phiên bản cập nhật nhất với FetchAsync()ActivateAsync() , bạn sẽ tham chiếu và sử dụng các giá trị đó trong mã.

Sau khi bạn đặt các giá trị trong phần phụ trợ Cấu hình từ xa, hãy tìm nạp chúng và kích hoạt chúng ( hoặc thực hiện cả hai cùng một lúc ), những giá trị đó sẽ có sẵn cho ứng dụng của bạn. Để sử dụng các giá trị này, hãy gọi GetValue(string key ) và chọn khóa tham số làm đối số. Điều này trả về một ConfigValue , có các thuộc tính để truy cập giá trị dưới dạng các loại được hỗ trợ khác nhau: string , bool , long , double . Trong dự án này và hầu hết các trường hợp sử dụng trò chơi, bạn phải chuyển hai loại cuối cùng sang thành ngữ intfloat . Để đảm bảo những chuyển đổi này không gây ra sự cố, hãy đảm bảo các giá trị ban đầu được đặt trong Cấu hình từ xa nằm trong phạm vi hợp lệ của các loại bạn sẽ sử dụng trong mã ứng dụng của mình.

  1. Nhập Cấu hình từ xa bằng cách thêm using Firebase.RemoteConfig; lên đầu các tập tin sau:
    • Assets/Hamster/Scripts/States/MainMenu.cs
    • Assets/Hamster/Scripts/MapObjects/AccelerationTile.cs
  2. Thay thế phương thức Start của AccelerationTile.cs :
    private void Start() {
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       Acceleration = (float)remoteConfig.GetValue(AccelerationTileForceKey).DoubleValue;
    }
    
    Với thay đổi này, lượng lực do ô tăng tốc truyền vào sẽ thay đổi thành lực nhận được từ Cấu hình từ xa.
  3. Chỉnh sửa phần nội dung của phương thức InitializeUI của MainMenu.cs :
    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();
    }
    
    Tại đây, subtitleOverride được đặt để thay đổi phụ đề trên màn hình menu chính nếu tất cả các trường của nó trong đám mây được đặt làm giá trị khác với giá trị mặc định của loại chúng.

9. Đặt giá trị tham số từ xa

Bây giờ ứng dụng của bạn đã được trang bị đầy đủ, bạn đã sẵn sàng định cấu hình các tham số và giá trị trên máy chủ Cấu hình từ xa. Trong lớp học lập trình này, chúng ta sẽ thiết lập điều này bằng bảng điều khiển Firebase.

  1. Trong bảng điều khiển Firebase , hãy mở dự án của bạn.
  2. Chọn Cấu hình từ xa từ menu để xem bảng thông tin Cấu hình từ xa.
  3. Đối với mỗi tham số bạn đã xác định trong ứng dụng của mình và được liệt kê trong bảng sau, hãy nhấp vào Thêm tham số , dán vào tên (khóa) tham số, chọn Loại dữ liệu được liệt kê trong bảng, tắt Sử dụng mặc định trong ứng dụng và dán vào giá trị mặc định mới:

    Tên tham số (khóa)

    Loại dữ liệu

    Giá trị mặc định

    gia tốc_tile_force

    Con số

    100

    phụ đề_override

    JSON

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

    Remote Config Parameter editor with\nacceleration_tile_force populated
  4. Nhấp vào Lưu để lưu các thay đổi của bạn.
  5. Nhấp vào Xuất bản để xuất bản cấu hình mới và cung cấp các giá trị mới cho trò chơi của bạn.
  6. Chạy lại ứng dụng của bạn sau khi đặt các tham số từ xa này và quan sát cách chúng ghi đè các giá trị mặc định ban đầu. Mechahamster main screen with Debug\nMenu enabled

10. Sử dụng các điều kiện Cấu hình từ xa để phân phát các biến thể

Bạn có thể muốn cung cấp trải nghiệm ứng dụng cho người dùng dựa trên ngôn ngữ họ nói, họ ở đâu, thời gian trong ngày hoặc nền tảng họ sử dụng. Các điều kiện Cấu hình từ xa cung cấp cho bạn khả năng sử dụng các thuộc tính này và các thuộc tính khác riêng lẻ hoặc kết hợp để cung cấp các giá trị khác nhau (được gọi là biến thể) cho người dùng.

Một cách sử dụng phổ biến của điều kiện là thay đổi nội dung giữa nền tảng iOS và Android. Hãy làm theo các bước bên dưới để triển khai điều kiện phục vụ một giá trị khác cho subtitle_override tùy thuộc vào nền tảng nào đang được sử dụng.

  1. Mở tab Cấu hình từ xa của dự án của bạn trong bảng điều khiển Firebase .
  2. Nhấp vào nút chỉnh sửa cho subtitle_override.
  3. Ở góc dưới cùng bên trái, nhấp vào Thêm mới .
  4. Trong trình đơn thả xuống xuất hiện, hãy di chuột qua Giá trị có điều kiện và nhấp vào Tạo điều kiện mới. Remote Config parameter editor:\nConditional value option
  5. Khi được nhắc, hãy đặt tên cho điều kiện là "is iOS" nếu bạn đang nhắm mục tiêu iOS hoặc "is Android" nếu bạn đang nhắm mục tiêu Android. Nếu bạn đang nhắm mục tiêu cả hai, bạn chỉ cần chọn một mục ở đây và sử dụng nó cho phần còn lại của lớp học lập trình. Using the Define a new condition\ndialog to define an iOS-specific condition
  6. Trong Áp dụng nếu... , nhấp vào menu thả xuống Chọn... và chọn Nền tảng . Sau đó, chọn nền tảng thích hợp. Using the Define a new condition\neditor to select the iOS platform
  7. Bấm vào Tạo điều kiện để tạo điều kiện. Hộp thoại Chỉnh sửa tham số xuất hiện lại và bây giờ bạn có thể đặt giá trị:
    • Nếu bạn đang nhắm mục tiêu Android, hãy đặt Giá trị thành:
      {"text":"Level Up Android Version","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
      
    • Nếu bạn đang nhắm mục tiêu iOS, hãy đặt Giá trị thành:
      {"text":"Level Up iOS Version","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
      
  8. Nhấp vào Lưu để lưu các thay đổi của bạn.
  9. Nhấp vào Xuất bản để xuất bản cấu hình mới và cung cấp các giá trị mới cho trò chơi của bạn.

Nếu bạn xây dựng và chạy lại trò chơi, bạn sẽ thấy phụ đề của trò chơi được thay thế bằng biến thể dành riêng cho nền tảng của nó.

11. Cấu hình Remote Config để nhận cập nhật theo thời gian thực

Cấu hình từ xa hiện có thể lắng nghe và xử lý các bản cập nhật cho các mẫu Cấu hình từ xa trong thời gian thực . Các ứng dụng có thể đăng ký API cấu hình từ xa theo thời gian thực mới để theo dõi các thay đổi về cấu hình và giá trị cập nhật.

Làm thế nào nó hoạt động

Để lắng nghe các bản cập nhật, ứng dụng của bạn phải triển khai một phương thức đăng ký sự kiện OnConfigUpdateListener . Trong khi một hoặc nhiều trình nghe cập nhật cấu hình được đăng ký, các mẫu Cấu hình từ xa mới sẽ tự động được tìm nạp, các trình xử lý đã đăng ký sẽ được gọi và có thể được sử dụng để thực hiện logic phản hồi, chẳng hạn như kích hoạt các giá trị mới và cung cấp chúng cho phần còn lại của ứng dụng.

Triển khai Cấu hình từ xa theo thời gian thực

Để minh họa cách hoạt động của tính năng này trong trò chơi, hãy thực hiện những thay đổi sau đối với mã của bạn.

Tạo trình xử lý cập nhật cấu hình

Bước đầu tiên để sử dụng sự kiện Cập nhật cấu hình là tạo một phương thức có khả năng lắng nghe sự kiện đó. Đặt phương thức sau vào 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.");
         });
   }

Phương pháp này sẽ in danh sách các khóa được cập nhật và thông báo thành công vào nhật ký khi nó kích hoạt các giá trị mới.

Đăng ký sự kiện Cập nhật

Để kích hoạt ActivateValuesOnConfigUpdate khi sự kiện được gọi, hãy đăng ký sự kiện đó. Thay thế phương thức InitializeCommonDataAndStartGame() trong Assets/Hamster/Scripts/MainGame.cs bằng phương thức sau:

   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());
   }

Dòng mới (kết thúc bằng += ActivateValuesOnConfigUpdate; ) đăng ký trình xử lý sự kiện cho sự kiện.

Hủy đăng ký khi đối tượng sở hữu của trình xử lý bị hủy

Để ngăn chặn lỗi tham chiếu null, các đối tượng có phương thức được đăng ký sự kiện phải hủy đăng ký phương thức đó khi chúng bị hủy. Thêm phương thức sau vào Assets/Hamster/Scripts/MainGame.cs :

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

Kiểm tra chức năng mới

Để xác thực chức năng mới, hãy dùng thử ứng dụng đã tạo của bạn. Quy trình sau đây yêu cầu bạn có thể đọc nhật ký và gỡ lỗi bằng thiết bị thực .

Thay đổi acceleration_tile_force và quan sát

Sau khi khởi động ứng dụng của bạn, trong phần Cấu hình từ xa của bảng điều khiển Firebase:

  1. Nhấn nút chỉnh sửa bên cạnh acceleration_tile_force .

dc602d4db54e50a4.png

  1. Thay đổi giá trị thành “120” và nhấn Save .

fcbc1df848f88009.png

  1. Nhấp vào nút Xuất bản Thay đổi .

3785c1e00e7a6359.png

  1. Kiểm tra nhật ký.
  2. Nếu bạn thấy thông báo tường trình bắt đầu bằng "Đã xảy ra lỗi khi nghe", hãy đọc phần còn lại và thử gỡ lỗi bằng thông báo lỗi mà nó in ra.
  3. Nếu bạn thấy nhật ký bắt đầu bằng "Khóa đã cập nhật" thì ứng dụng của bạn đã nhận được các giá trị đã thay đổi.
  4. Nếu bạn không thấy những thứ này, hãy xem qua phần còn lại của nhật ký rồi xem lại hướng dẫn từ Tạo trình xử lý cập nhật cấu hình , kiểm tra lại và kiểm tra lại nhật ký để xác định xem có điều gì không ổn không.

12. Xin chúc mừng!

Bạn đã sử dụng Cấu hình từ xa để kiểm soát từ xa các giá trị trong trò chơi bằng cách tìm nạp chúng trong ứng dụng của mình và sử dụng các điều kiện để phân phát các biến thể khác nhau!

Những gì chúng tôi đã đề cập

  • Cách đặt và truy xuất giá trị Cấu hình từ xa
  • Cách sử dụng mã Unity C# của bạn để sử dụng các giá trị được truy xuất
  • Cách lưu trữ, ghi đè và ghi đè các giá trị/đối tượng kết hợp dưới dạng giá trị JSON
  • Cách sử dụng các điều kiện Cấu hình từ xa để phục vụ các biến thể giá trị khác nhau

Bước tiếp theo

Đọc về mức độ ưu tiên của giá trị tham số để hiểu rõ hơn logic về những giá trị nào được một phiên bản ứng dụng thu được khi nó sử dụng một tham số có nhiều giá trị (do điều kiện hoặc vị trí).