Über Käufe auf Inseln und mithilfe von Verse kannst du Gegenstände, Angebote und Paketangebote auf deiner Insel vermarkten.
In dieser Anleitung erfährst du, wie du deine eigenen Gegenstände, Angebote und Paketangebote erstellst. Mithilfe des Marketplace-Moduls in der Verse-API kannst du dann den Verkauf von Gegenständen im Spiel verwalten.
Gegenstände
Gegenstände werden in Verse als Berechtigungen definiert und fallen in zwei Kategorien: Verbrauchsgegenstände, die bei Nutzung aus dem Spielerinventar entfernt werden, und dauerhafte Gegenstände, die der Spieler weiterhin verwenden kann, ohne dass sie aus dem Inventar entfernt werden.
Jede Verse-Berechtigung hat die folgenden Eigenschaften:
Name: Der Name der Berechtigung kann aus bis zu 50 Zeichen bestehen.
Description: Die lange Beschreibung, die mit der Berechtigung angezeigt wird und bis zu 500 Zeichen umfasst.
ShortDescription: Eine kurze Beschreibung, die die Berechtigung in einem kleineren Dialogfeld zusammenfasst und bis zu 100 Zeichen umfassen kann.
Icon: Ein Bild der Berechtigung.
Wenn es sich bei deinem Produkt um einen bezahlten zufälligen Gegenstand handelt, musst du die genaue prozentuale Wahrscheinlichkeit, mit der der Spieler einen bestimmten Gegenstand erhalten kann, in der Beschreibung angeben. Weitere Informationen findest du unter Bezahlte zufällige Gegenstände.
Eine Verse-Berechtigung kann außerdem die folgenden optionalen Eigenschaften haben:
MaxCount: Die maximale Anzahl dieser Berechtigung, die der Spieler zu einem beliebigen Zeitpunkt besitzen kann.
Consumable: Ist hier True festgelegt, kann die Berechtigung verbraucht werden, was die Gesamtanzahl an Nutzungen verringert. Bei False ist die Berechtigung ein dauerhafter Gegenstand und wird bei Nutzung nicht verbraucht.
PaidArea: Ist hier True festgelegt, bietet die Berechtigung Zugang zu einem Bereich hinter einer Bezahlschranke.
PaidRandomItem: Ist hier True festgelegt, werden diese Berechtigungen gekauft oder über Inhalte eingelöst, um eine zufällige Belohnung zu erhalten.
ConsequentialToGameplay: Wenn dies auf True gesetzt ist, bringt der Gegenstand einen bedeutenden Vorteil für deine Insel. Siehe Auswirkungen auf das Gameplay für weitere Details.
Wenn du aktive Inhalte hast, die nicht genutzt werden, und du In-App-Käufe im IARC-Fragebogen nicht bestätigt hast, wird deine Insel bei der Prüfung durchfallen.
Um dies zu vermeiden, kannst du deine Inhalte in Verse als Kommentare markieren, bis du bereit bist, sie in einem fertigen Spiel zu verwenden. Solange die Inhalte als Kommentare enthalten sind, musst du im IARC-Fragebogen nicht angeben, dass In-App-Käufe zum Einsatz kommen.
Erstellen einer Verbrauchsgegenstand-Berechtigung in Verse
Berechtigungen werden in Verse definiert, abgeleitet von der Berechtigungs-Basis-Klasse. Das folgende Snippet zeigt die Erstellung eines Verbrauchsgegenstands. In diesem Beispiel erstellst du Maissamen als Verbrauchsgegenstand. Unten findest du ein Symbol der Samen, das du benutzen kannst.
# 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
Wenn du eine Berechtigung erstellst, musst du einen Pfad zu einer gültigen Symboltextur angeben, damit dein Verse-Code erfolgreich kompilieren kann. Das Maissamen-Paket sowie die anderen in dieser Anleitung gezeigten Symbole erhältst du als Geschenk!
Stelle sicher, dass deine Berechtigungssymbole eine quadratische Zweierpotenz-Textur verwenden, um die beste Bildqualität in deinem Shop zu gewährleisten. Wie du Texturen zur Nutzung als Symbole in UEFN importierst, erfährst du unter Importieren von Assets. Wie du Assets wie beispielsweise Texturen in Verse freigibst, erfährst du unter Freigabe von Assets.
Erstellen dauerhafter Berechtigungen in Verse
Dauerhafte Berechtigungen in Verse folgen dem gleichen Format wie Verbrauchsgegenstand-Berechtigungen, jedoch mit einem entscheidenden Unterschied –Consumable ist auf False statt auf True gesetzt. Dauerhafte Berechtigungen können von Spielern nur ein einziges Mal gekauft werden, und jeder Spieler kann nur eine Einheit einer bestimmten dauerhaften Berechtigung besitzen.
In diesem Beispiel erstellst du eine Schaufel als dauerhafte Berechtigung. Unter dem folgenden Snippet findest du ein Symbol für die Schaufeltextur.
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
Standardmäßig sind Gegenstände keine Verbrauchsgegenstände und haben die MaxCount von 1. Wenn es sich bei dem Gegenstand um einen bezahlten Bereich, einen bezahlten zufälligen Gegenstand oder um einen bedeutenden Vorteil für das Gameplay handelt, musst du die relevanten Felder in deinem Code definieren.
Berechtigungsvalidierungsregeln
Eine gültige Berechtigung in Verse muss die nachfolgenden Richtlinien einhalten. Käufe von Berechtigungen, die diese Anforderungen nicht erfüllen, werden fehlschlagen.
Die Regeln, die eine gültige Berechtigung definieren, sind:
Name hat ein Zeichenlimit von 50.
Beschreibung hat ein Zeichenlimit von 500.
Kurze Beschreibung hat ein Zeichenlimit von 100.
Max. Anzahl muss 1 sein, wenn Verbrauchsprodukt=Nein.
Max. Anzahl hat einen maximalen Wert von 10.000.000.
Die Einstellung Max. Anzahl < 1 wird nicht erzwungen, wird aber fehlschlagen, da du Spielern nicht weniger als einen Gegenstand verkaufen kannst.
Der Berechtigungskatalog
Du kannst den Berechtigungskatalog verwenden, um dir alle Berechtigungen anzusehen, die du Spielern anbietest.
Du kannst dir einen Bericht ansehen, der deine Berechtigungen in UEFN auflistet, indem du auf Werkzeuge > Berechtigungskatalog klickst oder den Katalog direkt über das Creator-Portal deiner Insel aufrufst.
Angebote
Ein Angebot legt einen Preis in V-Bucks für einen Gegenstand oder ein Asset fest. Jedes Angebot hat seinen eigenen Namen, seine eigene Beschreibung und sein eigenes Symbol, unabhängig von den Berechtigungsspezifikationen. Angebote werden in Verse definiert.
Jedes Angebot hat die folgenden Eigenschaften:
Name: Der Name des Angebots.
Beschreibung (Description): Die lange Beschreibung, die zusammen mit dem Angebot angezeigt wird.
Kurze Beschreibung (ShortDescription): Eine kurze Beschreibung, mit der du das Angebot in einem kleineren Dialogfeld zusammenfassen kannst.
Symbol (Icon): Ein Bild des Angebots.
EntitlementType: Eine Erklärung der Berechtigung, die im Angebot enthalten ist.
Preis (Price): Ein Preis in V-Bucks. Der Preis darf niemals niedriger als 50 und niemals größer als 5.000 V-Bucks sein. Der Preis muss ein Mehrfaches von 50 sein.
Ein einfaches Angebot erstellen
Dieses Snippet definiert ein grundlegendes Angebot für ein einfaches Angebot – das Maissamen-Paket. Du kannst das Maissamen-Symbol aus dem Berechtigungsbeispiel für dieses Angebot wiederverwenden.
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
Der Preis in V-Bucks muss zwischen 50 und 5.000 V-Bucks liegen und ein Mehrfaches von 50 sein.
Du musst sicherstellen, dass Spieler vor dem Kauf die genauen prozentualen Wahrscheinlichkeiten für den Erhalt der jeweiligen Gegenstände sehen können. Solltest du das nicht tun, wird dies als Verstoß gegen die Regeln für Fortnite-Entwickler betrachtet, wodurch dir und deiner Insel entsprechende Strafen auferlegt werden können.
Weitere Informationen findest du hier unter Einschränkungen bei Käufen auf Inseln.
Feste und abwechselnde Angebote erstellen und anpassen
Du kannst alternative Angebote für denselben Berechtigungsstatus erstellen, um Spezialtarife für Festtage und Einführungsboni zu bieten und den Preis pro Bereich zu variieren. Du kannst es auch für die Berechtigungstests nutzen, indem du ein identisches Angebot mit einem anderen Symbol erstellst, um zu sehen, was den Spielern mehr gefällt. Nutzen wir dieses Symbol als ein Beispiel.
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
Paketangebote
Pakete werden in Verse definiert und können aus verschiedenen Angeboten, aus einem Stapel eines einzelnen Angebots oder aus einer Kombination aus beidem bestehen. Wie die einfachen Angebote haben auch die Paketangebote einen eigenen Preis, einen eigenen Namen, eine eigene Beschreibung und ein Symbol, das sich von den Berechtigungen und Angeboten unterscheidet. Du kannst Angebote auch verschachteln, indem du Pakete in ein Paketangebot einbindest. Ein Beispiel wäre ein zeitlich begrenztes Paket, das aus einer Schaufel und einem Paket aus Maissamen-Paketen besteht. Dies ermöglicht es dir, kleinere Pakete als Bausteine für größere, kombinierte Pakete zu verwenden.
Die Standard-Paketarten sind die Folgenden:
Stapelpaket: Ein Paket, das mehrere Angebote derselben Berechtigung enthält, üblicherweise zu einem rabattierten Preis angeboten.
Multi-Angebotspaket: Ein Paket, das Angebote für mehrere Leistungen kombiniert. Dies kann auch eine Mischung aus Stapelangeboten und regulären Angeboten enthalten.
Die Tiefe von verschachtelten Angeboten darf 5 nicht überschreiten, ansonsten schlägt der versuchte Kauf fehl. Versuche, die Verschachtelung von Angeboten so gut wie möglich einzuschränken.
Ein Stapelpaket erstellen
Dieses Snippet definiert ein Stapelpaket aus Maissamen. Ein Paket beinhaltet ein Tupel-Array mit Angeboten. Dieses Array beinhaltet das definierte Angebot und eine Int, die die Anzahl der Angebote angibt. In diesem Fall wären zwei corn_seed_pack-Angebote in diesem Paket. Für dieses Beispiel steht wieder ein Symbol bereit.
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
Ein Multi-Angebotspaket erstellen
Spieler möchten möglicherweise mehrere Transaktionen vermeiden, daher kannst du ein Paket erstellen, das mehrere Angebote mit unterschiedlichen Berechtigungen enthält. Dieses Snippet erstellt ein Multi-Angebotspaket, das Spieler mit der maximalen Anzahl an Maissamen-Paketen und einer Schaufel versorgt.
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
In Verse sind Berechtigungen nicht direkt in Paketen enthalten. Stattdessen bestehen sie aus Angeboten, die wiederum Berechtigungsdefinitionen enthalten.
Dynamisch erstellte Angebote
Ein dynamisch erstelltes Angebot ist ein Angebot oder Paket, das während der Laufzeit in Verse generiert wurde. Nachfolgend siehst du häufige Anwendungsfälle für dynamisch erstellte Angebote.
Bei einem Herstellungsspiel: Ein Angebot mit der maximalen Anzahl an Holz, die Spieler tragen können.
Bei einem Dungeon Crawler: Ein Paket, das Spieler am Eingang zu einem Dungeon mit der maximalen Anzahl an Konditions- und Mannatränken ausstattet.
Der Einfachheit halber solltest du sie mit etwas Einfachem wie einer Schaltfläche oder einem Knopf verbinden. In Verse-Code würde dies dem Folgenden entsprechen: On Interaction > call BuyOffer.
Dieses Snippet zeigt einen Weg, über den ein Paket aus Maissamen-Paketen bis zur maximalen Anzahl, die ein Spieler ausrüsten kann, verkauft werden kann. Sollte der Kauf fehlschlagen, wird eine Fehlermeldung angezeigt.
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)
Validierungsregeln für Angebote
Ein gültiges Angebot oder Paketangebot muss die nachfolgenden Richtlinien einhalten. Angebote, die sie nicht einhalten, werden die Überprüfung nicht bestehen. Hier sind die Regeln für ein gültiges Angebot:
Die Tiefe von verschachtelten Angeboten darf 5 nicht überschreiten.
Die Gesamtzahl der Berechtigungskennungen darf 100 pro Angebot nicht überschreiten. Dies bedeutet, dass die Gesamtanzahl der unterschiedlichen Berechtigungen, die gleichzeitig verkauft werden, maximal 100 beträgt.
Der Preis des Angebots muss zwischen 50 und 5.000 V-Bucks liegen und ein Mehrfaches von 50 sein.
Der Standardtext für den
Nameneines Angebots darf 50 Zeichen nicht überschreiten.Der Standardtext für die
Beschreibungeines Angebots darf 500 Zeichen nicht überschreiten.Der Standardtext für die
Kurzbeschreibungeines Angebots darf 100 Zeichen nicht überschreiten.Ein Angebot muss mindestens 1 Berechtigung beinhalten.
Ein Angebot darf keine Stückzahl einer Berechtigung beinhalten, die größer ist als
MaxCountder Berechtigung.Ein Angebot enthält keine dauerhafte Berechtigung mit einem
MaxCount> 1.
Du kannst Einschränkungen dazu festlegen, wo deine Angebote angezeigt werden und wer sie sehen kann. Weitere Informationen findest du unter Einschränkungen bei Käufen auf Inseln.
Einen Shop erstellen
Da du nun deine Berechtigungen und die dazugehörigen Angebote und Pakete eingerichtet hast, brauchst du noch einen Ort, an dem du sie verkaufen kannst!
Die Standard-Benutzeroberfläche
Die Standard-Benutzeroberfläche des Shops öffnet sich mit einer Liste aller Berechtigungen und Angebote, die du hinzugefügt hast. Die erste Berechtigung in der Liste wird hervorgehoben und bietet eine Übersicht über die Berechtigung in einem Fenster neben der Liste.
Shops können mehrere Seiten haben.
Listen, die mehr als fünf Einträge umfassen, können gescrollt werden.
Ein Spieler kann den Kaufprozess auslösen, indem er die Methode BuyOffer aufruft oder den standardmäßigen Shop über die Methode ShowOffersDialog nutzt. Nachfolgend siehst du ein paar Beispiele für Geräte, mit denen du den Kaufprozess deines Shops in dein Spieldesign einbinden kannst:
Bereichsgerät
Szenendiagramm-Timer-Gerät
NPCs
Konversationsgerät
Ein Shop wird üblicherweise so entworfen, dass der Spieler sich dafür entscheiden kann, einen Kaufprozess zu öffnen. Wenn Spielern diese Wahlmöglichkeit genommen und ihnen der Kaufprozess aufgezwungen wird, fehlt ihnen die Entscheidungsfreiheit und sie könnten unzufrieden werden.
Alle Angebote verfügen über die Schaltflächen Kaufen und Ansehen, die Marketplace-Fenster öffnen, mit denen man entweder einen Gegenstand kaufen kann oder sich ansehen kann, was ein Angebot umfasst. Nur bei Paketen gibt es die Schaltfläche Paket ansehen.
Wenn du die Schaltfläche Schließen auswählst, wird der Marketplace geschlossen.
Das Shop-Erlebnis wird vollständig vom Entwickler gesteuert:
Du entscheidest, welche Gegenstände oder Gameplay-Eigenschaften du deinen Spielern anbieten möchtest.
Du legst den Preis für jedes Angebot oder Paketangebot fest.
Du kannst deine eigene Shop-Benutzeroberfläche präsentieren oder die vorgefertigte Fortnite-Shop-Benutzeroberfläche nutzen.
Die Benutzeroberfläche des Shops
Dieser Codeschnippsel definiert ein generisches Event-Callback, das die vorgefertigte Shop-Benutzeroberfläche in Fortnite öffnet. Der Callback kann von einem Abonnement, einem Knopfdruck, einem Unterhaltungsevent usw. kommen.
OnEvent(Agent:agent):void=
if(Player:= player[Agent]):
spawn{ShowOffersDialog(Player, array{
ExampleOffers.shovel{},
ExampleOffers.cornseedpacket{}
})}
Käufe abwickeln
Das Snippet beinhaltet einen Kauf eines generischen Angebots. Sollte der Kauf fehlschlagen, wird eine Fehlermeldung angezeigt.
TryBuyOffer(Player:player, Offer : offer)<suspends>:void =
Result := BuyOffer(Player, Offer)
if (not Result?):
Print("Failed to buy the {offer.name} offer.")Um das Debuggen von fehlgeschlagenen Käufen zu erleichtern, sollte eine Möglichkeit zur Identifizierung des fehlgeschlagenen Kaufs in der Fehlermeldung enthalten sein, beispielsweise durch Angabe des Angebotsnamens in der obigen Fehlermeldung.
Zusätzliche Funktionen
Bezahlte zufällige Gegenstände
Du kannst bezahlte zufällige Gegenstände auf deiner Insel auf zwei unterschiedliche Arten anbieten:
Du kannst sie direkt zum Kauf mit V-Bucks anbieten.
Du kannst sie indirekt anbieten, indem du den Spielern erlaubst, Inhalte mit V-Bucks zu kaufen, die dann für eine zufällige Belohnung eingelöst werden können – oder die die Wahrscheinlichkeit für den Erhalt einer solchen Belohnung beeinflussen.
Wenn du einen Gegenstand erstellst, der eine zufällige Belohnung gewährt, musst du PaidRandomItem auf True setzen.
Wenn du Inhalte anbietest, über die eine zufällige Belohnung eingelöst werden kann, musst du die Funktion RestrictPaidRandomItems verwenden, um Spieler, die kein Zugriffsrecht haben, am Erhalt der zufälligen Belohnung zu hindern.
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.")
Direkte Kaufaufforderungen
Sollte deine Insel direkte Kaufaufforderungen enthalten, musst du die Funktion RestrictDirectPromptsToPurchase nutzen, um zu bestimmen, ob ein Spieler zum Erhalt der Aufforderung berechtigt ist.
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.")
Auswirkungen auf das Gameplay
Wenn der von dir verkaufte Gegenstand den Spielern einen bedeutenden Vorteil auf deiner Insel verschafft, musst du ConsequentialToGameplay auf true setzen.
Gegenstände, die Auswirkungen auf das Gameplay haben, umfassen alle Gegenstände, die den Spielern, wenn sie gekauft würden, einen bedeutenden Vorteil im Spiel verschaffen würden. Dies kann direkt sein (z. B. ein Gegenstand, der den Spielfortschritt, die Stärke oder die Fähigkeiten des Spielers erhöht) oder indirekt (z. B. ein Gegenstand, der Zugang zu einem anderen Gegenstand gewährt, der einen wesentlichen Einfluss darauf hat, wie schnell der Spieler im Spiel vorankommt oder wie hoch seine Siegchancen sind).
Wenn es eine Alternative zu dem verkauften Gegenstand gibt, die allen Spielern zur gleichen Zeit, zu der das Angebot präsentiert wird, frei zur Verfügung steht und die den gleichen Vorteil bietet, dann musst du ConsequentialToGameplay nicht auf True setzen. Wenn ein Gameplay-Gegenstand einen zufälligen, aber unbedeutenden Einfluss auf das Gameplay hat, wie zum Beispiel unterschiedliche Outfit-Farbschemata, die in verschiedenen Umgebungen leicht unterschiedlich sichtbar sind, oder verschiedene Emotes, die unterschiedliche Körperbewegungen auslösen, wird das nicht als bedeutend angesehen.
# 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