Tra cứu presenter
Mỗi presenter chỉ có một instance cho toàn bộ app. Inject interface vào một view được scene scope của bạn đăng ký.
| Presenter | Namespace (SilverTiger.ProjectV.Unity.Presentation.*) | Dùng cho |
|---|---|---|
IProjectVStartupPresenter | .Startup | Login: admission, khôi phục session, hydration |
IProjectVAuthenticationPresenter | .Authentication | Login: Guest, mật khẩu, Google, Apple |
IProjectVAccountPresenter | .Account | Popup tài khoản: đăng xuất, xoá tài khoản |
IProjectVLobbyPresenter | .Lobby | Hồ sơ ở Lobby |
IProjectVHeaderPresenter | .Header | Thanh trên cùng: tiền tệ, đếm ngược stamina (thể lực) |
IProjectVCharacterPresenter | .Character | Nhân vật, kỹ năng, trang bị, skin, vật phẩm |
IProjectVAlliancePresenter | .Alliance | Chọn đồng minh (ally) |
IProjectVCampaignPresenter | .Campaign | Danh sách nhiệm vụ, sao, vào nhiệm vụ |
IProjectVShopPresenter | .Shop | Gói (offer) và lượt mua |
IProjectVGameplayDataPresenter | .Gameplay | Scene nhiệm vụ: dữ liệu bắt đầu và quyết toán |
Các type dùng chung cho nhiều presenter (trạng thái phục hồi, xác nhận giao dịch, lỗi, ID có kiểu, helper gắn UI) nằm ở trang Type dùng chung.
Ưu tiên screen contract
Lobby, Character, Alliance, Campaign và Shop còn có
screen contract (IProjectVLobbyScreen và các contract khác).
Một trang theo dõi một view và gọi command (lệnh). Chỉ dùng presenter cho những
gì contract chưa hỗ trợ.
Cấu trúc chung
Mọi screen presenter đều theo cùng một mẫu:
ProjectVXxxSnapshot Current { get; } // latest snapshot, never null
Task<IDisposable> SubscribeAsync(Action<ProjectVXxxSnapshot> listener); // current value, then every change
Task<ProjectVXxxCommandResult> RefreshAsync(CancellationToken token); // where the screen has data
Task<ProjectVXxxCommandResult> SomeCommandAsync(..., CancellationToken token);
- Snapshot chứa một enum
Status, dữ liệu của màn (hoặcnullkhi chưa tải xong), mộtError(hoặcnull) và, trên các màn có dữ liệu, mộtProjectVScreenRecoveryStateRecovery. - Kết quả command chứa
SnapshotvàIsSuccess. Luôn vẽ (render) snapshot, kể cả khi thất bại; dữ liệu dùng được trước đó vẫn được giữ. - Listener của presenter có thể chạy ngoài Unity main thread. Chuyển về main
thread trước khi đụng vào Unity object (ví dụ bằng
await UniTask.SwitchToMainThread()của UniTask). Screen contract tự làm việc này cho bạn. - Exception nghĩa là lỗi lập trình hoặc lỗi vòng đời (tham số sai, sai scene).
Lỗi backend dự kiến được trả về dưới dạng giá trị trong
Error.
Lỗi theo presenter
| Presenter | Type lỗi | Hiện cho người chơi |
|---|---|---|
| Startup, Authentication, Account, Lobby | ProjectV*Error | LocalizationKey (ví dụ projectv.startup.network) qua hệ thống localization của bạn |
| Character, Alliance, Campaign, Shop | ProjectV*Error | SafeMessage (đã an toàn để hiện cho người chơi) |
| Gameplay data | ProjectVGameplayDataResult | SafeMessage; giữ ErrorCode để ghi log |
Mọi type lỗi đều có Category (ProjectVBackendErrorCategory), Code và,
khi server có trả về, RequestId để hỗ trợ.