Công thức presentation
Các công thức này chỉ dùng screen contract và presenter công khai. Đổi tên widget và cách chuyển màn cho hợp với game; giữ nguyên quy tắc vòng đời và trạng thái.
Theo dõi và dọn dẹp
Mỗi trang giữ một lần theo dõi (screen contract) hoặc một subscription (presenter) trong suốt thời gian nó hoạt động. Xem đầy đủ ví dụ Lobby. Các đảm bảo:
- mỗi trang có một
ObservehoặcSubscribeAsyncđang hoạt động, tạo khi trang mở; - đúng
IDisposableđó được dispose (giải phóng) khi trang đóng; - các lời gọi presenter nhận token sẽ bị huỷ khi trang đóng. Command (lệnh) của screen không nhận token: kiểm tra trang còn sống trước khi xử lý kết quả của chúng.
Các view của chính ProjectV dùng UniTask (.AsUniTask()); quy tắc vẫn như
vậy.
Bắt đầu, khôi phục và hiện Login
private async Task RunStartupAsync(bool contentReady, CancellationToken token)
{
var result = await startup.StartAsync(contentReady, token);
var state = result.Snapshot;
if (state.IsReady)
{
NavigateToLobby();
return;
}
if (state.RequiresLogin)
{
ShowLoginChoices();
return;
}
if (state.IsBlocking)
{
ShowBlocking(state.Status, state.Error?.LocalizationKey, state.Error?.RequestId);
}
}
Đăng nhập bằng mật khẩu, rồi tiếp tục startup:
var result = await authentication.LoginPasswordAsync(username, password, token);
if (!result.IsSuccess)
{
ShowLocalized(result.Snapshot.Error?.LocalizationKey);
return;
}
await RunStartupAsync(contentReady: true, token);
Gọi GetNativeAvailability trước khi hiện nút Google hoặc Apple. Đăng nhập
Guest nằm ở trang Authentication.
Vẽ header
Đăng ký nhận (subscribe) IProjectVHeaderPresenter; vẽ (render) Currencies
theo view key và đọc StaminaRecovery cho đồng hồ đếm ngược. Xem
Header. Không bao giờ tự cộng số lượng mua hay phần
thưởng vào số dư.
Tải một màn
Với screen contract, chỉ cần theo dõi: SDK tải những gì cache
còn thiếu, và quay lại một màn thường không tốn request nào. Hiện lời nhắc thử
lại từ LoadError trong khi IsLoading.
Với presenter, gọi RefreshAsync một lần khi vào màn, hoặc khi người chơi bấm
thử lại (Retry); nó trả lời từ cache khi dữ liệu còn mới. Đừng refresh mỗi
frame, refresh song song từ nhiều widget, hay refresh sau một command thành
công: command đã ghi trạng thái mới của server vào cache.
Mua một gói (offer) trong Shop
private async Task BuyAsync(string offerId, int quantity)
{
var result = await shop.PurchaseAsync(offerId, quantity); // IProjectVShopScreen
if (this != null && !result.IsSuccess)
{
ShowMessage(result.Message);
}
}
Bấm lặp lại sẽ nhập vào lượt mua đang chạy. Danh sách gói và Header cập nhật qua lần vẽ riêng của chúng khi server xác nhận; lượt mua tốn một request.
Bắt đầu một nhiệm vụ
Gọi IProjectVCampaignScreen.BeginMissionAsync, rồi tải scene gameplay một
lần; nếu tải thất bại vì bất kỳ lý do gì, gọi CancelSceneLoadAsync. Xem
Screen contract và
Gameplay data.
Lên cấp một nhân vật
Gọi IProjectVCharacterScreen.LevelUpAsync(characterId, items) (hoặc bản
tương đương của Alliance) một lần cho mỗi lần bấm. Khi thành công Message
rỗng: view vẽ lại với cấp mới, nên so sánh Level trước và sau để hiện "+N
levels" (+N cấp). Khi thất bại, hiện Message. Xem
Character.
Vẽ trạng thái khôi phục
Khi một snapshot có Recovery:
- giữ dữ liệu hiển thị khi
HasUsableDatalà true; - hiện chỉ báo offline/một phần theo
Phase; - chỉ hiện Retry khi
CanRetry, chỉ hiện Sync khiCanSync; - tôn trọng
RetryAfterSeconds.
Đăng xuất
Gọi IProjectVAccountPresenter.LogoutAsync. Khi snapshot báo
RequiresLoginNavigation, tải scene Login. SDK xoá phiên và mọi snapshot của
tài khoản; đừng tự xoá PlayerPrefs hay token.