UE4 | Peralatan untuk Multiplayer # 4 | Membuat dan menghubungkan wadah


Pada artikel ini, kita akan membahas membuat komponen inventaris dan menghubungkannya dengan Aktor yang diperlukan. Karena komponen ini hanyalah repositori objek dan logika pemuatan / pembongkaran, tidak ada perbedaan dalam menerapkannya pada karakter atau semacam kotak.


Anda dapat membuat komponen menggunakan Cetak Biru dan C ++ . Saya lebih suka metode kedua, karena saya akan secara aktif menggunakan fungsionalitas C ++ .




Pertama-tama, kami membuat struktur sel untuk menyimpan satu item. Saya lebih suka menyimpannya dalam file .h yang terpisah agar dapat terkoneksi secara bebas jika perlu di mana saja:


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; } } }; 

Ya, sel inventaris kami hanya berisi 3 variabel: pengidentifikasi, kuantitas, dan parameter unik. Tidak lebih. Semua data dapat disalin, disimpan, dan diunduh tanpa masalah. Tidak ada tekstur, referensi untuk Aktor , dll. tidak disini. Semua informasi tambahan dapat diunduh dari database pada DataAsset , yang telah kita bicarakan sebelumnya.


Kemungkinan besar, Anda telah melihat struktur StructItemFactors.h lain, yang terhubung di awal. Ini tidak lebih dari repositori properti unik dari objek (dalam bentuk pelampung ), seperti keausan, kerusakan, dll. Yaitu, properti yang hanya melekat pada salinan subjek ini, dan tidak ada yang lain yang sama. Struktur ini sangat sederhana:


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(); } } }; 

Perlu diperhatikan satu fungsi yang sangat menarik dalam struktur di atas, yang dirancang untuk sangat menyederhanakan kehidupan kita:


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

Ini tidak lebih dari operator perbandingan == , yang dapat kita gunakan untuk struktur ini agar tidak mengekstraksi elemen untuk ini setiap kali. Sangat nyaman




Jadi, dengan struktur selesai. Kami melanjutkan ke pembuatan komponen:


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); /*        ,   ... */ }; 

Jika dalam kode di atas aktifkan baris


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

maka Anda dapat menghubungkan komponen ini secara langsung ke Cetak Biru . Saya lebih suka melakukan ini di C ++ . Untuk Karakter, tampilannya seperti ini:


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

Nah, untuk peti seperti ini:


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

Seperti yang Anda lihat, perbedaannya hanya pada nama-nama variabel.




Pada artikel selanjutnya saya akan berbicara tentang fitur replikasi (sederhana di jari ), yang akan membuat inventaris kami benar-benar multipemain.

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


All Articles