Chương 6: Cấu hình hệ thống tập trung
Mọi key SDK, Ad Unit ID, timeout và cờ bật/tắt module đều được tập trung trong một file ScriptableObject duy nhất: Assets/_Project/Resources/CoreConfig.asset. Khi bạn clone game mới, bạn chỉ cần sửa asset này và các file json/plist, không cần phải sửa một dòng code C# nào trong Core!
1. Chi tiết từng trường trong CoreConfig
Để mở nhanh file này trong Unity Editor, hãy vào menu: TapBrain → Select Core Config.
| Nhóm | Tên Field | Giá trị mặc định | Ý nghĩa và Hoạt động |
|---|---|---|---|
| Debug | verboseLog |
true |
Bật ghi log chi tiết (CoreLog.Info). Luôn tự động bật trong các bản build development. |
showDebugPanel |
true |
Cho phép mở bảng điều khiển kiểm thử (phím F1 / chạm 3 ngón) trong Editor và bản build dev. | |
| Modules | enableFirebase |
true |
Bật/tắt toàn bộ dịch vụ Firebase. Nếu tắt, bước boot Firebase được bỏ qua. |
enableAuth |
true |
Bật/tắt đăng nhập ẩn danh Firebase Auth (cần cho RTDB). | |
enableRealtimeDb |
true |
Bật/tắt Firebase Realtime Database. | |
enableAds |
true |
Bật/tắt mạng quảng cáo AppLovin MAX. | |
enableIap |
true |
Bật/tắt dịch vụ thanh toán Unity IAP. | |
enableGameAnalytics |
true |
Bật/tắt phân tích dữ liệu GameAnalytics. | |
enableAppMetrica |
true |
Bật/tắt phân tích dữ liệu AppMetrica. | |
enableBI |
true |
Bật/tắt tự động gửi hồ sơ telemetry người dùng lên RTDB. | |
enableNotifications |
true |
Bật/tắt tạo channel và xin quyền thông báo cục bộ. | |
enableAppUpdateCheck |
true |
Bật/tắt kiểm tra cập nhật store trong background. | |
enableSearchAdsAttribution |
true |
Bật/tắt lấy attribution Apple Search Ads trên iOS. | |
| Store | iosAppStoreId |
"REPLACE_ME" |
Apple ID của app trên App Store Connect (ví dụ: "1234567890"). |
androidPackageName |
"REPLACE_ME" |
Package name trên Google Play (ví dụ: "com.tapbrain.mygame"). | |
privacyPolicyUrl |
"REPLACE_ME" |
Đường dẫn chính sách quyền riêng tư của studio. | |
| AppLovin MAX | maxSdkKey |
android: "REPLACE_ME" |
SDK Key lấy từ tài khoản AppLovin dashboard. Nếu là placeholder, quảng cáo tự động tắt. |
bannerAdUnit |
android: "REPLACE_ME" |
Ad Unit ID cho quảng cáo Banner. | |
interstitialAdUnit |
android: "REPLACE_ME" |
Ad Unit ID cho quảng cáo Interstitial toàn màn hình. | |
rewardedAdUnit |
android: "REPLACE_ME" |
Ad Unit ID cho quảng cáo Rewarded nhận thưởng. | |
appOpenAdUnit |
android: "" |
Ad Unit ID cho quảng cáo App Open (tùy chọn, để trống nếu không dùng). | |
autoShowBanner |
true |
Tự động hiển thị banner ngay sau khi MAX hoàn tất khởi động. | |
| AppMetrica | appMetricaApiKey |
android: "REPLACE_ME" |
API Key lấy từ dashboard AppMetrica (Android/iOS riêng biệt). |
| IAP | removeAdsProductId |
"com.tapbrain.template.removeads" |
Product ID non-consumable dùng để tắt quảng cáo banner và interstitial. |
| RTDB / BI | realtimeDbRoot |
"template" |
Tên node gốc riêng của game trên Firebase RTDB chung (tránh trùng dữ liệu giữa các game). |
| Timeouts | firebaseTimeout |
8.0s |
Hạn mức tối đa cho bước khởi tạo Firebase Dependencies. |
remoteConfigTimeout |
4.0s |
Hạn mức tối đa cho bước fetch Remote Config lúc mở app. | |
adsInitTimeout |
6.0s |
Hạn mức tối đa cho bước khởi tạo MAX SDK. | |
minLoadingSeconds |
1.5s |
Thời gian tối thiểu màn hình Loading hiển thị trước khi vào Home. |
2. Quản lý Remote Config Keys
Template định nghĩa sẵn 3 key hệ thống trong danh sách remoteConfigDefaults của CoreConfig:
| Key Remote Config | Giá trị mặc định | Ý nghĩa hoạt động |
|---|---|---|
inter_interval_sec |
"30" |
Khoảng cách tối thiểu (tính bằng giây) giữa 2 lần hiển thị quảng cáo toàn màn hình. |
inter_first_delay_sec |
"60" |
Không cho phép hiển thị quảng cáo Interstitial trong N giây đầu tiên kể từ lúc mở app. |
app_open_enabled |
"false" |
Có bật quảng cáo App Open khi người chơi mở lại game từ màn hình nền hay không. |
game_win_coins |
"50" |
Số lượng coin thưởng khi người chơi hoàn thành màn chơi (được đăng ký trong GameEntry). |
Cách thêm một key Remote Config mới:
- Khai báo hằng số trong
GameKeys.cs:public const string RcEnergyMax = "game_energy_max"; - Đăng ký giá trị mặc định lúc offline trong
GameEntry.Init():App.RemoteConfig.AddDefault(GameKeys.RcEnergyMax, "100"); - Đọc giá trị ở bất cứ đâu trong code game:
int maxEnergy = (int)App.RemoteConfig.GetLong(GameKeys.RcEnergyMax, 100);
3. Quản lý tập trung qua GameKeys.cs
Để tránh việc gõ sai chính tả chuỗi ký tự (typo) dẫn tới lỗi runtime khó tìm, mọi key của game đều được gom vào một static class duy nhất:
// File: Assets/_Project/Game/GameKeys.cs
namespace TapBrain.Game
{
public static class GameKeys
{
// LocalStorage (quy ước: luôn có tiền tố "game.")
public const string Coins = "game.coins";
public const string Level = "game.level";
// Remote Config
public const string RcWinCoins = "game_win_coins";
// Vị trí quảng cáo (Ad Placements)
public const string PlacementLevelEnd = "level_end";
public const string PlacementDoubleReward = "double_reward";
public const string PlacementMainBack = "main_back";
// IAP Product IDs
public const string ProductCoinsSmall = "com.tapbrain.template.coins_small";
}
}
4. Danh mục sản phẩm IAP (IAP Catalog)
Danh mục sản phẩm được quản lý trực quan qua cửa sổ của Unity IAP: Services → In-App Purchasing → IAP Catalog. Cửa sổ này sẽ lưu dữ liệu vào file Assets/Resources/IAPProductCatalog.json.
Mặc định template có 2 sản phẩm mẫu:
com.tapbrain.template.coins_small: Loại Consumable (tiêu hao, mua được nhiều lần).com.tapbrain.template.removeads: Loại Non-consumable (vĩnh viễn, tự động tắt banner và interstitial).
5. Scripting Define Symbols & Player Settings
Trong Project Settings → Player → Scripting Define Symbols, template cấu hình sẵn define:
gameanalytics_max_enabled: Định nghĩa này bắt buộc phải có trên Android và iOS để SDK GameAnalytics tự động đăng ký lắng nghe sự kiện doanh thu quảng cáo ILRD từ AppLovin MAX SDK.
6. Chốt chặn kiểm tra lúc Build (Build Guard)
Template tích hợp sẵn class CoreConfigTools.cs (triển khai interface IPreprocessBuildWithReport của Unity). Trước khi Unity tiến hành build:
- Nó quét toàn bộ file
CoreConfig.assetvà Bundle ID trong Player Settings. - Nếu là build Development: Chỉ ghi cảnh báo vàng (Warning) trong Console nếu còn placeholder.
- Nếu là build Release: Nếu phát hiện bất kỳ trường nào vẫn còn là
"REPLACE_ME"hoặc Bundle ID vẫn bắt đầu bằngcom.tapbrain.template, Unity sẽ LẬP TỨC HỦY BUILD (BuildFailedException)!
Chốt chặn này loại bỏ hoàn toàn sự cố kinh điển: "Lập trình viên xuất bản game lên Google Play Production nhưng quên chưa thay Ad Unit ID thật, khiến toàn bộ doanh thu quảng cáo bị mất trắng!"
Trong Unity Editor, nhấn vào menu: TapBrain → Validate Core Config.
Quan sát cửa sổ Console: Bạn sẽ thấy danh sách toàn bộ các trường hiện tại còn là placeholder REPLACE_ME được liệt kê chi tiết!