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

Shop

Màn Shop liệt kê những gì server bán và cho người chơi mua bằng tiền tệ trong game (Core Dust, v.v.). Giá, giới hạn mua và những gì một lượt mua mang lại đều do server quyết định.

Bạn dùngNó cho bạn
IProjectVShopScreenScreen contract: theo dõi các gói (offer), mua một gói
ProjectVShopViewNhững gì cần vẽ: trạng thái đang tải và danh sách gói
ProjectVShopOfferViewMột gói: giá, khoảng số lượng, giới hạn mua
ProjectVResultKết quả của một lượt mua

Mới làm quen với Shop? Hãy làm theo hướng dẫn trước.

Bắt đầu nhanh​

using System;
using System.Threading.Tasks;
using SilverTiger.ProjectV.Unity.Presentation.Shop;
using UnityEngine;
using VContainer;

public sealed class ShopPage : MonoBehaviour
{
private IProjectVShopScreen shop = null!;
private IDisposable? observation;

[Inject]
public void Construct(IProjectVShopScreen screen) => shop = screen;

private void OnEnable() => observation = shop.Observe(Render);

private void OnDisable()
{
observation?.Dispose();
observation = null;
}

private void Render(ProjectVShopView view)
{
if (view.IsLoading)
{
ShowLoading(view.LoadError); // LoadError is null while the first load is running
return;
}
ShowOffers(view.Offers);
}

public async void OnBuyClicked(string offerId, int quantity)
{
var result = await shop.PurchaseAsync(offerId, quantity);
if (this != null && !result.IsSuccess)
{
ShowMessage(result.Message);
}
}

private void ShowLoading(string? error) { }
private void ShowOffers(System.Collections.Generic.IReadOnlyList<ProjectVShopOfferView> offers) { }
private void ShowMessage(string message) { }
}

Đó là toàn bộ trang: theo dõi, vẽ, mua. Sau khi mua thành công bạn không phải làm gì; Render được gọi lại với số lượt mua mới, và Header hiện số dư mới.

Vẽ gì​

Render nhận một ProjectVShopView:

MemberKiểuDùng để
IsLoadingboolTrue cho tới khi danh sách gói về lần đầu. Hiện spinner
LoadErrorstring?Được gán khi lần tải đầu tiên đó thất bại. Hiện nó kèm nút thử lại (Retry) đóng rồi mở lại trang
OffersIReadOnlyList<ProjectVShopOfferView>Mỗi gói một phần tử, theo thứ tự của server
Find(offerId)ProjectVShopOfferView?Tra một gói, ví dụ để cập nhật popup mua đang mở

Với mỗi ProjectVShopOfferView:

Để hiệnĐọc
GiáWalletPrice theo WalletCurrencyId (ví dụ 50 core_dust)
Bộ chọn số lượngTừ QuantityMin đến QuantityMax
"Đã mua 3/5 hôm nay"PurchaseCount / LimitCount, cùng LimitKind (Daily, Weekly, Monthly, Forever)
Hết hàngPurchaseLimitReached

Khớp một gói với art và text của bạn bằng OfferId.Value trong một bảng của riêng bạn; SDK không cung cấp tên hay icon.

Mua một gói​

Task<ProjectVResult> PurchaseAsync(string offerId, int quantity)
Tham sốKiểuGiá trị
offerIdstringoffer.OfferId.Value của một gói trong view hiện tại
quantityintTừ QuantityMin đến QuantityMax

Trả về một ProjectVResult:

IsSuccessMessageĐiều gì đã xảy ra
truerỗngServer đã xác nhận lượt mua. Trang và Header tự vẽ lại
falselý do, sẵn để hiệnLượt mua không diễn ra, hoặc không thể xác nhận (xem bên dưới)

Khi thất bại — hiện Message nguyên văn. Các lý do thường gặp:

Tình huốngNgười chơi thấy gì
Không đủ tiền tệThông báo của server (code SHOP_INSUFFICIENT_FUNDS)
Đã chạm giới hạnThông báo của server (code SHOP_LIMIT_REACHED)
Gói đã thay đổi hoặc bị gỡ trên serverThông báo của server (code SHOP_STALE_OFFER, SHOP_OFFER_NOT_FOUND); danh sách vẽ lại với các gói hiện tại
offerId không có trong view hiện tại"This offer is no longer available." (gói này không còn nữa)
Gói store (IsIap)"This offer must be purchased through the platform store." (gói này phải mua qua store của nền tảng)
Không có kết nối hoặc timeoutMột thông báo mạng. Lượt mua có thể vẫn đã thành công, nên đừng tự động mua lại

Lần bấm thứ hai trong lúc lượt mua đang chạy nhận cùng kết quả thay vì mua hai lần. Sau khi thất bại, để người chơi tự quyết định có thử lại hay không.

Bộ chọn số lượng​

  • Bắt đầu ở QuantityMin.
  • Giá trị tối đa là số nhỏ nhất trong: QuantityMax, phần còn lại của giới hạn (LimitCount - PurchaseCount, khi LimitKind không phải None), và số người chơi đủ tiền mua (balance / WalletPrice, dùng số dư WalletCurrencyId trên Header).
  • Tắt nút Buy khi khoảng đó rỗng.
  • Ẩn gói Forever khi PurchaseLimitReached là true; giữ các gói có reset (Daily, Weekly, Monthly) hiển thị ở trạng thái hết hàng.

Các quy tắc này chỉ định hình bộ chọn. Dù sao server cũng kiểm tra mọi lượt mua.

Lỗi thường gặp​

  • Tự cộng lượt mua vào số dư. Header tự cập nhật; số của bạn sẽ sai.
  • Gọi refresh sau khi mua, hoặc khi trang mở. Observe đã làm mọi thứ cần thiết.
  • Tắt nút Buy để chặn bấm hai lần. Không cần; lần bấm thứ hai sẽ gộp vào lượt mua đầu tiên.
  • Dùng kết quả sau khi trang đã đóng. Kiểm tra this != null sau await.
  • Không dispose observation. Giữ IDisposable từ Observe và dispose (giải phóng) nó trong OnDisable hoặc OnDestroy.

Presenter​

IProjectVShopPresenter là interface cấp thấp hơn nằm sau screen contract. Nó còn cung cấp Receipt của lượt mua gần nhất và một ProjectVShopError đầy đủ với Code và RequestId. Chỉ dùng nó khi bạn cần những thứ đó; các trang thường dùng IProjectVShopScreen.