Đo lường cho trò chơi Unity bằng 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ặp khoá-giá trị (còn 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à hoạt động 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: Nâng cấp cùng phiên bản Firebase. Trò chơi mẫu này là phiên bản mới của trò chơi MechaHamster cổ điển trên Firebase. Trò chơi này sẽ loại bỏ hầu hết chức năng Firebase tích hợp sẵn, cho bạn cơ hội triển khai những cách sử dụng Firebase mới 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à các giá trị này có thể được ghi đè bằng các giá trị bạn đã đặt trong Cấu hình từ xa trong bảng điều khiển của Firebase.

Kiến thức bạn sẽ học được

  • Cách đặt giá trị Cấu hình từ xa trên đám mây và truy xuất các giá trị đó
  • Cách đo lường mã Unity C# để tự động sử dụng các giá trị được truy xuất
  • Cách lưu trữ, đo lường và ghi đè các giá trị/đối tượng phức 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ân phát các biến thể giá trị khác nhau cho những nhóm người dùng khác nhau

Bạn cần có

  • Unity 2019.1.0f1 trở lên có hỗ trợ bản dựng dành cho iOS và/hoặc Android
  • Một thiết bị Android/iOS thực hoặc một trình mô phỏng/trình mô phỏng để tạo và chạy trò chơi

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

Các phần sau mô tả cách tải mã Nâng cấp với Firebase xuống, mở mã đó trong Unity và thêm dự án Firebase. Trò chơi mẫu Nâng cấp bằng Firebase này được một số lớp học lập trình khác của Firebase + Unity 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ếp tục thêm Firebase SDK cho Unity để thêm Cấu hình từ xa vào mã trò chơi mẫu.

Tải đoạn mã

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 chưa cài đặt git, bạn có thể tải kho lưu trữ xuống dưới dạng tệp ZIP.

Mở trang Nâng cấp cùng Firebase trong trình chỉnh sửa Unity

  1. Khởi chạy Unity Hub và từ thẻ Projects (Dự án), hãy nhấp vào mũi tên thả xuống bên cạnh mục Open (Mở).
  2. Nhấp vào Thêm dự án từ ổ đĩa.
  3. Chuyển đến thư mục chứa mã, sau đó nhấp vào OK.
  4. Nếu được nhắc, hãy chọn một phiên bản trình chỉnh sửa Unity để sử dụng và nền tảng đích của bạn (Android hoặc iOS).
  5. Nhấp vào tên dự án level-up-with-firebase và dự án sẽ mở trong trình chỉnh sửa Unity.
  6. Nếu trình chỉnh sửa không tự động mở tệp, hãy mở MainGameScene trong phần Nội dung > Hamster trong thẻ Project (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 bài viết Làm việc trong Unity.

3. Thêm Firebase vào dự án Unity

Tạo một dự án Firebase

  1. Trong bảng điều khiển của Firebase, hãy 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 mà bạn muốn.
    Thao tác này cũng sẽ thiết lập mã dự án (hiển thị bên dưới tên dự án) thành một giá trị nào đó dựa trên tên dự án. Bạn có thể nhấp vào biểu tượng chỉnh sửa trên mã dự án để tuỳ chỉnh thêm (không bắt buộc).
  3. Nếu được nhắc, hãy xem xét 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 mục 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. Sau khi tạo dự án, 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 của Firebase ở giữa trang tổng quan về dự án, nhấp vào biểu tượng Unity để chạy quy trình thiết lập hoặc nếu bạn đã thêm một ứng dụng vào dự án Firebase, hãy nhấp vào Thêm ứng dụng để hiển thị các lựa chọn về nền tảng.
  2. Chọn đăng ký cả mục tiêu bản dựng của Apple (iOS) và Android.
  3. Nhập(các) mã nhận dạng dành riêng cho nền tảng của dự án Unity. Đối với lớp học lập trình này, hãy nhập nội dung sau:
    • Đối với Apple (iOS) – Nhập com.google.firebase.level-up vào trường Mã gói iOS.
    • Đối với Android – Nhập com.google.firebase.level_up vào trường Android package name (Tên gói Android).
  4. Nhập (các) biệt hiệu dành riêng cho nền tảng của dự án Unity (không bắt buộc).
  5. Nhấp vào Đăng ký ứng dụng và tiếp tục đến phần Tải tệp cấu hình xuống.
  6. Lặp lại quy trình này cho bất kỳ mục tiêu bản dựng nào mà bạn chưa 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 hai tệp cấu hình xuống (một tệp cấu hình cho mỗi mục tiêu bản 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 GoogleService-Info.plist xuống.
    • Đối với Android: Tải tệp google-services.json xuống.
  2. Mở cửa sổ Project (Dự án) của dự án Unity, sau đó di chuyển cả hai tệp cấu hình vào thư mục Assets (Tài sản).
  3. Quay lại bảng điều khiển của Firebase, trong quy trình thiết lập, hãy nhấp vào Tiếp theo rồi chuyển sang Thêm SDK Firebase cho Unity.

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

Thêm Firebase SDK cho Unity

  1. Nhấp vào Tải Firebase Unity SDK xuống trong bảng điều khiển của Firebase.
  2. Giải nén SDK ở nơi thuận tiện.
  3. Trong Dự án Unity đang mở, hãy chuyển đến Assets (Tài sản) > Nhập gói > Gói tuỳ chỉnh.
  4. Trong hộp thoại Import package (Nhập gói), hãy chuyển đến thư mục chứa SDK đã giải nén, chọn FirebaseAnalytics.unitypackage rồi nhấp vào Open (Mở).
  5. Khi hộp thoại Import Unity Package (Nhập gói Unity) xuất hiện, hãy nhấp vào Import (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 công cụ báo cáo sự cố gọn 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. Nếu bạn chưa từng sử dụng công cụ này, 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 của Firebase, rồi nhấp vào Tiếp theo trong quy trình thiết lập.

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

4. Đặt giá trị mặc định cho 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 chuyển đổi tuần tự trong trình chỉnh sửa Unity để sử dụng các giá trị được đo lường bằng Cấu hình từ xa. Bạn sẽ định cấu hình các giá trị mặc định cho mỗi tham số bằng cách sử dụng SetDefaultsAsync để ứng dụng của bạn hoạt động như dự kiến 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 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 các giá trị đó để có thể sử dụng các giá trị đó trong mã.

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

  1. Thêm các 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ố phần mở rộng cho API C# Tasks, giúp việc quản lý quy trình khởi chạy bằng các lệnh gọi lại trở nên đơn giản hơn.
  2. Thêm hoạt động khởi chạy Firebase vào phương thức MainGame.cs Start() bằng cách thay thế phương thức InitializeCommonDataAndStartGame() hiện tại 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, hãy tìm InitializeFirebaseAndStartGame(). Khai báo biến ứng dụng và ghi đè phương thức triển khai 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 chạy Firebase sẽ gọi SetRemoteConfigDefaults khi thành công để đặt giá trị mặc định trong ứng dụng. Thay thế phương thức SetRemoteConfigDefaults chưa triển khai bằng như 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 tất phương thức FetchRemoteConfig hiện có. Thao tác này sẽ liên kết các lệnh gọi đến phương thức FetchAsync của Cấu hình từ xa (phương thức này tìm nạp các giá trị mới từ Cấu hình từ xa) và ActivateAsync (kích hoạt các giá trị thu được để đưa vào 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 ta đã 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 trình tự. Bạn có thể truyền các lệnh gọi lại thay thế đến FetchRemoteConfig để gọi hoạt động tìm nạp với nhiều kết quả. Một ví dụ (mà bạn sẽ triển khai sau) đang chuyển vào một phương thức để mở trình đơn 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ẽ làm cho các trình đơn chỉ mở sau khi các giá trị đó đã được tìm nạp và kích hoạt.

  1. Dán mã dưới đây 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 tất phương thức ActivateRetrievedRemoteConfigValues. Phương thức này sẽ nhận lệnh gọi lại được truyền vào, onFetchAndActivateSuccessful. Khi kích hoạt xong, lệnh gọi lại đã 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 chạy, ActivateRetrievedRemoteConfigValues sẽ gọi điểm bắt đầu trước đó (InitializeCommonDataAndStartGame) để bắt đầu trò chơi bằng cách mở trình đơn 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 thời điểm 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 thời điểm 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 việc các giá trị đó thay đổi trong quá trình sử dụng.

Như hiện đã triển khai, 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. Các lượt tìm nạp có thể bị ẩn trong quá trình thay đổi trình đơn, đồng thời chặn hoạt động tương tác trong quá trình chuyển đổi. Ngoài ra, đây thường là thời điểm thích hợp nhất để nhận giá trị mới, vì thay đổi trong trạng thái trình đơn có thể thường được dùng để biết "ở đâu" người chơi sẽ di chuyển và dự đoán rằng một giá trị sẽ được sử dụng.

Khi xem qua hệ thống trình đơn của Mechahamster, cách dễ nhất để thêm tính năng làm mới trình đơn chặn giao diện người dùng là gọi trình đơn này trước khi trình đơn chính tiếp tục (cụ thể là khi bạn truy cập trình đơn này bằng cách sao lưu từ một trình đơn khác) và truyề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. Bạn cũng có thể thực hiện tương tự với trình đơn Chọn cấp độ.

Với lần tải ban đầu là một phần trong quá trình khởi động ứng dụng, mọi thao tác trên trình đơn đi qua trình đơn chính đều sẽ do người đầu tiên xử lý, còn mọi thao tác truy cập lại trình đơn Chọn cấp độ cũng sẽ dẫn đến quá trình làm mới. Lối vào ban đầu vào trình đơn chọn cấp không quan trọng vì chỉ có thể truy cập từ trình đơn chính nên đã được đề cập.

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

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

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

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

Thông tin sẽ được in dưới dạng một phần của nhật ký trình 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 Play trong trình chỉnh sửa, thì nhật ký sẽ xuất hiện trong thẻ Console.

  1. Tạo 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 Trình đơn chính của trò chơi xuất hiện, hãy xem lại đầu ra nhật ký của trò chơi. Đầu ra này sẽ chứa nhật ký do Debug.Log tạo trong FetchRemoteConfigActivateRetrievedRemoteConfigValues. Các lệnh này sẽ hiển thị thông báo "Đang tìm nạp dữ liệu..." và "Dữ liệu từ xa đã được tải và sẵn sàng" tin nhắn. Ghi lại dấu thời gian ở đầu các thông báo này.
  3. Trong trò chơi, hãy nhấn vào License (Giấy phép).
  4. Nhấn vào Ok.
  5. Chờ Trình đơn chính của trò chơi xuất hiện.
  6. Xem lại kết quả nhật ký của trò chơi (tương tự như kết quả ở bước trước) với dấu thời gian mới (trùng 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. Trong trò chơi, hãy nhấn vào nút Chơi.
  8. Nhấn vào Cùng cuộn.
  9. Di chuyển bóng đến mục tiêu bằng cách sử dụng mũi tên trên bàn phím. Thao tác này sẽ mở trình đơn Cấp độ hoàn tất.
  10. Nhấn vào Cấp độ.
  11. Đợi trình đơn Chọn cấp độ tải xong.
  12. Xem lại kết quả nhật ký của trò chơi. Phiên bản này phải khớp với thông điệp nhật ký ở các bước trước, với dấu thời gian mới hơn (trùng khớp với thời gian đã đặt trên đồng hồ hệ thống nơi bạn đang chạy trò chơi).

Nếu bất kỳ công cụ nào không xuất hiện trong ứng dụng của bạn, thì một số 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, trò chơi có thể sẽ không khởi động được. Xem lại bảng điều khiển của Editor 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 rồi điều tra vấn đề này – vấn đề có thể đơn giản như việc kết nối Internet.

Nếu nhật ký ban đầu trong lúc tải trình đơn xuất hiện, nhưng một trong các nhật ký tiếp theo không xuất hiện, 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. Đo lường mã

Sau khi định cấu hình các giá trị tham số trong ứng dụng trong SetDefaultsAsync() cũng như cung cấp các phiên bản mới nhất cùng với FetchAsync()ActivateAsync(), bạn sẽ tham khảo và sử dụng các giá trị đó trong mã.

Sau khi đặt các giá trị trong phần phụ trợ Cấu hình từ xa, tìm nạp và kích hoạt các giá trị đó (hoặc thực hiện cả hai cùng một lúc), các giá trị đó sẽ được cung cấp 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 một khoá tham số làm đối số. Thao tác này sẽ trả về một ConfigValue, trong đó có các thuộc tính để truy cập vào giá trị dưới dạng nhiều loại được hỗ trợ: 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 truyền 2 loại cuối thành intfloat phù hợp hơn. Để đảm bảo những lượt chuyển đổi này không gây ra vấn đề, 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 chuyển đổi mà 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; vào đầu các tệp 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, mức 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();
    }
    
    Ở đây, subtitleOverride được thiết lập để thay đổi tiêu đề phụ trên màn hình trình đơn chính nếu tất cả các trường trên đám mây không được đặt thành giá trị mặc định của loại.

9. Đặt giá trị thông số từ xa

Bây giờ, ứng dụng của bạn đã được đo lường đầy đủ, bạn đã sẵn sàng định cấu hình các thông 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 của Firebase.

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

    Tên thông số (khoá)

    Loại dữ liệu

    Giá trị mặc định

    tăng tốc_tile_force

    Số điện thoại

    100

    ghi đè phụ đề

    JSON

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

    Trình chỉnh sửa thông số Cấu hình từ xa với\nacceleration_tile_force được điền sẵn
  4. Nhấp vào Lưu để lưu các thay đổi.
  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 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.Màn hình chính của Mechahamster với Debug\nTrình đơn được bật

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

Bạn nên phục vụ trải nghiệm ứng dụng cho người dùng dựa trên ngôn ngữ họ nói, nơi họ ở, thời gian trong ngày hoặc nền tảng họ sử dụng. Điều kiện Cấu hình từ xa cho phép bạn sử dụng các thuộc tính này và các thuộc tính khác một cách riêng lẻ hoặc kết hợp để phân phát 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 cho các điều kiện là thay đổi nội dung giữa các nền tảng iOS và Android. Hãy làm theo các bước bên dưới để triển khai một điều kiện phân phát một giá trị khác cho subtitle_override tuỳ thuộc vào nền tảng đang sử dụng.

  1. Mở thẻ Cấu hình từ xa của dự án trong bảng điều khiển của 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, hãy nhấp vào Thêm mới.
  4. Trong trình đơn thả xuống, hãy di chuột lên mục Giá trị có điều kiện rồi nhấp vào Tạo điều kiện mới.Trình chỉnh sửa thông số Cấu hình từ xa:\nLựa chọn giá trị có điều kiện
  5. Khi được nhắc, hãy đặt tên cho điều kiện là "là iOS" nếu bạn đang nhắm mục tiêu iOS hoặc "là Android" nếu bạn đang nhắm đến Android. Nếu đang nhắm đến cả hai, bạn chỉ cần chọn một phương án tại đây và sử dụng phương thức đó trong phần còn lại của lớp học lập trình.Sử dụng hộp thoại Xác định điều kiện mới\nđể xác định một điều kiện cụ thể cho iOS
  6. Trong mục Áp dụng nếu..., hãy nhấp vào trình đơn thả xuống Chọn... rồi chọn Nền tảng. Sau đó, chọn nền tảng thích hợp.Sử dụng trình chỉnh sửa Xác định điều kiện mới\nđể chọn nền tảng iOS
  7. Nhấp vào Tạo điều kiện để tạo điều kiện. Hộp thoại Chỉnh sửa thông số xuất hiện lại và giờ đây bạn có thể đặt giá trị:
    • Nếu bạn đang nhắm đến 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 đến 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.
  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 tạo bản 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 trò chơi đó.

11. Định cấu hình Cấu hình từ xa để nhận thông tin cập nhật theo thời gian thực

Cấu hình từ xa hiện có thể theo dõi và xử lý các bản cập nhật cho mẫu Cấu hình từ xa theo 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à các giá trị được cập nhật.

Cách hoạt động

Để theo dõi thông tin 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. Mặc dù 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ẽ được tự động tìm nạp, các trình xử lý đã đăng ký được gọi và có thể được 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 các giá trị đó 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 hoạ 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 theo dõi 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 thức này sẽ in danh sách các khoá đã cập nhật và một thông báo thành công tới nhật ký khi kích hoạt các giá trị mới.

Đăng ký nhận thông tin về sự kiện Cập nhật

Để kích hoạt ActivateValuesOnConfigUpdate khi sự kiện được gọi, hãy đăng ký tham gia sự kiện. Thay thế phương thức InitializeCommonDataAndStartGame() trong Assets/Hamster/Scripts/MainGame.cs bằng đoạn mã 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 vào sự kiện.

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

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

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

Kiểm thử chức năng mới

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

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 vào nút chỉnh sửa bên cạnh acceleration_tile_force.

dc602d4db54e50a4.pngS

  1. Thay đổi giá trị thành "120" rồi nhấn vào Save (Lưu).

fcbc1df848f88009.pngS

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

3785c1e00e7a6359.pngS

  1. Kiểm tra nhật ký.
  2. Nếu bạn thấy một thông báo nhật ký bắt đầu bằng "Đã xảy ra lỗi khi nghe", hãy đọc phần còn lại rồi thử gỡ lỗi bằng thông báo lỗi mà công cụ này in ra.
  3. Nếu bạn thấy một nhật ký bắt đầu bằng thông báo "Khoá đã cập nhật", ứ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 thông tin nào nêu trên, 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ó gì thiếu 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 các giá trị đó trong ứng dụng và sử dụng các điều kiện để phân phát nhiều biến thể!

Nội dung đã đề cập

  • Cách đặt và truy xuất giá trị Cấu hình từ xa
  • Cách đo lường mã Unity C# để sử dụng các giá trị được truy xuất
  • Cách lưu trữ, đo lường và ghi đè các giá trị/đối tượng phức 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ân phát nhiều biến thể giá trị

Các bước tiếp theo

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