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 khoá-giá trị (còn gọi là tham số) trong ứng dụng và cập nhật các 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 có tên là MechaHamster: Level Up with Firebase Edition. Trò chơi mẫu này là phiên bản mới của trò chơi cổ điển MechaHamster trên Firebase. Phiên bản này đã xoá hầu hết chức năng Firebase tích hợp, giúp bạn có cơ hội triển khai các cách sử dụng mới của Firebase thay cho các chức năng đó.
Để đảm bảo ứng dụng 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. Các giá trị này có thể bị ghi đè bằng các giá trị bạn đặt trong Remote Config trên 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 hỗ trợ mã Unity C# để tự động sử dụng các giá trị đã truy xuất
- Cách lưu trữ, đo lường 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ân phát các biến thể giá trị khác nhau cho các 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 iOS và/hoặc Android
- Một thiết bị Android/iOS thực hoặc một 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 đây mô tả cách tải mã Level Up with Firebase xuống, mở mã này trong Unity và thêm một dự án Firebase. Trò chơi mẫu Level Up with Firebase này được dùng trong một số lớp học lập trình khác về Firebase + Unity, vì vậy, có thể bạn đã hoàn thành các nhiệm vụ trong phần này. Nếu có, bạn có thể bỏ qua các bước này và chuyển sang phần 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 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ở Level Up with Firebase (Nâng cấp bằng Firebase) trong trình chỉnh sửa Unity
- Khởi chạy Unity Hub, rồi trên thẻ Dự án, hãy nhấp vào mũi tên thả xuống bên cạnh Mở.
- Nhấp vào Thêm dự án từ ổ đĩa.
- Chuyển đến thư mục chứa mã rồi nhấp vào OK.
- 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 (Android hoặc iOS).
- Nhấp vào tên dự án level-up-with-firebase, dự án sẽ mở trong trình chỉnh sửa Unity.
- Nếu trình chỉnh sửa của bạn không tự động mở tệp này, hãy mở
MainGameScene
trong Assets > Hamster trong thẻ Project 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
- Đăng nhập vào bảng điều khiển của Firebase bằng Tài khoản Google của bạn.
- Nhấp vào nút này để tạo một dự án mới, rồi nhập tên dự án (ví dụ:
LevelUpWithFirebase
).
- Nhấp vào Tiếp tục.
- Nếu được nhắc, hãy xem xét và chấp nhận các điều khoản của Firebase, rồi nhấp vào Tiếp tục.
- (Không bắt buộc) Bật tính năng hỗ trợ của AI trong bảng điều khiển của Firebase (còn gọi là "Gemini trong Firebase").
- Đối với lớp học lập trình này, bạn cần Google Analytics để sử dụng các sản phẩm của Firebase một cách tối ưu, vì vậy, hãy bật nút bật/tắt cho lựa chọn Google Analytics. Làm theo hướng dẫn trên màn hình để thiết lập Google Analytics.
- Nhấp vào Tạo dự án, đợi dự án được cấp phép rồi nhấp vào Tiếp tục.
Đăng ký ứng dụng của bạn với Firebase
- Mở bảng điều khiển của Firebase rồi nhấp vào biểu tượng Unity ở giữa trang tổng quan của dự án để 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.
- Chọn đăng ký cả mục tiêu bản dựng Apple (iOS) và Android.
- 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ã nhận dạng gói iOS. - Đối với Android – Nhập
com.google.firebase.level_up
vào trường Tên gói Android.
- Đối với Apple (iOS) – Nhập
- Bạn có thể nhập(các) biệt hiệu dành riêng cho nền tảng của dự án Unity.
- Nhấp vào Đăng ký ứng dụng rồi chuyển đến phần Tải tệp cấu hình xuống.
- Lặp lại quy trình 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 2 tệp cấu hình xuống (mỗi mục tiêu bản dựng một tệp cấu hình). Dự án Unity của bạn cần có siêu dữ liệu Firebase trong các tệp này để kết nối với Firebase.
- Tải cả hai tệp cấu hình hiện có xuống:
- Đối với Apple (iOS): Tải GoogleService-Info.plist xuống.
- Đối với Android: Tải google-services.json xuống.
- 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).
- 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 rồi chuyển sang phần Thêm SDK Firebase cho Unity.
Lưu ý: Bạn luôn có thể tải lại các tệp này 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, rồi nhấp vào nút tải xuống cho tệp cấu hình mong muốn.
Thêm Firebase SDK cho Unity
- Nhấp vào Tải SDK Firebase cho Unity xuống trong bảng điều khiển của Firebase.
- Giải nén SDK ở nơi thuận tiện.
- Trong Dự án Unity đang mở, hãy chuyển đến Assets (Tài sản) > Import Package (Nhập gói) > Custom Package (Gói tuỳ chỉnh).
- Trong hộp thoại Import package (Nhập gói), hãy chuyển đến thư mục chứa SDK chưa giải nén, chọn
FirebaseAnalytics.unitypackage
rồi nhấp vào Open (Mở). - Trong 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).
- Lặp lại các bước trước đó để nhập 2 gói sau:
FirebaseRemoteConfig.unitypackage
FirebaseCrashlytics.unitypackage
Crashlytics là một trình báo cáo sự cố theo thời gian thực và gọn nhẹ, giúp bạn theo dõi, sắp xếp mức độ ưu tiên và khắc phục các vấn đề về độ ổn định làm tổn hại đến chất lượng ứng dụng. Nếu trước đây bạn chưa từng sử dụng Crashlytics, hãy cân nhắc hoàn tất Lộ trình học tập về Crashlytics cho Unity.
- 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 SDK Firebase vào các dự án Unity, hãy xem phần Các lựa chọn cài đặt Unity khác.
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 từng thông số bằng cách sử dụng SetDefaultsAsync
để ứng dụng hoạt động như dự kiến trước khi kết nối với phần phụ trợ của Remote Config. Ứ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 các giá trị đó để có thể sử dụng trong mã.
Để tìm nạp các giá trị mới từ Cấu hình từ xa, bạn phải hoàn tất một số phương thức chưa triển khai đã có trong tệp Assets/Hamster/Scripts/MainGame.cs
.
- Thêm các câu lệnh
using
sau đây vàoMainGame.cs
: Mô-đunusing Firebase.Crashlytics; using Firebase.Extensions; using Firebase.RemoteConfig;
Firebase.Extensions
chứa một số tiện ích cho C# Tasks API (API Tác vụ C#) giúp đơn giản hoá việc quản lý quy trình khởi tạo bằng các lệnh gọi lại. - Thêm quá trình 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 có bằng phương thức chưa triển khaiInitializeFirebaseAndStartGame()
:void Start() { Screen.SetResolution(Screen.width / 2, Screen.height / 2, true); InitializeFirebaseAndStartGame(); }
- Trong
MainGame.cs
, hãy tìmInitializeFirebaseAndStartGame()
. Khai báo một biến ứng dụng và ghi đè quá trình 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"); } }); }
- Các lệnh gọi khởi chạy Firebase
SetRemoteConfigDefaults
khi 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 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 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 các phương thức FetchAsync
(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ị đã nhận được để cung cấp các giá trị đó trong mã) của Cấu hình từ xa bằng cách sử dụng một tham số lệnh gọi lại có tên là onFetchAndActivateSuccessful
.
Đoạn mã khởi động mà chúng ta đã thêm ở bước trước sẽ gọi FetchRemoteConfig
bằng InitializeCommonDataAndStartGame
làm lệnh gọi lại để bắt đầu trò chơi ở cuối chuỗi. Bạn có thể truyền các lệnh gọi lại thay thế đến FetchRemoteConfig
để gọi quá trình tìm nạp với các kết quả khác nhau. Ví dụ: (bạn sẽ triển khai sau) là truyền vào một phương thức mở trình đơn giao diện người dùng mới, tuỳ thuộc vào các giá trị Cấu hình từ xa. Điều này sẽ khiến các trình đơn chỉ mở ra sau khi những giá trị đó được tìm nạp và kích hoạt.
- 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); }); }
- Tiếp theo, hãy hoàn tất phương thức
ActivateRetrievedRemoteConfigValues
. Phương thức này sẽ nhận một lệnh gọi lại được truyền vào làonFetchAndActivateSuccessful
. Khi quá trình kích hoạt hoàn tất, lệnh 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ừ bối cảnh khởi tạo, 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 một 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 có bất kỳ đối tượng nào đã lưu các giá trị vào bộ nhớ đệm, thì các đối tượng đó phải được thông báo để thực hiện một bản cập nhật. Để phát triển một 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 các giá trị này thay đổi trong khi đang sử dụng.
Như đã triển khai hiện tại, các giá trị Cấu hình từ xa sẽ được tìm nạp và kích hoạt khi ứng dụng khởi động. Bạn có thể ẩn các thao tác tìm nạp 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 các giá trị mới, vì bạn có thể dùng thay đổi về trạng thái trình đơn để biết "vị trí" mà người chơi đang hướng đến và dự đoán rằng một giá trị sẽ được dùng.
Khi xem xét hệ thống trình đơn của Mechahamster, cách dễ nhất để thêm các lần làm mới trình đơn chặn giao diện người dùng là gọi hệ thống này trước khi trình đơn chính tiếp tục (cụ thể là khi người dùng truy cập vào trình đơn này bằng cách thoát khỏi một trình đơn khác) và truyền phương thức hiển thị giao diện người dùng làm lệnh gọi lại onFetchAndActivateSuccessful
. Bạn cũng có thể làm tương tự đối với trình đơn Level Select (Chọn cấp độ).
Với lần tải ban đầu trong quá trình khởi động ứng dụng, mọi thao tác điều hướng trên trình đơn thông qua trình đơn chính sẽ được xử lý bằng thao tác đầu tiên trong số này, trong khi mọi lần truy cập lại vào trình đơn Level Select (Chọn cấp độ) cũng sẽ khiến trang làm mới. Lần đầu tiên truy cập vào trình đơn chọn cấp độ không quan trọng vì bạn chỉ có thể truy cập vào trình đơn này từ trình đơn chính và do đó, lần truy cập này đã được tính.
Để 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 và các tệp chọn cấp độ. Các phương thức này sẽ chặn giao diện người dùng hiển thị cho đến khi FetchAsync
và ActivateAsync
hoàn tất:
- Mở
Assets/Hamster/Scripts/States/MainMenu.cs
rồi thay thế phương thứcResume
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); }
- Lưu tệp.
- Mở
Assets/Hamster/Scripts/States/BaseLevelSelect.cs
, thay thế phương thứcResume
hiện có bằng phương thức sau:public override void Resume(StateExitValue results) { CommonData.mainGame.FetchRemoteConfig(ShowUI); }
- 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 quy trình kiểm tra chẩn đoán/xác thực. Quy trình sau đây sẽ cho phép bạn kiểm thử ứng dụng theo cách thủ công và 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 này sẽ được in trong nhật ký của trình mô phỏng, thiết bị hoặc trình chỉnh sửa. Đố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, hãy 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 nút Play (Chạy) trong trình chỉnh sửa, thì nhật ký sẽ xuất hiện trong thẻ Console (Bảng điều khiển).
- Tạo lại và chạy ứng dụng (trong Trình chỉnh sửa, bằng cách sử dụng thiết bị hoặc trình mô phỏng).
- Sau khi Trình đơn chính của trò chơi xuất hiện, hãy xem xét đầu ra nhật ký của trò chơi. Đầu ra này phải chứa nhật ký do
Debug.Log
tạo trongFetchRemoteConfig
vàActivateRetrievedRemoteConfigValues
. Các thông báo này sẽ cho biết "Đ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 thông báo này. - Trong trò chơi, hãy nhấn vào Giấy phép.
- Nhấn OK.
- Đợi Trình đơn chính của trò chơi xuất hiện.
- Xem xét đầu ra nhật ký của trò chơi. Đầu ra này sẽ tương tự như đầu ra ở bước trước, có 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).
- Trong trò chơi, hãy nhấn vào Chơi.
- Nhấn vào Let's Roll (Cùng đổ xúc xắc).
- Di chuyển quả bóng đến mục tiêu bằng các phím mũi tên trên bàn phím. Thao tác này sẽ mở trình đơn Hoàn thành cấp độ.
- Nhấn vào Levels (Mức).
- Chờ trình đơn Chọn cấp độ tải xong.
- Xem lại đầu ra nhật ký của trò chơi. Nội dung này phải khớp với thông báo nhật ký từ các bước trước đó, có 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ỳ thông báo nào trong số đó không xuất hiện trong ứng dụng của bạn, thì có 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 định cấu hình sai. Nếu nhật ký đầu tiên không xuất hiện, thì có thể trò chơi của bạn sẽ không khởi động. Xem xét bảng điều khiển của Trình chỉnh sửa 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, đồng thời điều tra chúng – vấn đề có thể đơn giản như kết nối với Internet.
Nếu nhật ký ban đầu từ việc tải trình đơn xuất hiện, nhưng một trong những 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.cs
và Assets/Hamster/Scripts/States/BaseLevelSelect.cs
.
8. Đo lường mã của bạn
Giờ đây, khi bạn đã định cấu hình các giá trị tham số trong ứng dụng trong SetDefaultsAsync()
và cung cấp các phiên bản mới nhất bằng FetchAsync()
và ActivateAsync()
, bạn sẽ tham chiếu và sử dụng các giá trị đó trong mã.
Sau khi bạn đặt giá trị trong phần phụ trợ của Remote Config, hãy tìm nạp và kích hoạt các giá trị đó (hoặc thực hiện cả hai thao tác cùng một lúc), các 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 một khoá tham số làm đối số. Thao tác này trả về một ConfigValue
, 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 cùng đến int
và float
mang tính thành ngữ 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 rằng 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 mà bạn sẽ sử dụng trong mã ứng dụng.
- 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
- Thay thế phương thức
Start
củaAccelerationTile.cs
: Với thay đổi này, lượng lực do ô gia tốc truyền sẽ được thay đổi thành lượng lực nhận được từ Cấu hình từ xa.private void Start() { var remoteConfig = FirebaseRemoteConfig.DefaultInstance; Acceleration = (float)remoteConfig.GetValue(AccelerationTileForceKey).DoubleValue; }
- Chỉnh sửa nội dung của phương thức
InitializeUI
trongMainMenu.cs
: Ở đây,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
được đặt để thay đổi phụ đề trên màn hình trình đơn chính nếu tất cả các trường của phụ đề đó trên đám mây được đặt thành các giá trị khác với giá trị mặc định của loại.
9. Đặt giá trị tham số từ xa
Giờ đây, ứ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 tính năng này bằng bảng điều khiển của Firebase.
- Trong bảng điều khiển của Firebase, hãy mở dự án của bạn.
- Chọn Cấu hình từ xa trong trình đơn để xem trang tổng quan Cấu hình từ xa.
- Đối với từng thông số mà bạn đã xác định trong ứng dụng và được liệt kê trong bảng sau, hãy nhấp vào Thêm thông số, dán tên thông số (khoá), chọn Kiểu dữ liệu được liệt kê trong bảng, tắt Sử dụng giá trị mặc định trong ứng dụng và dán giá trị mặc định mới:
Tên tham số (khoá)
Loại dữ liệu
Giá trị mặc định
acceleration_tile_force
Số điện thoại
100
subtitle_override
JSON
{"text":"We overwrote the subtitle","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
- Nhấp vào Lưu để lưu các thay đổi.
- 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.
- Chạy lại ứng dụng sau khi thiết lập các thông số từ xa này và quan sát cách chúng ghi đè các giá trị mặc định ban đầu.
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 điều chỉnh trải nghiệm trong ứng dụng cho phù hợp với người dùng dựa trên ngôn ngữ họ nói, vị trí của 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 riêng lẻ hoặc kết hợp các thuộc tính này và những thuộc tính khác để phân phát các giá trị khác nhau (gọi là biến thể) cho người dùng.
Một trường hợp sử dụng phổ biến cho đ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 giá trị khác cho subtitle_override
, tuỳ thuộc vào nền tảng đang được sử dụng.
- Mở thẻ Cấu hình từ xa của dự án trong bảng điều khiển của Firebase.
- Nhấp vào nút chỉnh sửa cho
subtitle_override.
- Ở góc dưới cùng bên trái, hãy nhấp vào Thêm mới.
- Trong trình đơn thả xuống xuất hiện, hãy di chuột lên Giá trị có điều kiện rồi nhấp vào Tạo điều kiện mới.
- Khi được nhắc, hãy đặt tên cho điều kiện là "is iOS" nếu bạn đang nhắm đến iOS hoặc "is Android" nếu bạn đang nhắm đến Android. Nếu bạn đang nhắm đến cả hai, chỉ cần chọn một trong hai tại đây và sử dụng cho phần còn lại của lớp học lập trình.
- 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 đó, hãy chọn nền tảng phù hợp.
- Nhấp vào Tạo điều kiện để tạo điều kiện. Hộp thoại Chỉnh sửa tham số sẽ xuất hiện lại và giờ đây, bạn có thể đặt mộ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 đế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}}
- Nếu bạn đang nhắm đến Android, hãy đặt Giá trị thành:
- Nhấp vào Lưu để lưu các thay đổi.
- 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 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.
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
Giờ đây, Cấu hình từ xa có thể theo dõi và xử lý các nội dung cập nhật cho các 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 mới theo thời gian thực để theo dõi các thay đổi về cấu hình và giá trị được cập nhật.
Cách hoạt động
Để theo dõi 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 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 này trong trò chơi, hãy thực hiện các 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 này. Đặt phương thức sau trong 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 một danh sách các khoá đã cập nhật và một thông báo thành công vào nhật ký khi kích hoạt các giá trị mới.
Đăng ký nhận 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 nội dung 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.
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ý theo dõi sự kiện phải huỷ đăng ký phương thức đó khi 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. 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, trong mục Cấu hình từ xa của bảng điều khiển Firebase:
- Nhấn vào nút chỉnh sửa bên cạnh
acceleration_tile_force
.
- Thay đổi giá trị thành "120" rồi nhấn vào Lưu.
- Nhấp vào nút Xuất bản các thay đổi.
- Kiểm tra nhật ký.
- Nếu bạn thấy một thông báo nhật ký bắt đầu bằng "Error occurred while listening" (Đã xảy ra lỗi trong khi nghe), hãy đọc phần còn lại của thông báo đó và thử gỡ lỗi bằng thông báo lỗi mà thông báo đó in ra.
- Nếu bạn thấy một nhật ký bắt đầu bằng "Updated keys" (Khoá đã cập nhật), thì tức là ứng dụng của bạn đã nhận được các giá trị đã thay đổi.
- Nếu bạn không thấy cả hai, hãy xem xét phần còn lại của nhật ký, sau đó xem lại hướng dẫn trong phần 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ó vấn đề gì không.
12. Xin chúc mừng!
Bạn đã sử dụng Cấu hình từ xa để kiểm soát các giá trị trong trò chơi từ xa 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 các biến thể khác nhau!
Nội dung đã đề cập
- Cách đặt và truy xuất các giá trị Cấu hình từ xa
- Cách đo lường mã Unity C# để sử dụng các giá trị đã truy xuất
- Cách lưu trữ, đo lường 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ân phát các biến thể giá trị khác nhau
Các bước tiếp theo
Đọc về mức độ ưu tiên của giá trị tham số để hiểu rõ hơn về logic của những giá trị mà một thực thể ứng dụng nhận được khi sử dụng một tham số có nhiều giá trị (do điều kiện hoặc vị trí).