Transakcje na wyspie umożliwiają sprzedawanie przedmiotów, ofert oraz ofert zestawów na wyspie przy użyciu Verse.
W tym przewodniku dowiesz się, jak skonfigurować własne przedmioty, oferty oraz oferty zestawów. Następnie za pomocą modułu rynku w interfejsie API Verse będziesz prowadzić sprzedaż przedmiotów w trakcie gry.
Przedmioty
Przedmioty w języku Verse definiuje się jako uprawnienia, które można podzielić na dwie kategorie: przedmioty jednorazowe, które znikają z ekwipunku gracza po wykorzystaniu, oraz przedmioty trwałe, które gracz może zachować, gdyż nie są one usuwane z jego ekwipunku.
Każde uprawnienie Verse ma następujące właściwości:
Name: Nazwa uprawnienia składająca się z maksymalnie 50 znaków.
Description: Długi opis wyświetlany wraz z uprawnieniem, składający się z maksymalnie 500 znaków.
ShortDescription: Krótki opis z podsumowaniem uprawnienia widoczny w mniejszym oknie dialogowym i składający się z maksymalnie 100 znaków.
Icon: Obraz przedstawiający uprawnienie.
Jeśli twoje uprawnienie jest płatnym przedmiotem losowym, musisz podać w opisie dokładną liczbową szansę na to, co gracz może otrzymać. Aby dowiedzieć się więcej, patrz: Płatne przedmioty losowe.
Uprawnienie Verse może mieć również następujące właściwości opcjonalne:
MaxCount: Maksymalna liczba sztuk danego uprawnienia, jaką gracz może posiadać w dowolnej chwili.
Consumable (przedmiot jednorazowy): W przypadku ustawienia dla tej opcji wartości true, uprawnienie będzie zużywalne, co oznacza, że z każdym kolejnym użyciem całkowita liczba sztuk tego uprawnienia będzie się zmniejszać. Jeśli zaś w tej opcji wybrane zostanie ustawienie false, uprawnienie będzie przedmiotem trwałym, a jego użycie nie będzie powodowało usunięcia go z ekwipunku
PaidArea: W przypadku ustawienia dla tej opcji wartości true, dane uprawnienie zapewnia dostęp do obszaru ukrytego za zaporą płatniczą.
PaidRandomItem: W przypadku ustawienia dla tej opcji wartości true, uprawnienia te są kupowane lub odbierane za zawartość w celu uzyskania losowej nagrody.
ConsequentialToGameplay: Jeśli jest to ustawione na wartość true, przedmiot zapewnia graczowi znaczącą przewagę na twojej wyspie. Aby uzyskać więcej szczegółów, patrz: Wpływające na rozgrywkę.
Jeśli masz aktywne uprawnienia, które nie są używane, i nie potwierdzisz zakupów w aplikacji w kwestionariuszu IARC, proces moderacji wyspy zakończy się niepowodzeniem.
Aby obejść ten problem, możesz zakomentować swoje uprawnienia w Verse do momentu, gdy będziesz gotowy(-wa) do użycia ich w grze. Gdy uprawnienia są oznaczone jako komentarz, nie trzeba zgłaszać zakupów w aplikacji w kwestionariuszu IARC.
Tworzenie uprawnienia jednorazowego w Verse
Uprawnienia są definiowane w Verse jako pochodne klasy bazowej uprawnienia. Poniższy fragment kodu przedstawia proces tworzenia przedmiotu jednorazowego. W tym przykładzie utworzysz nasiona kukurydzy w formie przedmiotu zużywalnego. Poniżej znajduje się ikona nasion, którą możesz wykorzystać.
# The base entitlement you should define for ALL of your entitlements in your experience.
my_island_entitlement := class<abstract><castable>(entitlement){}
CornSeedPacket<public> := module:
Name<public><localizes> : message = "Corn seed pack"
Description<public><localizes> : message = "A pack of corn seeds. Opening a pack yields 10 corn seeds for planting."
ShortDescription<public><localizes> : message = "Contains 10 corn seeds for planting."
cornseedpacket<public> := class<concrete>(my_island_entitlement):
var Name<override>:message = CornSeedPacket.Name
Tworząc uprawnienie, musisz uwzględnić ścieżkę do prawidłowej tekstury ikony, aby kod Verse został prawidłowo skompilowany. Pakiet nasion kukurydzy oraz inne ikony z tego przewodnika możesz wykorzystać za darmo!
Zadbaj, aby ikony uprawnień były teksturami w rozmiarze będącym potęgą dwójki, aby w twojej witrynie prezentowane były obrazy najwyższej jakości. Informacje na temat importowania tekstur do UEFN w celu wykorzystania ich w charakterze ikon zawiera artykuł Importowanie zasobów. Informacje na temat uwidaczniania zasobów, takich jak tekstury, w Verse zawiera artykuł Uwidacznianie zasobów.
Tworzenie uprawnień trwałych w Verse
Uprawnienia trwałe w Verse mają taki sam format, jak uprawnienia jednorazowe, jednak kluczowa różnica polega na tym, że w ich przypadku we właściwości Consumable należy ustawić wartość false, a nie true. Gracze mogą zakupić uprawnienia trwałe tylko raz i mogą posiadać tylko jeden egzemplarz danego trwałego uprawnienia.
W tym przykładzie utworzysz uprawnienie trwałe w postaci łopaty. Pod poniższym fragmentem kodu dostępna jest ikona z teksturą łopaty.
Shovel<public> := module:
Name<public><localizes>: message = "Shovel"
Description<public><localizes>: message = "An unbreakable shovel used to dig holes for planting."
ShortDescription<public><localizes>: message = "Digs holes."
shovel<public> := class<concrete>(my_island_entitlement):
var Name<override>:message = Shovel.Name
var Description<override>:message = Shovel.Description
var ShortDescription<override>:message = Shovel.ShortDescription
var Icon<override>:texture = # path to your texture here
Domyślnie, przedmioty nie są Consumable i mają właściwość MaxCount ustawioną na 1. Jeżeli przedmiot znajduje się w obszarze płatnym lub stanowi płatny przedmiot losowy lub zapewnia znaczącą przewagę wpływającą na rozgrywkę, należy zdefiniować odpowiednie pola w kodzie.
Zasady weryfikacji uprawnień
Prawidłowe uprawnienie w Verse musi spełniać poniższe wytyczne. Zakupy uprawnień, które ich nie spełniają, będą kończyły się niepowodzeniem.
Zasady decydujące o poprawności uprawnienia:
Właściwość Name ma limit znaków 50.
Właściwość Description ma limit znaków 500.
Właściwość ShortDescription ma limit znaków 100.
Właściwość MaxCount musi mieć wartość 1, gdy Consumable=false.
Właściwość MaxCount jest ograniczona do wartości maksymalnej 10,000,000.
Ustawienie MaxCount < 1 nie jest uniemożliwiane, ale spowoduje niepowodzenie, ponieważ nie można przyznać graczowi mniej niż jednej sztuki pojedynczego przedmiotu.
Katalog uprawnień
Katalog uprawnień umożliwia wyświetlanie wszystkich uprawnień oferowanych graczom.
Możesz wyświetlić raport z listą twoich uprawnień w UEFN, klikając kolejno opcje Narzędzia > Katalog uprawnień lub dokonując wyboru bezpośrednio z katalogu w Portalu Twórcy dla twojej wyspy.
Oferty
Oferta określa cenę przedmiotu lub zasobu w V-dolcach. Każda oferta ma własną nazwę, opis oraz ikonę, niezależnie od specyfikacji uprawnienia. Ofertę definiuje się w Verse.
Każda oferta ma następujące właściwości:
Name: Nazwa oferty.
Description: Długi opis wyświetlany wraz z ofertą.
ShortDescription: Krótki opis, który możesz wykorzystać do podsumowania oferty w mniejszych oknach dialogowych.
Icon: Obraz przedstawiający ofertę.
EntitlementType: Deklaracja uprawnienia uwzględnionego w ofercie.
Price: Cena w V-dolcach. Cena nie może być mniejsza niż 50 V-dolców ani większa niż 5000 V-dolców. Musi być ona wielokrotnością liczby 50.
Tworzenie prostej oferty
Ten fragment kodu pozwala zdefiniować podstawową ofertę dla prostej oferty, czyli pakietu nasion kukurydzy. Jako ikonę w tej ofercie możesz wykorzystać ikonę nasion kukurydzy z przykładowego uprawnienia.
CornSeedPacket<public> := module:
Name<public><localizes> : message = "Corn seed pack"
Description<public><localizes> : message = "A pack of corn seeds. Opening a pack yields 10 corn seeds for planting."
ShortDescription<public><localizes> : message = "Contains 10 corn seeds for planting."
corn_seed_pack<public> := class(entitlement_offer):
var Name<override> : message = CornSeedPacket.Name
var Description<override> : message = CornSeedPacket.Description
var ShortDescription<override> : message = CornSeedPacket.ShortDescription
Cena w V-dolcach musi być wielokrotnością liczby 50 i mieścić się w zakresie od 50 do 5000 V-dolców.
Musisz zadbać o to, aby gracze wyraźnie widzieli liczbową szansę otrzymania każdego z płatnych przedmiotów losowych przed zakupem. Niezastosowanie się do tego wymogu będzie uznane za naruszenie Zasad dla deweloperów wysp w Fortnite i spowoduje nałożenie odpowiednich sankcji na ciebie i twoją wyspę.
Aby dowiedzieć się więcej, patrz: Ograniczenia dotyczące transakcji na wyspie.
Tworzenie i modyfikowanie ofert stałych i alternatywnych
Możesz utworzyć alternatywne oferty tego samego uprawnienia, aby móc oferować go w specjalnych cenach w okresach urlopowych, w ramach bonusów wprowadzających bądź w celu zróżnicowania cen w zależności od regionu. Możesz również wykorzystać tę opcję do testowania uprawnienia, tworząc identyczną ofertę z wykorzystaniem różnych ikon, by sprawdzić, która bardziej przypadnie graczom do gustu. Wykorzystajmy tę ikonę jako przykład.
CornSeedPacketAlternate<public> := module:
Name<public><localizes> : message = "Corn seed pack"
Description<public><localizes> : message = "Special price! Only today!"
ShortDescription<public><localizes> : message = "Special offer half price!"
corn_seed_pack_alternate<public> := class(entitlement_offer):
var Name<override> : message = CornSeedPacketAlternate.Name
var Description<override> : message = CornSeedPacketAlternate.Description
var ShortDescription<override> : message = CornSeedPacketAlternate.ShortDescription
var Icon<override> : texture = # Your texture here
Oferty zestawów
Zestawy definiuje się w Verse. Mogą one zawierać kombinację różnych ofert, stosy tej samej oferty lub połączenie obu tych wariantów. Podobnie jak w przypadku prostych ofert, oferty zestawów mają określoną własną cenę, nazwę oraz opis, a także ikonę, która odróżnia je od uprawnień i ofert. Możesz również zagnieździć oferty, dodając zestawy do oferty zestawów. Przykładem będzie ograniczony czasowo zestaw zawierający łopatę oraz zestaw pakietów nasion kukurydzy. W ten sposób można wykorzystać mniejsze zestawy jako bloki konstrukcyjne do tworzenia większych zestawów łączonych.
Standardowymi typami zestawów są:
Zestaw ze stosami przedmiotów: Zestaw zawierający wiele ofert tego samego uprawnienia, zazwyczaj po niższej cenie.
Zestaw z wieloma ofertami: Zestaw łączący oferty wielu uprawnień. Może zawierać również połączenie ofert stosów przedmiotów i zwykłych ofert.
Przy zagnieżdżaniu można utworzyć maksymalnie 5 poziomów ofert, inaczej transakcja zakończy się niepowodzeniem. W miarę możliwości staraj się ograniczać zagnieżdżanie ofert.
Tworzenie zestawu ze stosami przedmiotów
Ten fragment kodu definiuje zestaw ze stosem nasion kukurydzy. Zestaw zawiera tablicę krotek ofert, w której zdefiniowana jest oferta wraz z wartością int wskazującą liczbę ofert. W tym przypadku zestaw będzie zawierał dwie oferty corn_seed_pack. W tym przykładzie podano ikonę.
CornSeedPacketBundle<public> := module:
Name<public><localizes> : message = "Corn seed pack bundle"
Description<public><localizes> : message = "Two packs of corn seeds. Opening a pack yields 10 corn seeds for planting."
ShortDescription<public><localizes> : message = "Two packs of corn seeds containing 10 corn seeds for planting."
corn_seed_pack_bundle<public> := class(bundle_offer):
var Name<override> : message = CornSeedPacketBundle.Name
var Description<override> : message = CornSeedPacketBundle.Description
var ShortDescription<override> : message = CornSeedPacketBundle.ShortDescription
var Icon<override> : texture = # your texture here
Tworzenie zestawów z wieloma ofertami
Gracze mogą preferować unikanie zawierania wielu transakcji, więc możesz utworzyć zestaw obejmujący wiele ofert, które zawierają różne uprawnienia. Ten fragment kodu pozwala utworzyć zestaw z wieloma ofertami, w ramach którego gracz otrzyma maksymalną liczbę pakietów kukurydzy i łopatę.
StarterBundle<public> := module:
Name<public><localizes> : message = "Starter bundle"
Description<public><localizes> : message = "Everything a new player needs. Get fully stocked to start quickly! A shovel that digs holes, and ten packs of corn seeds each containing 10 corn seeds for planting."
ShortDescription<public><localizes> : message = "A shovel that digs holes, and ten packs of corn seeds each containing 10 corn seeds for planting."
starter_bundle<public> := class(bundle_offer):
var Name<override> : message = StarterBundle.Name
var Description<override> : message = StarterBundle.Description
var ShortDescription<override> : message = StarterBundle.ShortDescription
var Icon<override> : texture = # your texture here
W Verse zestawy nie zawierają bezpośrednio uprawnień. Zamiast tego, zawierają one oferty, w których zawarte są definicje uprawnień.
Oferty tworzone dynamicznie
Oferta tworzona dynamicznie jest ofertą lub zestawem generowanym w czasie wykonywania programu w Verse. Częste przypadki użycia ofert dynamicznych:
Oferta na maksymalną ilość drewna, jaką może posiadać gracz w grze opartej na tworzeniu.
Zestaw mikstur przywracających maksimum zdrowia i many na wejściu do lochu w grach z eksploracją lochów.
Dla uproszczenia powiąż je z czymś prostym, jak przycisk lub znak. W kodzie Verse przepływ wyglądałby następująco: W momencie interakcji > wywołaj BuyOffer.
Podany fragment kodu przedstawia sposób sprzedaży zestawu pakietów kukurydzy pozwalający uzupełnić zapas gracza do maksymalnej liczby sztuk, jaką może posiadać. W razie niepowodzenia zakupu wyświetlany jest komunikat o błędzie.
TryBuyOffer(Player : player)<suspends>:void =
Purchases := GetPurchasedEntitlements(Player, Entitlements.corn_seed_pack)
var NumPlayerCornSeedPacks : int = 0
if (Purchase := Purchases[0]):
set NumPlayerCornSeedPacks = Purchase(1)
# Limit to at least 1 packet.
# If the player has the maximum amount, the offer displays with a disabled purchase button.
NumCornSeedPacks := Max(1, Entitlements.corn_seed_pack{}.MaxCount - NumPlayerCornSeedPacks)
Zasady weryfikacji ofert
Prawidłowa oferta lub zestaw ofert musi spełniać poniższe wytyczne. Zakupy, które nie będą spełniały tych zasad, nie przejdą pomyślnie moderacji. Zasady decydujące o poprawności oferty:
Maksymalna liczba poziomów zagnieżdżenia nie może przekraczać 5.
Łączna liczba identyfikatorów uprawnień nie może przekraczać 100 na ofertę. Oznacza to, że w przypadku równoczesnej sprzedaży różnych uprawnień ich całkowita liczba nie może przekraczać 100.
Cena oferty musi się mieścić w zakresie od 50 do 5000 V-dolców i musi być wielokrotnością liczby 50.
Domyślny tekst nazwy oferty
Namemoże się składać z maksymalnie 50 znaków.Domyślny tekst opisu oferty
Descriptionmoże się składać z maksymalnie 500 znaków.Domyślny tekst krótkiego opisu
ShortDescriptionmoże się składać z maksymalnie 100 znaków.Oferta musi zawierać co najmniej 1 uprawnienie.
Liczba sztuk uprawnienia w ofercie nie może być większa niż wartość właściwości
MaxCountzdefiniowana dla tego uprawnienia.Oferta nie może zawierać uprawnienia trwałego, dla którego wartość
MaxCount> 1.
Możesz zdecydować się na wprowadzenie ograniczeń dotyczących tego, gdzie oferty są prezentowane i kto może je zobaczyć. Aby dowiedzieć się więcej, patrz: Ograniczenia dotyczące transakcji na wyspie.
Tworzenie witryny sklepu
Masz już uprawnienia i skonfigurowane dla nich oferty oraz zestawy, więc potrzebujesz miejsca, by je sprzedawać!
Domyślny UI
W domyślnym interfejsie użytkownika witryny sklepu po otwarciu wyświetlana jest lista wszystkich dodanych uprawnień i ofert. Pierwsze uprawnienie na liście jest wyróżnione, a w oknie obok listy uprawnień wyświetlane jest jego omówienie.
Witryny mogą liczyć wiele stron.
Listy zawierające więcej niż pięć pozycji można przewijać.
Gracz uruchamia proces zakupu, wywołując metodę BuyOffer lub korzystając z domyślnej witryny sklepu za pomocą metody ShowOffersDialog. Poniżej przedstawiono przykłady niektórych urządzeń, które można wykorzystać do powiązania procesu zakupu w witrynie sklepowej z projektem gry:
Urządzenie wolumenów
Urządzenie licznika czasu Scene Graph
Postacie NPC
Urządzenie rozmowy
Podczas projektowania witryny sklepowej dobrą praktyką jest wymaganie od gracza podjęcia decyzji o rozpoczęciu procesu zakupu. Pominięcie tego wyboru i wymuszenie na graczu rozpoczęcia procesu zakupu ogranicza jego swobodę działania i może spowodować niezadowolenie graczy.
Przy wszystkich ofertach wyświetlane są przyciski Kup i Sprawdź, które otwierają okna rynku pozwalające zakupić daną pozycję lub sprawdzić zawartość oferty. Przycisk Sprawdź zestaw wyświetlany jest tylko w przypadku zestawów.
Wybranie przycisku Zamknij pozwala zamknąć rynek.
Sposób działania witryny sklepu jest w pełni kontrolowany przez twórcę:
Możesz samodzielnie decydować, jakie przedmioty czy właściwości rozgrywki chcesz oferować graczom.
Możesz też ustalić cenę każdej oferty produktu lub zestawu.
Możesz zaprezentować własną witrynę sklepu lub skorzystać z gotowego UI witryny sklepu Fortnite.
UI witryny sklepu
Ten fragment kodu definiuje ogólne wywołanie zwrotne zdarzenia, które otwiera wstępnie utworzony UI witryny sklepu Fortnite. Wywołanie zwrotne może pochodzić z subskrypcji, naciśnięcia przycisku, zdarzenia rozmowy itd.
OnEvent(Agent:agent):void=
if(Player:= player[Agent]):
spawn{ShowOffersDialog(Player, array{
ExampleOffers.shovel{},
ExampleOffers.cornseedpacket{}
})}
Obsługa zakupów
Ten fragment kodu zawiera ogólny proces zakupu oferty. W razie niepowodzenia zakupu wyświetlany jest komunikat o błędzie.
TryBuyOffer(Player:player, Offer : offer)<suspends>:void =
Result := BuyOffer(Player, Offer)
if (not Result?):
Print("Failed to buy the {offer.name} offer.")Aby ułatwić debugowanie nieudanych zakupów, uwzględnij sposób identyfikacji nieudanego zakupu w komunikacie o błędzie, na przykład poprzez dołączenie nazwy oferty w powyższym komunikacie o błędzie.
Dodatkowe funkcje
Płatne losowe przedmioty
Istnieją dwa sposoby oferowania płatnych przedmiotów losowych na swojej wyspie:
Możesz je bezpośrednio oferować do zakupu za V-dolce.
Możesz je pośrednio oferować, pozwalając graczom kupować uprawnienia za V-dolce, które następnie mogą zostać wykorzystane do odebrania nagrody losowej lub mogą wpływać na prawdopodobieństwo jej otrzymania.
Podczas tworzenia przedmiotu, który zapewnia losową nagrodę, należy ustawić PaidRandomItem na true.
Jeśli oferujesz zawartość, którą można wykorzystać do odebrania nagrody losowej, musisz użyć funkcji RestrictPaidRandomItems, aby uniemożliwić graczom bez dostępu do niej zdobycie nagrody losowej.
OnEvent(Agent:agent):void=
if (Player := player[Agent]):
if (RestrictPaidRandomItems[Player]):
Print("Player is not allowed to purchase PaidRandomItems.")
else:
Print("Player is allowed to purchase PaidRandomItems.")
Bezpośrednie monity o zakup
Jeśli twoja wyspa posiada bezpośrednie monity o zakup, musisz użyć funkcji RestrictDirectPromptsToPurchase, aby określić, czy gracz kwalifikuje się do otrzymania monitu.
OnEvent(Agent:agent):void=
if (Player:= player[Agent]):
if (RestrictDirectPromptsToPurchase[Player]):
Print("Player is not allowed to receive direct purchase prompts.")
else:
Print("Player is allowed to receive direct purchase prompts.")
Wpływające na rozgrywkę
Jeśli przedmiot, który sprzedajesz, daje graczom znaczącą przewagę na twojej wyspie, musisz ustawić ConsequentialToGameplay na wartość true.
Do przedmiotów wpływających na rozgrywkę zaliczają się wszelkie przedmioty, które po zakupie zapewniają graczom znaczącą przewagę w grze. Ten wpływ może być bezpośredni (np. przedmiot zwiększający tempo postępów, moc lub możliwości gracza w rozgrywce) albo pośredni (np. przedmiot dający dostęp do czegoś, co w znaczący sposób wpływa na to, jak szybko gracz może czynić postępy w grze lub jakie ma szanse na wygraną).
Jeśli istnieje alternatywa dla przedmiotu, który sprzedajesz, dostępna dla wszystkich graczy w tym samym czasie, gdy oferta jest udostępniana, i zapewniająca tę samą korzyść, nie musisz ustawiać ConsequentialToGameplay na wartość true. Jeśli przedmiot używany w rozgrywce ma przypadkowy, ale nieznaczący wpływ na rozgrywkę – jak w przypadku różnych schematów kolorystycznych strojów, które mają nieco inną widoczność w różnych środowiskach, lub różnych emotek dających odmienne animacje ruchu ciała – nie jest on uznawany za wpływający na rozgrywkę.
# The base entitlement you should define for ALL of your entitlements in your experience.
my_island_entitlement := class<abstract><castable>(entitlement){}
CornSeedPacket<public> := module:
Name<public><localizes> : message = "Corn seed pack"
Description<public><localizes> : message = "A pack of corn seeds. Opening a pack yields 10 corn seeds for planting."
ShortDescription<public><localizes> : message = "Contains 10 corn seeds for planting."
cornseedpacket<public> := class<concrete>(my_island_entitlement):
var Name<override>:message = CornSeedPacket.Name