Chương 2: Cài đặt & Cấu hình SDK
Hướng dẫn tích hợp gói UPM com.mgw.sdk cố định theo Git Tag, cài đặt các SDK bên thứ ba tương ứng, thiết lập thông số tập trung trong CoreConfig.asset, quản lý Scripting Defines qua cửa sổ SDK Settings và vượt qua các bài kiểm tra của chốt chặn Build Guard.
1. Mục đích & Quy chuẩn cài đặt
Để đảm bảo dự án game hoạt động ổn định và dễ dàng nâng cấp trong tương lai, SDK được phân phối dưới dạng gói Git UPM. Tất cả các dự án game khi cài đặt SDK bắt buộc phải ghim chặt (pin) vào một Git Tag phiên bản cụ thể (ví dụ #v0.1.0), tuyệt đối không trỏ vào nhánh main để tránh bị ảnh hưởng khi SDK cập nhật các thay đổi đột ngột.
2. Hướng dẫn cài đặt từng bước
Bước 1: Khai báo Package trong Packages/manifest.json
Mở file Packages/manifest.json trong thư mục dự án Unity của bạn và thêm dòng khai báo sau vào khối dependencies:
{
"dependencies": {
"com.mgw.sdk": "https://<git-host>/<org>/mgw-sdk.git#v0.1.0"
}
}
Thay <git-host>/<org> bằng địa chỉ kho SDK mà team cung cấp. Các gói Unity mà SDK cần (com.unity.purchasing 5.3.1, com.unity.textmeshpro 3.0.9, com.unity.ugui 1.0.0, com.unity.ads.ios-support 1.0.0) được khai báo trong package.json của SDK nên Unity tự cài, bạn không cần thêm thủ công. Để nâng cấp, chỉ đổi tag (ví dụ #v0.1.0 sang #v0.2.0), đọc CHANGELOG.md của gói rồi để Unity resolve lại.
Bước 2: Cài đặt các SDK bên thứ ba theo Provider
Tùy thuộc vào Provider được chọn cho dự án, bạn cần cài đặt các gói thư viện tương ứng:
-
Cho cả hai Provider: Google Play Plugins đặt trong
Assets/GooglePlayPlugins/(các asmdefGoogle.Play.Common,Google.Play.Core,Google.Play.AppUpdate,Google.Play.Review). Đây không phải gói UPM và không nằm trongpackage.json, nhưngTapBrain.Coreluôn tham chiếu chúng: thiếu thì SDK không biên dịch được. -
Khi dùng Provider MGW (Mặc định):
- AppLovin MAX SDK (thông qua Scoped Registry của AppLovin: gói
com.applovin.mediation.ads). - Firebase Unity SDK bản 12.x (các gói tarball
.tgzgồm:app,analytics,auth,crashlytics,database,remote-config). - External Dependency Manager for Unity (EDM4U).
- Unity Mobile Notifications (
com.unity.mobile.notifications). - Tùy chọn bổ trợ: GameAnalytics (
com.gameanalytics.sdk) và AppMetrica (io.appmetrica.analytics).
- AppLovin MAX SDK (thông qua Scoped Registry của AppLovin: gói
-
Khi dùng Provider SayKit:
- SayKit SDK (gói
io.saygames.saykitđược tải qua SayKit Version Manager). - Lưu ý quan trọng: SayKit yêu cầu xóa bỏ hoàn toàn các gói AppLovin MAX, Firebase, EDM, GameAnalytics và AppMetrica khỏi dự án (Build Guard chặn build nếu còn sót). Menu
TapBrain > SDK > Switch To SayKit...tự gỡ và cất chúng sang một thư mục lưu trữ ngoàiAssets/(khôi phục khi chuyển lại MGW); lần chuyển đầu tiên đòi hỏi góiio.saygames.saykitđã được cài sẵn.
- SayKit SDK (gói
Bước 3: Tạo và định vị CoreConfig.asset
SDK yêu cầu một file cấu hình duy nhất dạng ScriptableObject tên là CoreConfig.asset nằm trong bất kỳ thư mục Resources/ nào của dự án (ví dụ: Assets/Resources/CoreConfig.asset).
Trong Unity Editor, bạn chỉ cần chọn menu:
TapBrain > Select Core Config
Nếu file chưa tồn tại, công cụ sẽ tự động tạo mới file tại Assets/Resources/CoreConfig.asset và ping chọn file đó trong cửa sổ Project. (Editor cũng tự tạo file mặc định này sau mỗi lần biên dịch lại nếu dự án chưa có Resources/CoreConfig.asset.) Nếu có hơn một file Resources/CoreConfig.asset, SDK cảnh báo [CoreConfig] More than one Resources/CoreConfig.asset; keep one: hãy giữ lại đúng một file.
3. Bảng phân nhóm toàn bộ các trường trong CoreConfig
Class CoreConfig (namespace TapBrain.Core) là trung tâm lưu trữ toàn bộ các mã định danh và thiết lập thời gian chạy của SDK:
| Nhóm cấu hình | Tên trường (Field) | Kiểu dữ liệu | Giá trị mặc định | Ý nghĩa & Vai trò |
|---|---|---|---|---|
| Debug | verboseLog |
bool | true | Bật log thông tin (CoreLog.Info) của SDK; luôn bật trong Development Build (verboseLog || Debug.isDebugBuild). Cảnh báo và lỗi luôn được in bất kể giá trị này. |
showDebugPanel |
bool | true | Cờ dành cho bảng gỡ lỗi do game tự dựng (chỉ nên hiện trong Editor/Development Build). SDK không có sẵn bảng gỡ lỗi và không tự đọc cờ này. | |
| Cờ bật tắt Module (Header Modules) |
enableFirebase |
bool | true | Kích hoạt bước khởi tạo Firebase (gồm Crashlytics và Analytics). |
enableAuth |
bool | true | Kích hoạt đăng nhập ẩn danh Firebase Auth (cần khi dùng Realtime Database). | |
enableRealtimeDb |
bool | true | Kích hoạt kết nối Firebase Realtime Database. | |
enableAds |
bool | true | Kích hoạt quảng cáo AppLovin MAX trên MGW. | |
enableIap |
bool | true | Kích hoạt dịch vụ Unity IAP trong luồng khởi động. | |
enableGameAnalytics |
bool | true | Bật kích hoạt sink GameAnalytics ở thời gian chạy (MGW). | |
enableAppMetrica |
bool | true | Bật kích hoạt sink AppMetrica ở thời gian chạy (MGW). | |
enableBI |
bool | true | Tự động đẩy thông tin thiết bị (BIService) lên Realtime Database trong bước RealtimeDb+BI (cần enableRealtimeDb bật). |
|
enableNotifications |
bool | true | Kích hoạt bước đăng ký kênh và xin quyền thông báo cục bộ (MGW). | |
enableAppUpdateCheck |
bool | true | Kích hoạt kiểm tra phiên bản mới trên Store ngầm ở bước Background. Menu chuyển sang SayKit tự đặt giá trị này về false (vì Play Core đi kèm EDM bị gỡ), và khôi phục khi chuyển lại MGW. |
|
enableSearchAdsAttribution |
bool | true | Kích hoạt lấy token Apple Search Ads ngầm trên iOS. | |
| Thông tin Store (Header Store) |
iosAppStoreId |
string | REPLACE_ME |
Apple ID của ứng dụng trên App Store Connect; dùng để mở trang cửa hàng trên iOS. Được Build Guard kiểm tra (cả hai provider, mọi nền tảng). |
androidPackageName |
string | REPLACE_ME |
Tên gói trên Google Play Store, để game tham chiếu khi cần. SDK hiện không đọc trường này (trang cửa hàng Android mở theo Application.identifier) và Build Guard không kiểm tra. |
|
privacyPolicyUrl |
string | REPLACE_ME |
Đường dẫn trang chính sách quyền riêng tư của studio, để game dùng ở màn hình cài đặt/đồng ý. SDK không đọc trường này và Build Guard không kiểm tra. | |
| AppLovin MAX (Header AppLovin MAX; các khóa chỉ dùng cho MGW) |
maxSdkKey |
PlatformString | REPLACE_ME |
SDK Key lấy từ tài khoản AppLovin (Android & iOS). |
bannerAdUnit |
PlatformString | REPLACE_ME |
Mã Ad Unit cho quảng cáo Banner. | |
interstitialAdUnit |
PlatformString | REPLACE_ME |
Mã Ad Unit cho quảng cáo Chèn (Interstitial). | |
rewardedAdUnit |
PlatformString | REPLACE_ME |
Mã Ad Unit cho quảng cáo Thưởng (Rewarded). | |
appOpenAdUnit |
PlatformString | "" (Trống) | Mã Ad Unit cho App Open Ad (tùy chọn, không bắt buộc). | |
autoShowBanner |
bool | true | MGW: tự hiện banner ngay sau khi MAX khởi tạo thành công. SayKit: ánh xạ sang disableAutoBanner = !autoShowBanner. |
|
| AppMetrica (Header AppMetrica) |
appMetricaApiKey |
PlatformString | REPLACE_ME |
API Key lấy từ bảng điều khiển AppMetrica (Android & iOS). |
| In-App Purchase (Header IAP) |
removeAdsProductId |
string | "" (Trống) | ID sản phẩm Non-Consumable dùng để xóa quảng cáo (tắt banner + interstitial); Core tự cấp, không qua grant handler. Nếu để trống, tính năng tắt. |
| Realtime Database (Header Realtime Database / BI) |
realtimeDbRoot |
string | Root mặc định dùng chung cho mọi game (hãy đổi thành tên riêng của game; để rỗng thì SDK cũng dùng root mặc định này) | Tên nút gốc trên Firebase Realtime DB dành riêng cho game này; mỗi game dùng một root khi chung database. Dữ liệu ghi dưới /<root>/debug (Development Build) hoặc /<root>/release. |
| Remote Config (Header Remote Config defaults) |
remoteConfigDefaults |
List<RemoteConfigDefault> | inter_interval_sec=30 inter_first_delay_sec=60 app_open_enabled=false |
Các cặp key-value mặc định dùng khi ngoại tuyến hoặc chưa fetch được. |
| Thời gian giới hạn (Header Boot timeouts (seconds)) |
firebaseTimeout |
float [Min(1)] | 8f | Thời gian chờ tối đa cho bước Firebase (kiểm tra phụ thuộc, tạo app, bật Analytics + Crashlytics). Chỉ MGW. |
remoteConfigTimeout |
float [Min(1)] | 4f | Thời gian chờ tối đa cho bước fetch Remote Config từ xa. Chỉ MGW; bước Remote Config của SayKit cố định 1s. Auth (5s) và IAP (8s) cũng cố định, không có trường cấu hình. | |
adsInitTimeout |
float [Min(1)] | 6f | Thời gian chờ tối đa cho bước khởi tạo AppLovin MAX. | |
sayKitInitTimeout |
float [Min(1)] | 10f | Thời gian chờ tối đa cho bước SayKit.init (chỉ dùng cho SayKit). |
|
minLoadingSeconds |
float [Min(0)] | 1.5f | Thời gian hiển thị tối thiểu của màn hình mở đầu (LoadingScreen), kể cả khi pipeline xong sớm hơn. |
4. Cửa sổ SDK Settings & Scripting Defines
Các hằng số tiền xử lý biên dịch (Scripting Defines) quyết định assembly nào được đưa vào bản build. Để tránh xung đột nền tảng, tuyệt đối không chỉnh sửa Define Symbols thủ công trong Project Settings. Hãy sử dụng cửa sổ chuyên dụng của SDK:
TapBrain > SDK Settings...
Cửa sổ này hiển thị Provider hiện tại, nút Switch To ... (cùng hộp thoại xác nhận như menu TapBrain > SDK > Switch To ...) và các checkbox của provider đang dùng: với MGW là Use GameAnalytics / Use AppMetrica, với SayKit là SayKit push notifications (GameAnalytics và AppMetrica luôn tắt). Khi bạn nhấn Apply (recompiles), hệ thống đồng bộ cùng lúc cho cả 3 nền tảng: Android, iOS và Standalone (Editor) rồi biên dịch lại. Bỏ chọn một module chỉ loại code của nó khỏi build; gói SDK vẫn nằm trong dự án cho tới khi bạn gỡ.
Bảng ý nghĩa các Scripting Define Symbols
| Ký hiệu (Symbol) | Điều kiện thiết lập | Tác dụng biên dịch |
|---|---|---|
TB_SDK_SAYKIT |
Bật khi Provider là SayKit. Vắng mặt khi dùng MGW. | Loại trừ assembly TapBrain.Sdk.MGW, GameAnalytics và AppMetrica; biên dịch assembly TapBrain.Sdk.SayKit (cần thêm gói io.saygames.saykit đã cài). |
TB_USE_GA |
Bật khi chọn dùng GameAnalytics (chỉ MGW). | Cho phép biên dịch assembly TapBrain.Sdk.GameAnalytics; assembly chỉ thực sự biên dịch khi gói com.gameanalytics.sdk đã được cài (SDK Settings cảnh báo nếu bật mà thiếu gói). |
TB_USE_APPMETRICA |
Bật khi chọn dùng AppMetrica (chỉ MGW). | Cho phép biên dịch assembly TapBrain.Sdk.AppMetrica (chỉ khi gói io.appmetrica.analytics đã được cài) và kích hoạt kiểm tra appMetricaApiKey của Build Guard. |
SAYKIT_PURCHASING |
Tự động bật khi dùng SayKit. | Kích hoạt bộ theo dõi doanh thu mua hàng của SayKit (SayKitPurchaseTracker). |
SAYKIT_NOTIFICATIONS |
Tùy chọn, bật bằng checkbox SayKit push notifications trong SDK Settings (chỉ SayKit). | Kích hoạt tính năng thông báo đẩy từ xa của SayGames. |
gameanalytics_max_enabled |
Tự động bật khi dùng MGW trên Android/iOS (không bật cho Standalone). | Kích hoạt tích hợp doanh thu quảng cáo ILRD giữa GameAnalytics và MAX. |
5. Danh mục Key & File cấu hình mỗi Game phải cung cấp
Gói com.mgw.sdk được phát hành công khai hoàn toàn không chứa bất kỳ key hoặc file bí mật nào. Mỗi game khi chuẩn bị phát hành cần tự điền các thông số sau:
A. Dành riêng cho Provider MGW
- Firebase Android Config: File
Assets/google-services.jsontải từ Firebase Console. Build Guard kiểm tra file này khi build Android (nếuenableFirebasebật). - Firebase iOS Config: File
Assets/GoogleService-Info.plisttải từ Firebase Console. Build Guard kiểm tra khi build iOS. - Cấu hình trên Firebase Console (không phải file): bật Anonymous Auth, tạo Realtime Database với rule
auth != nullvà tạo các key Remote Config trùng tên với key game đọc. Build Guard không kiểm tra mục này. - AppLovin MAX SDK Key & Ad Units: Điền vào các trường tương ứng trong
CoreConfig.asset. Ngoài ra cần dán SDK Key vào cửa sổAppLovin > Integration Manager. - AdMob App ID: Cấu hình trong cửa sổ
AppLovin > Integration Manager(phải là ID thật của game, không để ID test công khai của Googleca-app-pub-3940256099942544~...). Build Guard không kiểm tra mục này, hãy tự kiểm tra trước khi phát hành. - GameAnalytics Keys: Mở
Window > GameAnalytics > Select Settings, đăng nhập và chọn game tương ứng. Build Guard không kiểm tra mục này. - AppMetrica API Key: Điền vào trường
CoreConfig.appMetricaApiKey.
B. Dùng chung cho cả hai Provider
- Mã định danh ứng dụng (Package Name / Bundle Identifier): Thiết lập trong Player Settings. Build Guard từ chối build (
Bundle id is still the template id) nếu id còn bắt đầu bằngcom.tapbrain.template; hãy đặt id thật của game. - iOS App Store ID: Điền vào
CoreConfig.iosAppStoreId(Build Guard kiểm tra).androidPackageNamevàprivacyPolicyUrlkhông được kiểm tra. - Danh mục sản phẩm IAP: File
Assets/Resources/IAPProductCatalog.json(tạo qua cửa sổ Unity IAP Catalog) vàCoreConfig.removeAdsProductIdnếu có sản phẩm xóa quảng cáo. Tạo cùng id trên Google Play Console và App Store Connect. - Khóa giải mã hóa đơn IAP (Tangles): Mở
Services > In-App Purchasing > Receipt Validation Obfuscator, dán Google Play license key để sinh các file*Tangle.cs. Lưu ý: SDK chỉ kiểm tra hóa đơn khi game đăng ký mộtIReceiptValidator(quaSdkModules.RegisterReceiptValidatortừ một hàm[RuntimeInitializeOnLoadMethod(AfterAssembliesLoaded)], dùng các tangle làm khóa). Nếu chưa đăng ký, SDK ghi log[IAP] No IReceiptValidator registered...và chấp nhận mọi hóa đơn, không xác thực. - Liên kết Unity Gaming Services: Liên kết dự án trong
Project Settings > Services. Nếu chưa liên kết, IAP vẫn chạy nhưng ghi cảnh báo[IAP] Unity Gaming Services init failed (project not linked?)....
C. Dành riêng cho Provider SayKit
- SayKit App Keys: Điền các hằng số
APP_KEY_ANDROID,APP_KEY_IOS,APP_NAME_IOS,APP_BUNDLE_IOStrong fileAssets/SayKit/SayKitApp.cs(Build Guard kiểm tra bốn hằng số này; các hằng số còn lại nhưAPP_SECRET_*do SayGames cấp riêng và không được kiểm tra). File này chỉ chứa khóa: không tự gọiSayKit.init, vì SDK đã gọi. - Remote Config của SayKit: khai báo các key game đọc thành field trong
Assets/SayKitExtensions/GameConfig/SayKitGameConfig.cs(tên field = tên key, giá trị = mặc định).
6. Chốt chặn Build Guard & Cách xử lý lỗi
Lớp CoreConfigTools triển khai interface IPreprocessBuildWithReport để tự động rà soát toàn bộ dự án trước khi xuất bản bản build.
- Lỗi cứng (mọi bản build, kể cả Development): không có provider nào được biên dịch, và các lỗi cấu hình SayKit ở bảng dưới. Chúng làm build thất bại bằng BuildFailedException.
- Thông số còn thiếu / còn giá trị mặc định (danh sách [CoreConfig] Placeholders left): trong Development Build (tích Development Build trong Build Settings hoặc truyền BuildOptions.Development qua script build) Build Guard chỉ in cảnh báo (Warning) lên Console; trong Release Build build bị hủy với BuildFailedException (thông báo kết thúc bằng (Development builds only warn.)).
Bảng tra cứu lỗi Build Guard
| Thông báo lỗi bắt đầu bằng | Phạm vi ảnh hưởng | Nguyên nhân & Cách khắc phục |
|---|---|---|
[SdkSettings] No SDK provider compiled for provider... |
Tất cả bản build | Không có assembly provider nào được biên dịch (define symbols và các gói đã cài không khớp nhau, ví dụ bật TB_SDK_SAYKIT nhưng chưa cài io.saygames.saykit). Thông báo đầy đủ kết thúc bằng Fix it in TapBrain > SDK Settings.; mở TapBrain > SDK Settings... để kiểm tra. |
[SdkSettings] Found N SayKitApp classes, expected 1 |
Build SayKit | Dự án có số lớp SayKitApp khác 1 (thường là còn thêm file do trình cài đặt SayKit tạo, tự gọi SayKit.init lần thứ hai). Xóa Assets/SayKitExtensions/SayKitApp.cs và giữ Assets/SayKit/SayKitApp.cs; nếu số lớp là 0, chạy TapBrain > SDK > Switch To SayKit... để tạo file từ mẫu của SDK. |
[SdkSettings] SayKitApp has a [RuntimeInitializeOnLoadMethod] |
Build SayKit | File SayKitApp chứa phương thức tự init. SDK đã tự động gọi SayKit.init, cần xóa phương thức thừa này. |
[SdkSettings] <package> is still installed; SayKit requires removing it |
Build SayKit | Một trong các gói com.applovin.mediation.ads, com.google.firebase.app, com.google.external-dependency-manager, com.gameanalytics.sdk, io.appmetrica.analytics vẫn còn trong dự án. Dùng menu TapBrain > SDK > Switch To SayKit... để gỡ và cất stack MGW an toàn. |
[CoreConfig] Placeholders left: ... |
Bản Release (bản Development chỉ cảnh báo) |
Danh sách các mục chưa hợp lệ. Build Guard chỉ kiểm tra: file Firebase của nền tảng đang build (Assets/google-services.json cho Android, Assets/GoogleService-Info.plist cho iOS; MGW, enableFirebase bật); MAX SDK key và 3 ad unit banner / interstitial / rewarded cho cả Android và iOS (MGW, enableAds bật); appMetricaApiKey (khi bật TB_USE_APPMETRICA và enableAppMetrica); APP_KEY_ANDROID, APP_KEY_IOS, APP_NAME_IOS, APP_BUNDLE_IOS trong SayKitApp.cs (SayKit; giá trị trống hoặc bắt đầu bằng < là chưa điền); iosAppStoreId; và Bundle Identifier (Bundle id is still the template id nếu còn prefix mặc định com.tapbrain.template). Các trường khác như androidPackageName, privacyPolicyUrl, appOpenAdUnit, AdMob App ID, GameAnalytics key và IAP tangles không được kiểm tra. Chạy TapBrain > Validate Core Config để xem danh sách chi tiết.
|
7. Kiểm tra tính hợp lệ của cấu hình trong Editor
Bạn không cần phải đợi tới lúc bấm Build mới phát hiện ra lỗi. Hãy sử dụng menu:
TapBrain > Validate Core Config
Nếu mọi thông số đã chuẩn xác, Console sẽ in một dòng log thông thường (Debug.Log):
[CoreConfig] OK, no placeholders left
Ngược lại, nếu còn mục chưa điền, hệ thống in một cảnh báo (Warning) liệt kê từng mục (kiểm tra theo nền tảng đang chọn trong Build Settings; danh sách dưới đây chỉ là ví dụ):
[CoreConfig] Placeholders left:
- Assets/google-services.json (Firebase Android config)
- MAX SDK key (Android)
- Banner ad unit (Android)
- iOS App Store id
8. Checklist kiểm tra nhanh
manifest.json đảm bảo URL có đuôi #v0.1.0 (không trỏ vào main).TapBrain > Select Core Config để định vị và điền thông số.TapBrain > Validate Core Config đảm bảo không còn placeholder nào trước khi xuất bản.