El dispositivo Transacciones en la isla de Verse contiene una plantilla para transacciones en la isla. Cuenta con todas las implementaciones para los aspectos clave del módulo Marketplace en la API de Verse. Incluye objetos, ofertas, ofertas combinadas y la gestión de compras mediante el uso de la interfaz de usuario predeterminada de la tienda. Utiliza este código como guía para configurar rápidamente tu tienda.
Para acceder al dispositivo:
Ve al explorador de Verse.
Haz clic derecho en el nombre de tu proyecto.
Selecciona Añadir nuevo archivo de Verse al proyecto.
Selecciona Dispositivo Transacciones en la isla.
Creación de objetos
Los objetos se definen en Verse como artículos y se dividen en dos categorías: objetos consumibles, que se eliminan del inventario del jugador cuando se usan, y objetos duraderos, que el jugador puede seguir utilizando sin que se eliminen del inventario.
El módulo EntitlementInfo
Los módulos son unidades atómicas de código que pueden redistribuirse para su uso en múltiples archivos. Los módulos se pueden cambiar con el tiempo sin romper las dependencias en un archivo en el que ya se utiliza el módulo. Puedes separar unidades de código largas o repetitivas, como definiciones de artículos, en un archivo diferente y luego importarlas con la declaración using.
El módulo EntitlementInfo recopila los nombres, las descripciones y las descripciones breves de todos los artículos de la plantilla. Incluye este módulo en cualquier archivo en el que tengas que definir artículos sin necesidad de redefinir repetidamente el nombre y otras variables para el mismo producto, lo que simplifica las modificaciones de la información sobre artículos y reduce la complejidad de la depuración de los mismos.
# Setup your entitlements and offers data, in this case that's your Names, Descriptions & Short Descriptions as well as any other data you want to be constant
EntitlementInfo<public> := module:
Potion<public> := module:
Name<public><localizes>:message = "Potion"
Description<public><localizes>:message = "Adds +10 health when used. Green so you know its healthy!"
Definición de artículos
Todos los artículos de Verse tienen las siguientes propiedades:
Name: el nombre del artículo, con un máximo de 50 caracteres.
Description: la descripción larga que se muestra con el artículo. Tiene un máximo de 500 caracteres.
ShortDescription: una descripción breve que resume el artículo con un máximo de 100 caracteres.
Icon: una imagen del artículo.
Si tu artículo es un objeto aleatorio de pago, debes incluir en la descripción las probabilidades numéricas exactas de lo que el jugador podría recibir. Para obtener más información, consulta
Un artículo de Verse también puede tener las siguientes propiedades opcionales:
MaxCount: el número máximo de un artículo que el jugador puede tener en un momento dado.
Consumable: si este artículo se activa (true), el artículo se puede consumir utilizando la función
ConsumeEntitlement, lo que reduce el número total de artículos consumidos que el usuario tiene en los sistemas de Epic. Si se desactiva (false), el artículo es un objeto permanente y no se consumirá con el uso.PaidArea: si esta propiedad se activa (true), el artículo brindará acceso a un área de pago.
PaidRandomItem: si esta propiedad se activa (true), estos artículos se compran o canjean con contenido adquirido para obtener una recompensa aleatoria.
ConsequentialToGameplay: si se activa, el objeto proporciona a los jugadores una ventaja significativa en tu isla. Consulta Relevante para el juego para obtener más información.
En el fragmento que aparece a continuación, se utiliza el módulo EntitlementInfo definido anteriormente para crear las definiciones de los artículos. Para definir un artículo consumible, Consumable debe estar activado (true).
Antes de definir tus artículos, debes crear una clase base de artículo que se utilizará para los artículos de tu experiencia,
en este caso, feature_example_entitlement.
También debes definir una ruta de archivo a una textura de icono para cada definición de artículo, o tu definición de artículo no superará la validación.
Entitlements<public> := module:
using {EntitlementInfo}
# The base entitlement you should define for ALL your entitlements in your experience
feature_example_entitlement<public> := class<abstract><castable>(entitlement){}
basic_sword<public> := class<concrete>(feature_example_entitlement):
var Name<override>:message = Sword.Name
De forma predeterminada, los objetos no son consumibles (propiedad Consumable desactivada) y tienen un recuento máximo (propiedad MaxCount) de 1. Si el objeto es un área de pago, un elemento aleatorio de pago o proporciona una ventaja significativa que afecta al desarrollo del juego, los campos pertinentes deben estar definidos en el código.
Ofertas de artículos
Una oferta especifica un precio en paVos por un objeto o recurso. Cada oferta tiene su propio nombre, descripción e icono, y son independientes de las especificaciones del artículo. Una oferta se define en Verse.
Para vender el artículo, debes tener una oferta correspondiente para dicho artículo.
Cada oferta tiene las siguientes propiedades:
Name: el nombre de la oferta.
Description: la descripción larga que aparece junto a la oferta.
ShortDescription: una descripción breve para resumir la oferta en cuadros de diálogo más pequeños.
Icon: una imagen de la oferta.
EntitlementType: una declaración del artículo incluido en la oferta.
Price: un precio en paVos. No debe ser inferior a 50 paVos ni superior a 5000 paVos. El precio debe fijarse en múltiplos de 50.
Este fragmento muestra cómo definir ofertas de artículos, utilizando el módulo EntitlementInfo existente para obtener información básica sobre las ofertas de artículos. También tienes que definir un icono, el EntitlementType,
que define el artículo al que se aplica la oferta, y el precio en paVos. También puedes definir una edad mínima de compra opcional para una oferta, en función de un valor fijo, un código de país o restringir el acceso a la oferta por plataforma o una combinación de estos factores. En el siguiente fragmento de código se muestran algunos ejemplos de esto.
Los códigos de subdivisión no son compatibles actualmente, pero estarán disponibles en una versión futura.
ExampleOffers<public> := module:
using {EntitlementInfo}
basic_sword<public> := class(entitlement_offer):
var Name<override>:message = EntitlementInfo.Sword.Name
var Description<override>:message = EntitlementInfo.Sword.Description
var ShortDescription<override>:message = EntitlementInfo.Sword.ShortDescription
El precio en paVos debe ser un múltiplo de 50 y estar comprendido entre 50 y 5000 paVos.
En el caso de los objetos aleatorios de pago, debes asegurarte de que los jugadores puedan ver las probabilidades numéricas exactas de obtener cada objeto aleatorio de pago en los detalles de la oferta. El incumplimiento de esta norma se considerará una infracción de las Reglas para desarrolladores de Fortnite y os someterá a ti y a tu isla a las sanciones correspondientes.
Para obtener más información, consulta Restricciones de las transacciones en la isla.
Ofertas combinadas
Las ofertas combinadas se definen en Verse y pueden contener una combinación de diferentes ofertas, conjuntos de la misma oferta o una mezcla de ambos. Al igual que las ofertas simples, las ofertas combinadas especifican su propio precio, nombre y descripción, y tienen un icono que las distingue de los artículos y ofertas. También puedes anidar ofertas incluyendo lotes dentro de una oferta combinada. Un ejemplo sería un lote por tiempo limitado que incluya una pala y un paquete de semillas de maíz. Esto te permite utilizar lotes más pequeños como bloques de construcción para lotes combinados más grandes.
Los tipos de lotes estándar son:
Lote acumulado: un lote que contiene varias ofertas del mismo artículo, normalmente a un precio reducido.
Lote con varias ofertas: un lote que combina ofertas para varios artículos y que también puede incluir una mezcla de ofertas acumuladas y ofertas normales.
Un lote contiene una matriz de tuplas de ofertas, que incluye la oferta definida y un int que indica el número de ofertas.
La profundidad de las ofertas anidadas no puede superar 5 o la transacción fallará. Intenta limitar el anidamiento de ofertas siempre que sea posible.
El siguiente fragmento muestra la construcción de un paquete de pociones. La información de la oferta se define en el módulo EntitlementInfo e incluye la variable PotionCount.
ExampleOffers<public> := module:
using {EntitlementInfo}
<# --- other offer definitions above --- #>
potion_pack<public> := class(bundle_offer) :
var Name<override>:message = EntitlementInfo.PotionPack.Name
Restricción de compra
Puedes restringir las compras de artículos para permitir la creación de artículos navideños limitados, ofertas promocionales o de temporada, y crear contenido específico para cada región.
GetMinPurchaseAge
Utiliza GetMinPurchaseAge para definir una restricción de compra personalizada para una entitlement_offer específica. Se llama automáticamente como parte de la validación de la compra, por lo que solo requiere definición. Puedes definir un valor entero específico, un código de país o una plataforma.
Los códigos de subdivisión no son compatibles actualmente, pero estarán disponibles en una versión futura.
A continuación se muestran algunos ejemplos de la función GetMinPurchaseAge.
# Optional overrideable function you can use to inform Epic systems what the minimum age a player needs to be to purchase this offer
GetMinPurchaseAge<override>(CountryCode:string, SubdivisionCode:string, PlatformFamily:string)<decides><computes>:int =
# A Hypothetical example where you only want to sell swords to people who don't live in Antarctica
CountryCode <> CountryCodes.Antarctica
return 0
Validación de artículos de los jugadores
La validación de los artículos de los jugadores es un paso necesario para garantizar que los artículos adquiridos por estos se conserven entre sesiones. Si no se validan correctamente, pueden surgir problemas como la duplicación o la pérdida de artículos, por ejemplo.
Validación de compras anteriores
El siguiente fragmento muestra una validación de artículos sencilla que se realiza cuando un jugador se une a una sesión. Primero, comprueba si el jugador entrante está suscrito al evento OnPurchasesChanged. A continuación, suscribe al jugador entrante si aún no está suscrito. Por último, se recupera un registro de todos los artículos adquiridos por ese jugador mediante ValidatePreviousPurchases.
Es recomendable realizar también comprobaciones de validación de los artículos del jugador en esta fase, para asegurarte de que los datos guardados en la experiencia coinciden con lo que la API de Marketplace indica que poseen y con el inventario del jugador.
OnPlayerJoin(InPlayer:player):void =
Subscription := GetEntitlementsChangedEvent(InPlayer, Entitlements.feature_example_entitlement).Subscribe(OnPurchasesChanged)
if (set EntitlementChangeSubscription[InPlayer] = option{Subscription}):
Print("Adding entitlement Change Subscription player subscription")
# On players joining you are likely going to want to run some validation checks to make sure that any data you save
Cómo gestionar las compras
Las dos funciones principales que se utilizan para gestionar las compras de artículos son BuyOffer y OnPurchasesChanged. La primera función se encarga de la lógica para presentar al jugador una oferta y validar la compra, mientras que la segunda función gestiona la lógica para una transacción o un reembolso exitosos. Los siguientes fragmentos muestran estas dos funciones.
# Base Implementation of how to present players with an offer to purchase in your experience
TryBuyOffer(Player:player, Offer:entitlement_offer)<suspends>:void =
Result := BuyOffer(Player, Offer)
if (Result?):
# do nothing it should respond in the purchase subscription, see OnPurchasesChanged for details
Gestión de consumibles
Para consumir un artículo consumible, debes utilizar la función ConsumeEntitlement de la API de Marketplace de Verse. Una vez que el consumo se haya realizado correctamente, debes gestionar la lógica del efecto generado tras el consumo. El Count del artículo que posee el jugador se reducirá según el Count consumido en la función.
El siguiente fragmento muestra cómo un jugador determinado consume un artículo específico.
# Base Implementation of how to flag a consumable in your experience as being consumed
TryConsumeEntitlement(Player:player, Entitlement:concrete_subtype(entitlement), NumberConsuming:int)<suspends>:void =
Result := ConsumeEntitlement(Player, Entitlement, ?Count := NumberConsuming)
if (Result?):
Print("Successfully consumed entitlement!")
No puedes consumir un artículo duradero. Si intentas hacerlo, ConsumeEntitlement fallará.
Concesión de artículos
A diferencia de la compra de un artículo que requiere paVos, también puedes conceder artículos a los jugadores con el método GrantEntitlement.
Entre los posibles casos de uso para conceder un artículo se incluyen objetos promocionales, muestras gratuitas de consumibles y la restauración de objetos perdidos debido a errores o fallos.
Este fragmento muestra un método para conceder artículos a tus jugadores.
# Base Implementation of how to give players a entitlement in your experience without them purchasing it
TryGrantEntitlement(Player:player, Entitlement:concrete_subtype(entitlement), NumberToGrant:int)<suspends>:void =
Result := GrantEntitlement(Player, Entitlement, ?Count := NumberToGrant)
if (Result?):
Print("Successfully granted a player your entitlement!")
Si intentas otorgar más del recuento máximo de un artículo o más de uno de un artículo duradero, la concesión fallará.
Cómo mostrar tus ofertas de artículos a los jugadores
El Marketplace module proporciona una interfaz de usuario de escaparate integrada para usar en tus islas con la función ShowOffersDialog. El siguiente fragmento muestra un método para mostrar una tienda con ofertas a un jugador específico.
# Base Implementation of how to show an array of offers to the player that are available for purchase
ShowArrayOfOffers(Player:player)<suspends>:void =
ShowOffersDialog(Player, array{ExampleOffers.basic_sword{}, ExampleOffers.potion{}, ExampleOffers.potion_pack{}, ExampleOffers.potion_thanksgiving{}, ExampleOffers.potion_gib{}})Código completo
using { /Fortnite.com/Devices }
using { /Fortnite.com/Marketplace }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Assets }
using { /Verse.org/Simulation }