Neste artigo, discutiremos a criação de um componente de inventário e a conexão com o ator necessário. Como esse componente é simplesmente um repositório de objetos e a lógica de seu carregamento / descarregamento, não há diferença em aplicá-lo a um caractere ou algum tipo de caixa.
Você pode criar um componente usando o Blueprint e o C ++ . Eu prefiro o segundo método, pois vou usar ativamente a funcionalidade C ++ .
Primeiro, criamos uma estrutura de célula para armazenar um item. Prefiro armazená-lo em um arquivo .h separado para conectar-se livremente, quando necessário, onde necessário:
Sim, nossa célula de inventário contém apenas três variáveis: identificador, quantidade e parâmetros exclusivos. Nada mais. Todos os dados podem ser copiados, salvos e baixados sem problemas. Sem texturas, referências a atores etc. aqui não. Todas as informações adicionais podem ser baixadas do banco de dados no DataAsset , sobre o qual falamos anteriormente.
Provavelmente, você já notou outra estrutura StructItemFactors.h , conectada no início. Isso nada mais é do que um repositório de propriedades exclusivas do objeto (na forma de um flutuador ), como desgaste, dano, etc. Ou seja, propriedades que são inerentes apenas a esta cópia do assunto e nenhuma outra é a mesma. Essa estrutura é muito simples:
Vale a pena notar uma função muito interessante na estrutura acima, projetada para simplificar bastante nossas vidas:
friend bool operator==(const FItemFactor & Lhs, const FItemFactor & Rhs) { return Lhs.ItemFactorTag == Rhs.ItemFactorTag && Lhs.ItemFactor == Rhs.ItemFactor; }
Isso nada mais é do que um operador de comparação == , que podemos usar para essa estrutura para não extrair elementos para isso toda vez. Muito confortável
Então, com as estruturas prontas. Prosseguimos com a criação do componente:
DreampaxContainerComponent.h Se no código acima, ative a linha
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
então você pode conectar esse componente diretamente ao Blueprint . Eu prefiro fazer isso em C ++ . Para Personagem, fica assim:
Inventory = CreateDefaultSubobject<UDreampaxContainerComponent>(TEXT("Inventory"));
Bem, para um baú como este:
ADreampaxActorContainer::ADreampaxActorContainer(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { Container = CreateDefaultSubobject<UDreampaxContainerComponent>(TEXT("Container")); }
Como você pode ver, a diferença está apenas nos nomes das variáveis.
No próximo artigo, falarei sobre os recursos de replicação (simples nos dedos ), que tornarão nosso inventário verdadeiramente multijogador.