TapBrain Template

Chương 6: Cấu hình hệ thống tập trung

⚙️ Nguyên tắc cấu hình

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 nhanh 5 lần vào góc trên bên trái) 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"
ios: "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"
ios: "REPLACE_ME"
Ad Unit ID cho quảng cáo Banner.
interstitialAdUnit android: "REPLACE_ME"
ios: "REPLACE_ME"
Ad Unit ID cho quảng cáo Interstitial toàn màn hình.
rewardedAdUnit android: "REPLACE_ME"
ios: "REPLACE_ME"
Ad Unit ID cho quảng cáo Rewarded nhận thưởng.
appOpenAdUnit android: ""
ios: ""
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"
ios: "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:

  1. Khai báo hằng số trong GameKeys.cs:
    public const string RcEnergyMax = "game_energy_max";
  2. Đăng ký giá trị mặc định lúc offline trong GameEntry.Init():
    App.RemoteConfig.AddDefault(GameKeys.RcEnergyMax, "100");
  3. Đọ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.asset và 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ằng com.tapbrain.template, Unity sẽ LẬP TỨC HỦY BUILD (BuildFailedException)!
🛡️ Giá trị bảo vệ của Build Guard

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!"

🎯 Bài tập kiểm tra chốt chặn

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!