UE4 | рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг # 4 | рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдирд╛ рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛

рд▓реЗрдЦреЛрдВ рдХреА рд╕реВрдЪреА

UE4 | рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдЗрдиреНрд╡реЗрдВрдЯрд░реА # 1 | DataAsset рдкрд░ рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕
UE4 | рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ # 2 рдХреЗ рд▓рд┐рдП рдЗрдиреНрд╡реЗрдВрдЯрд░реА | рдмреНрд▓реВрдкреНрд░рд┐рдВрдЯ рдХреЛ C ++ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
UE4 | рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдЗрдиреНрд╡реЗрдВрдЯрд░реА # 3 | рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рд╕рдВрд░рдЪрдирд╛
UE4 | рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг # 4 | рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдирд╛ рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛
UE4 | рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг # 5 | рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмреАрдЪ рд╕реВрдЪрдирд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрдХ рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рдШрдЯрдХ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЕрднрд┐рдиреЗрддрд╛ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ рдпрд╣ рдШрдЯрдХ рдХреЗрд╡рд▓ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рднрдВрдбрд╛рд░ рд╣реИ рдФрд░ рдЙрдирдХреЗ рд▓реЛрдбрд┐рдВрдЧ / рдЕрдирд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рддрд░реНрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХрд┐рд╕реА рд╡рд░реНрдг рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреЙрдХреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред


рдЖрдк рдмреНрд▓реВрдкреНрд░рд┐рдВрдЯ рдФрд░ C ++ рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдШрдЯрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ C ++ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред




рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдЖрдЗрдЯрдо рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдЬрд╣рд╛рдБ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдЬрд╣рд╛рдБ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ ред H рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдБ:


StructContainerStack.h
/// Copyright 2018 Dreampax Games, Inc. All Rights Reserved. /* Struct for Container Stack. This file is used as #include */ #pragma once /* Includes from Engine */ #include "GameplayTagContainer.h" /* Includes from Dreampax */ #include "Data/StructItemFactors.h" #include "StructContainerStack.generated.h" /* Declaration for contaiter stack structure. BlueprintType required to use in BP */ USTRUCT(BlueprintType) struct FContainerStack { GENERATED_USTRUCT_BODY() /* Gameplay tag to store the name */ UPROPERTY(EditAnywhere) FGameplayTag ItemNameTag; UPROPERTY(EditAnywhere) int ItemAmount; /* Specific factors such as durability, damage etc. */ UPROPERTY(EditAnywhere) TArray <FItemFactor> ItemFactors; FContainerStack() { Clear(); } void Clear() { ItemNameTag.FromExportString("NAME_None"); ItemAmount = 0; ItemFactors.Empty(); } FORCEINLINE FGameplayTag GetItemNameTag() const { return ItemNameTag; } void SetItemNameTag(FGameplayTag const & ItemNameTagNew) { if (ItemNameTagNew.IsValid()) { ItemNameTag = ItemNameTagNew; } else { Clear(); } } FORCEINLINE int GetItemAmount() const { return ItemAmount; } void SetItemAmount(int const & ItemAmountNew) { if (ItemAmountNew > 0) { ItemAmount = ItemAmountNew; } else { Clear(); } } FORCEINLINE TArray<FItemFactor> * GetItemFactors() { return &ItemFactors; } void SetItemFactors(TArray<FItemFactor> const & ItemFactorsNew) { if (ItemFactorsNew.Num() > 0) { ItemFactors = ItemFactorsNew; } } }; 

рд╣рд╛рдВ, рд╣рдорд╛рд░реА рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рд╕реЗрд▓ рдореЗрдВ рдХреЗрд╡рд▓ 3 рдЪрд░ рд╣реИрдВ: рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдорд╛рддреНрд░рд╛ рдФрд░ рдЕрджреНрд╡рд┐рддреАрдп рдкреИрд░рд╛рдореАрдЯрд░ред рдФрд░ рдХреБрдЫ рдирд╣реАрдВред рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХреЙрдкреА, рд╕рд╣реЗрдЬрд╛ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдИ рдмрдирд╛рд╡рдЯ, рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдЖрджрд┐ред рдпрд╣рд╛рдБ рдирд╣реАрдВред рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛рдПрд╕реЗрдЯ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрд╛рдд рдХреА рдереАред


рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдФрд░ StructItemFactors.h рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрд╛ рд╣реИ, рдЬреЛ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдпрд╣ рд╡рд╕реНрддреБ рдХреЗ рдХрд┐рд╕реА рднреА рдЕрджреНрд╡рд┐рддреАрдп рдЧреБрдгреЛрдВ ( рдлреНрд▓реЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ ), рдЬреИрд╕реЗ рдХрд┐ рдкрд╣рдирдиреЗ, рдХреНрд╖рддрд┐, рдЖрджрд┐ рдХреЗ рднрдВрдбрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдпрд╣реА рд╣реИ, рдРрд╕реЗ рдЧреБрдг рдЬреЛ рдХреЗрд╡рд▓ рд╡рд┐рд╖рдп рдХреА рдЗрд╕ рдкреНрд░рддрд┐ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИрдВ, рдФрд░ рдХреЛрдИ рдЕрдиреНрдп рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:


StructItemFactors.h
 /// Copyright 2018 Dreampax Games, Inc. All Rights Reserved. /* Struct for Factors. This file is used as #include */ #pragma once /* Includes from Engine */ #include "GameplayTagContainer.h" /* Includes from Dreampax */ // no includes #include "StructItemFactors.generated.h" USTRUCT(BlueprintType) struct FItemFactor { GENERATED_USTRUCT_BODY() /* Name of Item Attribute Factor */ UPROPERTY(EditDefaultsOnly, Category = "ItemsDatabase") FGameplayTag ItemFactorTag; /* Factor for the Item Attribute */ UPROPERTY(EditDefaultsOnly, Category = "ItemsDatabase") float ItemFactor; /* for this type to be comparable */ friend bool operator==(const FItemFactor & Lhs, const FItemFactor & Rhs) { return Lhs.ItemFactorTag == Rhs.ItemFactorTag && Lhs.ItemFactor == Rhs.ItemFactor; } FItemFactor() { Clear(); } void Clear() { ItemFactorTag.EmptyTag; ItemFactor = 0; } FORCEINLINE FGameplayTag GetItemFactorTag() { return ItemFactorTag; } void SetItemFactorTag(FGameplayTag const &ItemFactorTagNew) { if (ItemFactorTagNew.IsValid()) { ItemFactorTag = ItemFactorTagNew; } else { Clear(); } } FORCEINLINE float GetItemFactor() { return ItemFactor; } void SetItemFactor(float const & ItemFactorNew) { if (ItemFactorNew > 0.0f) { ItemFactor = ItemFactorNew; } else { Clear(); } } }; 

рдпрд╣ рдКрдкрд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдп рдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 friend bool operator==(const FItemFactor & Lhs, const FItemFactor & Rhs) { return Lhs.ItemFactorTag == Rhs.ItemFactorTag && Lhs.ItemFactor == Rhs.ItemFactor; } 

рдпрд╣ рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░ == рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рддрддреНрд╡ рди рдирд┐рдХрд╛рд▓реЗрдВред рдмрд╣реБрдд рд╕рд╣рдЬ рд╣реИред




рддреЛ, рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред рд╣рдо рдШрдЯрдХ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ:


DreampaxContainerComponent.h
 /// Copyright 2018 Dreampax Games, Inc. All Rights Reserved. #pragma once /* Includes from Engine */ #include "Components/ActorComponent.h" #include "GameplayTagContainer.h" /* Includes from Dreampax */ #include "Data/StructItemFactors.h" #include "Data/StructContainerStack.h" #include "DreampaxContainerComponent.generated.h" //UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) // currently not required UCLASS() class DREAMPAX_API UDreampaxContainerComponent : public UActorComponent { GENERATED_BODY() private: UPROPERTY(Transient, Replicated, EditAnywhere, Category = "Container") TArray<FContainerStack> ContentOfContainer; public: /* Sets default values for this component's properties */ UDreampaxContainerComponent(const FObjectInitializer & ObjectInitializer); /*        ,   ... */ }; 

рдпрджрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рд▓рд╛рдЗрди рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВ


 UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) 

рддрдм рдЖрдк рдЗрд╕ рдШрдЯрдХ рдХреЛ рд╕реАрдзреЗ рдмреНрд▓реВрдкреНрд░рд┐рдВрдЯ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕реЗ C ++ рдореЗрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЪрд░рд┐рддреНрд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 Inventory = CreateDefaultSubobject<UDreampaxContainerComponent>(TEXT("Inventory")); 

рдЦреИрд░, рдЗрд╕ рддрд░рд╣ рдПрдХ рдЫрд╛рддреА рдХреЗ рд▓рд┐рдП:


 ADreampaxActorContainer::ADreampaxActorContainer(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { Container = CreateDefaultSubobject<UDreampaxContainerComponent>(TEXT("Container")); } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЪрд░ рдХреЗ рдирд╛рдореЛрдВ рдореЗрдВ рд╣реИред




рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдкреНрд░рддрд┐рдХреГрддрд┐ ( рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ рд╕рд░рд▓) рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рдЬреЛ рд╣рдорд╛рд░реА рд╕реВрдЪреА рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рдмрдирд╛ рджреЗрдЧрд╛ред

Source: https://habr.com/ru/post/hi420115/


All Articles