Esta funcionalidade está em estado experimental, então você pode testá-la, fornecer feedback e ver o que estamos planejando. No momento, não é possível publicar um projeto que utilize Inventário e Itens Personalizados.
Lembre-se de que não garantimos a retrocompatibilidade de ativos criado em um estágio experimental, as APIs para essas funcionalidades podem sofrer alterações e podemos remover completamente funcionalidades experimentais ou uma funcionalidade específica a nosso critério. Confira a lista de problemas conhecidos antes de começar a trabalhar com a funcionalidade.
Este tutorial mostra como criar um componente interativo de "coleta de itens" personalizado que permite ao público jogador coletar itens personalizados e adicionar o item coletado ao seu inventário.
Antes de começar
Você deve estar familiarizado com o UEFN, o Scene Graph e o código Verse para concluir este tutorial com êxito.
Configure seu projeto
Siga estas etapas para configurar seu projeto e habilitar Itens e Inventários Personalizados.
Abra o UEFN e crie um projeto a partir de qualquer modelo de ilha. Em Modelos de Ilhas, você pode usar o projeto em branco se quiser garantir uma área plana para trabalhar. Dê um nome ao seu novo projeto e clique em "Criar" para abri-lo no editor.
Na barra de ferramentas, clique em Projeto e selecione Configurações de Projeto.
Role para baixo até a seção Acesso Experimental e marque a caixa Itens e inventário personalizados.
Escreva o código Verse
O componente interactable_component faz parte do Scene Graph e é usado para lidar com interação geral. Por padrão, o público jogador pode pressionar um botão para interagir com uma entidade que tenha o componente. Siga estes passos para personalizar esse componente.
Um interactable_component requer que uma entidade tenha um mesh_component com o qual possa interagir. É necessário que o objeto tenha colisão que possa ser verificada quando algo estiver tentando interagir com a entidade.
Selecione a entidade à qual adicionará o componente interativo personalizado. No painel Detalhes, clique em "+Componente" e selecione "Novo componente Verse". A janela "Criar componente Verse" é aberta.
Você também pode criar um componente Verse adicionando um novo arquivo Verse usando o Explorador Verse.
Em Escolher um modelo, selecione Componente do Scene Graph.
Na parte inferior, no campo Nome do componente, digite "item_interactable_component". Depois, clique em "Criar".
Na barra de menus, clique em Verse > Explorador Verse. Localize seu novo componente Verse, clique com o botão direito nele e selecione Abrir no Visual Studio Code.
No novo arquivo Verse, exclua o código existente, já que você escreverá tudo neste tutorial. Primeiro, adicione os módulos necessários. Você pode copiá-las e colá-las do trecho de código abaixo.
Verseusing { /Verse.org/Simulation } using { /Verse.org/SceneGraph } using { /UnrealEngine.com/Itemization }Em seguida, adicione uma função auxiliar para obter o inventário-raiz de uma pessoa participante especificada.
VerseGetInventoryRoot(Agent:agent)<decides><transacts>:inventory_component = Inventory := (for (I : Agent.FindDescendantComponents(inventory_component)) { I })[0]Antes de criar o novo componente personalizado, é necessário declarar uma nova constante de tipo de mensagem fora do escopo da nossa classe. Essa mensagem é o valor padrão se a função não conseguir obter um nome do
item_details_componentde um item. Geralmente, esse tipo de mensagem é escrita na parte inferior do arquivo Verse.VerseDefaultInteractionMessage<localizes>:message = "Interact"Defina um novo Scene Graph que herde de
interactable_component. Este é oitem_interactable_component.Verseitem_interactable_component := class(interactable_component) :Adicione uma variável
cancelávelopcional. Esse componente personalizado precisará ser registrado em um evento para saber quando um alguém no jogo interage com o item. Essa variável salva uma referência a esse registro e a cancelará, se necessário.Versevar SucceededEventHandler : ?cancelable = falseAgora, substitua a função
OnAddedToScenepara que ela defina a variável opcional quando o pai da entidade que possui esse componente for alterado (como quando ela for posicionada no mundo). DefinaSucceededEventHandlerpara chamar função de registro emSucceededEvent. Isso também definirá a funçãoOnSucceededEventpara que seja acionada quando ocorrer a interação.VerseOnAddedToScene<override>():void = if(not SucceededEventHandler?): set SucceededEventHandler = option{SucceededEvent.Subscribe(OnSucceededEvent)}O registro de
SucceededEventprecisa ser limpo assim que um item for coletado, ou poderá interferir em outro código quando o item estiver em um inventário. Você pode fazer isso substituindo a funçãoOnRemovingFromScene. Essa função é ativada quando o pai da entidade de item muda. Use-a aqui paracancel()(cancelar) o registro do evento. Se for bem-sucedida, também invalidará oSucceededEventHandler.VerseOnRemovingFromScene<override>():void = if(SucceededEventHandler?.Cancel()): set SucceededEventHandler = falseNo passo 10, a função
OnSucceededEventestá registrada emSucceededEvent, mas ainda não existe no código. Então, é preciso escrever uma nova função com a mesma assinatura. No passo 6, você usou a função auxiliarGetInventoryRoot[]para recuperar o inventário-raiz da pessoa interagente. Agora, chame a funçãoAddItemDistribute()para fornecer a entidade que controla esse componente.VerseOnSucceededEvent(Agent:agent):void = if(PickupInventory := GetInventoryRoot[Agent]): if(PickupInventory.AddItemDistribute(Entity).GetSuccess[]):O último trecho de código necessário para esse componente é a substituição da função
InteractMessage[]. Ela retorna a mensagem exibida na tela quando alguém está olhando para o item, antes de coletá-lo. Assim, será verificada a entidade controladora do componente para ver se também tem umitem_details_component. Se for o caso, o nome do item é recuperado. Caso contrário, se a entidade não tivesse umitem_details_componentou tivesse sido removida por algum motivo, será usada aDefaultInteractionMessageque declaramos anteriormente.VerseInteractMessage<override>(Agent:agent)<reads><decides>:message = if(Details := Entity.GetComponent[item_details_component]): Details.Name else: DefaultInteractionMessage
Como configurar a estrutura pré-fabricada
Agora que você escreveu seu item_interactable_component, pode criar um item de exemplo para demonstrá-lo. Siga estes passos para criar uma estrutura pré-fabricada do Scene Graph e anexar o novo componente.
Clique com o botão direito no Navegador de Conteúdo e, no menu de contexto, selecione Definição de estrutura pré-fabricada de entidade. Nomeie a nova estrutura pré-fabricada como Item_Cube.
Abra a nova estrutura pré-fabricada e adicione os seguintes componentes clicando em +Componente no painel Detalhes.
item_componentitem_details_component; preencha os campos neste componente:Nome
Descrição
Descrição Curta
mesh_component: selecione a primitiva de cubo ou outro cubo.item_interactable_component
O vídeo abaixo mostra o item_interactable_component em ação. Quando interagimos com a estrutura pré-fabricada Item_Cube criada, o item é adicionado ao inventário de jogo.
Segue o código completo deste tutorial.
using { /Verse.org/Simulation }
using { /Verse.org/SceneGraph }
using { /UnrealEngine.com/Itemization }
# This function returns the first subentity with an inventory_component. Use this to get the root inventory of an agent.
GetInventoryRoot(Agent:agent)<decides><transacts>:inventory_component =
Inventory := (for (I : Agent.FindDescendantComponents(inventory_component)) { I })[0]