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ùng | Nó cho bạn |
|---|---|
IProjectVShopScreen | Screen contract: theo dõi các gói (offer), mua một gói |
ProjectVShopView | Những gì cần vẽ: trạng thái đang tải và danh sách gói |
ProjectVShopOfferView | Một gói: giá, khoảng số lượng, giới hạn mua |
ProjectVResult | Kế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:
| Member | Kiểu | Dùng để |
|---|---|---|
IsLoading | bool | True cho tới khi danh sách gói về lần đầu. Hiện spinner |
LoadError | string? | Đượ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 |
Offers | IReadOnlyList<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ượng | Từ QuantityMin đến QuantityMax |
| "Đã mua 3/5 hôm nay" | PurchaseCount / LimitCount, cùng LimitKind (Daily, Weekly, Monthly, Forever) |
| Hết hàng | PurchaseLimitReached |
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ểu | Giá trị |
|---|---|---|
offerId | string | offer.OfferId.Value của một gói trong view hiện tại |
quantity | int | Từ QuantityMin đến QuantityMax |
Trả về một ProjectVResult:
IsSuccess | Message | Điều gì đã xảy ra |
|---|---|---|
true | rỗng | Server đã xác nhận lượt mua. Trang và Header tự vẽ lại |
false | lý do, sẵn để hiện | Lượ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ống | Ngườ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ạn | Thông báo của server (code SHOP_LIMIT_REACHED) |
| Gói đã thay đổi hoặc bị gỡ trên server | Thô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 timeout | Mộ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, khiLimitKindkhông phảiNone), và số người chơi đủ tiền mua (balance / WalletPrice, dùng số dưWalletCurrencyIdtrên Header). - Tắt nút Buy khi khoảng đó rỗng.
- Ẩn gói
ForeverkhiPurchaseLimitReachedlà 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.