Transações na Ilha permitem a venda de itens, ofertas e ofertas de pacotão na sua ilha com Verse.
Neste guia, você aprenderá a definir seus próprios itens, ofertas e ofertas de pacotão. Com o módulo Loja na API Verse, você gerenciará a venda de itens no jogo.
Itens
Em Verse, os itens são definidos como itens e podem se encaixar em duas categorias: itens consumíveis, que são removidos do inventário da pessoa jogadora ao serem usados, e itens duráveis, que não são removidos do inventário mesmo que continuem a ser usados.
Cada item em Verse tem as seguintes propriedades:
Nome: nome do item, com até 50 caracteres.
Description: descrição longa exibida com o item, com até 500 caracteres.
ShortDescription: descrição curta que resume o item em uma caixa de diálogo menor, de até 100 caracteres.
Icon: imagem do item.
Se o seu item é um item aleatório pago, é necessário incluir na descrição a probabilidade precisa do que pode ser obtido. Consulte mais informações e Itens aleatórios pagos.
Os itens em Verse também podem ter as seguintes propriedades opcionais:
MaxCount: a quantidade máxima que o jogador pode ter do item por vez.
Consumable: se essa opção estiver definida como true, o item poderá ser consumido, diminuindo a quantidade total de usos. Se essa opção for false, o item será um item permanente e não será consumido ao ser usado.
PaidArea: se essa opção estiver definida como true, o item permite entrar em uma área com acesso pago.
PaidRandomItem: se essa opção estiver definida como true, os itens são comprados ou resgatados, e o conteúdo é determinado aleatoriamente.
ConsequentialToGameplay: se esta opção estiver definida como True, o item concede uma vantagem decisiva na sua ilha. Consulte mais informações em Consequente para jogabilidade.
Se você tiver itens ativos que não estiverem em uso e não confirmar as compras no aplicativo no questionário da IARC, sua ilha será reprovada na moderação.
Para contornar esse problema, você pode comentar os seus itens em Verse até que estar com tudo pronto para usá-los em um jogo ativo. Com os itens comentados, você não precisa declarar compras no aplicativo no questionário da IARC.
Como criar um item consumível em Verse
Itens são definidos em Verse como uma derivação da classe-base de item. O trecho de código a seguir demonstra como criar um item consumível. Neste exemplo, você vai criar um item consumível composto de sementes de milho. Um ícone de sementes foi incluso abaixo para você usar.
# 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
Ao criar um item, é preciso incluir um caminho para uma textura de ícone válida, de modo que seu código Verse seja compilado sem erros. O pacote de sementes de milho e os outros ícones incluídos neste guia são um brinde para você!
Verifique se os ícones dos seus itens usam textura baseada em potências de dois para elevar ao máximo a qualidade das imagens na sua vitrine. Para obter mais informações sobre como importar texturas para o UEFN para usar como ícones, consulte Como importar ativos. Consulte Como expor ativos para obter informações sobre como expor ativos, tais como texturas, em Verse.
Como criar itens duráveis em Verse
Os itens duráveis em Verse seguem o mesmo formato dos itens consumíveis, mas com uma diferença importante: Consumível é definido como False em vez de True. Os itens duráveis podem ser comprados apenas uma vez pelos jogadores, que podem ter apenas um item de cada item durável.
Neste exemplo, você criará uma pá como item durável. Após o trecho de código abaixo, foi incluído um ícone para textura de pá.
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
Por padrão, os itens não são definidos como Consumable e têm MaxCount igual a 1. Se o item for uma área paga, um item aleatório pago ou um item que concede uma vantagem decisiva no jogo, os campos deverão ser definidos no código.
Regras de validação de item
Itens válidos em Verse precisam atender às diretrizes abaixo. As compras de itens que não fizerem isso resultarão em falha.
Confira as regras que definem um item válido:
Name deve ter no máximo 50 caracteres.
Description deve ter no máximo 500 caracteres.
ShortDescription deve ter no máximo 100 caracteres.
MaxCount deve ser 1 quando Consumable=false.
MaxCount deve ter o valor máximo de 10.000.000.
Definir MaxCount < 1 não é obrigatório, mas resultará em falha, pois não é possível conceder menos de um único item ao jogador.
Catálogo de Itens
Você pode usar o catálogo de itens para ver todos os itens ofertados para os jogadores.
Confira o relatório que lista todos os seus itens no UEFN ao clicar em Ferramentas > Catálogo de Itens, ou acessar diretamente o catálogo no Portal de Criadores para sua ilha.
Ofertas
Na oferta, os itens ou ativos têm um preço especificado em V-Bucks. Cada oferta tem um nome, descrição e ícone separados das especificações do item. Ofertas são definidas em Verse.
Cada oferta tem as seguintes propriedades:
Name: nome da oferta.
Description: descrição longa exibida juntamente com a oferta.
ShortDescription: descrição curta para resumir a oferta em caixas de diálogo menores.
Icon: imagem da oferta.
EntitlementType: declaração do item incluído na oferta.
Price: preço em V-Bucks. Não pode ser menor que 50 V-Bucks, nem maior que 5.000 V-Bucks. O preço deve ser definido em múltiplos de 50.
Criar uma oferta simples
Este trecho de código define uma oferta simples: as sementes de milho. Você pode reutilizar o ícone de semente de milho do exemplo de item como o ícone desta oferta.
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
O preço em V-Bucks deve ser múltiplo de 50 e ficar entre 50 e 5.000 V-Bucks.
Você precisa garantir que as pessoas jogadoras verão antes da compra as probabilidades numéricas exatas de obter cada item aleatório pago. O não cumprimento dessa determinação será considerado uma violação das Regras para Desenvolvedores do Fortnite, e as devidas sanções serão aplicadas a você e à sua ilha.
Para obter mais informações, consulte Restrições de Transações na Ilha.
Criar e modificar ofertas fixas e alternadas
Você pode fazer ofertas alternadas do mesmo item para oferecer preços especiais para festividades, bônus introdutórios e variações de preço por área. Você também pode usar isso para testar itens ao criar uma oferta idêntica com um ícone diferente para ver qual atrai mais jogadores. Vamos usar este ícone como exemplo.
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
Ofertas de pacotão
Pacotões são definidos em Verse e podem apresentar uma combinação de ofertas diferentes, a mesma oferta acumulada, ou uma combinação de ambas. Assim como em ofertas simples, as ofertas de pacotão têm seu próprio preço, nome e descrição especificados, além de um ícone diferente dos ícones de itens e ofertas. Você também pode aninhar ofertas ao incluir pacotões em uma oferta de pacotão. Um exemplo disso seria um pacotão por tempo limitado que inclui uma pá e um pacotão de sementes de milho. Assim você pode usar pacotões menores para montar pacotões maiores combinando itens.
Os tipos de pacotão padrão são:
Pacotão acumulado: pacotão que contém múltiplas ofertas do mesmo item, geralmente com desconto.
Pacotão multioferta: pacotão que combina ofertas de múltiplos itens, também pode incluir uma combinação de ofertas acumuladas e comuns.
A quantidade de níveis das ofertas aninhadas não pode ultrapassar 5, senão a tentativa de transação fracassará. Tente limitar o aninhamento de ofertas sempre que possível.
Como criar um pacotão acumulado
Este trecho de código define um pacotão acumulado de sementes de milho. O pacotão contém uma matriz de tuplas de ofertas, que contém a oferta definida e um int referente à quantidade de ofertas. Nesse caso, haveria duas ofertas corn_seed_pack no pacotão. Um ícone foi fornecido para este exemplo
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
Como criar pacotões multioferta
É provável que as pessoas jogadoras queiram evitar múltiplas transações, por isso é possível criar um pacotão que inclui mais de uma oferta com itens diferentes. Este trecho de código cria um pacotão multioferta que fornece ao jogador a quantidade máxima de sementes de milho e uma pá.
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
Em Verse, os pacotões não contêm os itens diretamente. Em vez disso, contêm ofertas que incluem definições de itens.
Ofertas criadas dinamicamente
Uma oferta criada dinamicamente é uma oferta ou oferta de pacotão gerada em tempo de execução, em Verse. Casos de uso comuns de ofertas dinâmicas seriam:
Oferta com a quantidade máxima de madeira que o jogador pode guardar para um jogo de criação.
Um pacotão para conceder a quantidade máxima de poções de vida e de mana na entrada de uma masmorra para um jogo de exploração de masmorras.
Para simplificar, vincule o pacotão a algo simples, como um botão ou sinal. No código Verse, o fluxo é dado desta forma: ao interagir > chame BuyOffer.
Este trecho de código mostra como vender um pacotão de sementes de milho até a quantidade máxima que o jogador pode ter. Uma mensagem de erro é exibida se a compra falhar.
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)
Regras de validação de oferta
Para ter validade, a oferta ou o pacotão deve seguir as diretrizes abaixo. As compras que não atenderem aos critérios fracassarão na moderação. Confira as regras que definem a oferta válida:
A quantidade de níveis das ofertas aninhadas não pode ultrapassar 5.
A quantidade total de identificadores de item não pode ultrapassar 100 por cada oferta. Ou seja, a quantidade total de itens distintos vendidos por vez é no máximo 100.
O preço da oferta deve ficar entre 50 e 5.000 V-Bucks e pode ser dado apenas em múltiplos de 50.
O texto padrão
Nameda oferta não pode exceder 50 caracteres.O texto padrão
Descriptionde uma oferta não pode exceder 500 caracteres.O texto padrão para a
ShortDescriptionnão pode ultrapassar 100 caracteres.A oferta precisa ter pelo menos um item.
A oferta não contém uma quantidade do item maior que o
MaxCountdele.A oferta não contém um item durável com
MaxCount> 1.
Você pode optar por impor restrições sobre onde suas ofertas são exibidas e quem pode visualizá-las. Para saber mais, consulte Restrições de Transações na Ilha.
Como criar uma vitrine
Agora que tem os itens, suas ofertas e pacotões prontos, você precisará de um lugar para vender tudo!
A interface de usuário padrão
A interface padrão da loja é aberta com uma lista de todas as ofertas e itens que você adicionou. O primeiro item da lista aparece em destaque e exibe uma visão geral do item em uma janela ao lado da lista.
As vitrines podem ter mais de uma página.
Listas com mais de cinco itens são roláveis.
O fluxo de compra é ativado pelo jogador quando o método BuyOffer for chamado ou a vitrine padrão for usada com o método ShowOffersDialog. Veja abaixo exemplos de alguns dispositivos que podem ser usados para integrar seu fluxo de compra na loja com o desenvolvimento do jogo:
Dispositivo Volume
Dispositivo Temporizador do Scene Graph
PNJs
Dispositivo de Conversa
Uma prática recomendada ao desenvolver a loja é deixar o fluxo de compra a critério do jogador. Não dar possibilidade de escolha e forçar a abertura do fluxo de compra retira a iniciativa do jogador e pode tornar a experiência insatisfatória.
Todas as ofertas apresentam os botões Comprar e Inspecionar, que abrem janelas da loja para comprar um item ou inspecionar o que está incluso na oferta. Apenas pacotões contém um botão Inspecionar Pacotão.
Selecione o botão Fechar para fechar a loja.
Desenvolvedores têm controle total sobre a experiência proporcionada pela vitrine:
Você escolhe quais itens ou propriedades de jogo serão oferecidos ao seu público.
Você pode definir o preço para cada oferta ou oferta de pacotão.
Você pode oferecer sua própria loja ou usar uma interface de loja pré-estabelecida do Fortnite.
Interface da loja
Este trecho de código define um retorno de evento genérico que abre uma interface de loja pré-estabelecida do Fortnite. O retorno de chamada pode variar de uma assinatura, um botão pressionado, um evento de conversa e assim por diante.
OnEvent(Agent:agent):void=
if(Player:= player[Agent]):
spawn{ShowOffersDialog(Player, array{
ExampleOffers.shovel{},
ExampleOffers.cornseedpacket{}
})}
Tratamento das compras
Este trecho de código contém uma compra de oferta genérica. Uma mensagem de erro é exibida se a compra falhar.
TryBuyOffer(Player:player, Offer : offer)<suspends>:void =
Result := BuyOffer(Player, Offer)
if (not Result?):
Print("Failed to buy the {offer.name} offer.")Para ajudar na depuração de compras fracassadas, inclua, na mensagem de erro, uma forma de identificar qual compra falhou. Por exemplo, adicione o nome da oferta na mensagem de erro acima.
Funções adicionais
Itens aleatórios pagos
Há duas maneiras de oferecer itens aleatórios pagos na sua ilha:
Você pode oferecê-las diretamente para compra com V-Bucks.
Você pode oferecê-las indiretamente permitindo que o público jogador adquira itens com V-Bucks, que podem ser trocados ou afetar a probabilidade de receber uma recompensa aleatória.
Ao criar um item que concede uma recompensa aleatória, defina PaidRandomItem como true.
Se oferecer conteúdo que possa ser usado para resgatar um item aleatório, será necessário usar a função RestrictPaidRandomItems para impedir que o item aleatório seja adquirido por pessoas sem acesso.
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.")
Pedidos diretos de compra
Se a sua ilha tiver pedidos diretos de compra, será necessário usar a função RestrictDirectPromptsToPurchase para determinar se alguém está apto a receber um pedido.
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.")
Consequente para jogabilidade
Se o item que você está vendendo concede ao público jogador uma vantagem decisiva na sua ilha, defina ConsequentialToGameplay como True.
Os itens considerados consequentes para a jogabilidade incluem tudo que, depois de adquirido, conceda uma vantagem decisiva no jogo. Isso pode ser feito de forma direta (como um item que aumenta a taxa de progresso, poder ou capacidade da pessoa no jogo) ou indireta (como um item que concede acesso a um item que afeta consideravelmente a rapidez com que a pessoa pode avançar no jogo ou sua probabilidade de vitória).
Se houver uma alternativa ao item que você está vendendo que esteja disponível gratuitamente para todo o público jogador ao mesmo tempo em que a oferta é apresentada e que forneça a mesma vantagem, então você não precisa definir ConsequentialToGameplay como true. Se um item de jogo afetar a jogabilidade de forma acidental e não decisiva, como no caso em que arranjos de cores variados de trajes que alteram a visibilidade em ambientes distintos, ou gestos diferentes que produzem movimentos diferentes no corpo, o item não é considerado consequente.
# 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