Chuyển tới nội dung chính

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:

  1. mỗi trang có một Observe hoặc SubscribeAsync đang hoạt động, tạo khi trang mở;
  2. đúng IDisposable đó được dispose (giải phóng) khi trang đóng;
  3. 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 HasUsableData là true;
  • hiện chỉ báo offline/một phần theo Phase;
  • chỉ hiện Retry khi CanRetry, chỉ hiện Sync khi CanSync;
  • 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.