Dalam artikel sebelumnya, saya berbicara tentang cara membuat DataAsset , dan mengapa itu sangat bagus dan nyaman. Di sini kita akan melihat cara mengakses DataAsset , lebih tepatnya data yang ditugaskan padanya, dari Blueprint dan C ++ .
Sepanjang jalan, kami akan menjawab pertanyaan tentang mengakses Cetak Biru apa pun dari C ++ .
Dengan interaksi Blueprints , semuanya sangat transparan.
Karena kami telah menutup akses langsung ke basis data kami, kami tidak dapat mengaksesnya dari Blueprint . Perhatikan dilindungi: dalam kode di bawah ini.
protected: UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "ItemsDatabase") TMap<FGameplayTag, FItemsDatabase> ItemsDataBase;
Yaitu repositori kami hanya akan terlihat di kelas yang diwarisi, dan ini bagus, karena kami memiliki fungsi tertulis untuk memanggil data dengan aman.
UFUNCTION(BlueprintCallable, Category = "ItemDatabase") FORCEINLINE UTexture2D * GetItemIconTexture(const FGameplayTag & ItemNameTag) const;
BlueprintCallable hanya berarti bahwa fungsi ini dapat digunakan dalam Blueprint . Jika Anda membaca artikel sebelumnya , Anda mungkin memperhatikan bahwa tidak ada fungsi lain memanggil atribut ini. Ini dilakukan hanya karena data yang mereka panggil saat ini tidak diperlukan dalam Cetak Biru . Jika seseorang tidak perlu mengetahui sesuatu, kami tidak terburu-buru melaporkannya.
Langkah selanjutnya adalah membuat variabel dalam tipe Blueprint dari database yang kami buat (dalam kasus saya, itu adalah BP_DreampaxItemsDataAsset ).
Setelah itu, kita dengan mudah mengekstraksi tekstur yang ditetapkan.
Sekarang pertimbangkan cara mengakses informasi dalam C ++ .
Kami tidak bisa hanya merujuk ke kelas DreampaxItemsDataAsset , karena tidak mengandung informasi apa pun. Kita perlu mendapatkan akses ke BP_DreampaxItemsDataAsset .
Ada dua metode utama untuk sampai ke Cetak Biru .
Pertama, pertimbangkan metode koneksi yang tidak nyaman menggunakan kruk ConstructorHelpers. Dalam hal ini, akses ke tekstur.
ASHUD::ASHUD(const class FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { static ConstructorHelpers::FObjectFinder<UTexture2D> HUDCenterDotObj(TEXT("/Game/UI/HUD/T_CenterDot_M.T_CenterDot_M")); CenterDotIcon = UCanvas::MakeIcon(HUDCenterDotObj.Object); }
Contoh ini diambil dari proyek EpicSurvivalGameSeries yang luar biasa , sempurna untuk mempelajari Multiplayer dalam C ++ . Penulis menetapkan tujuan untuk menunjukkan sebanyak mungkin metode dan teknik pemrograman game dalam C ++ .
Mengapa metode ini tidak nyaman? Masalah yang sama dengan DataTable - jika Anda mengubah nama atau lokasi Blueprint , file tidak akan ditemukan.
Yang paling disukai adalah metode di mana kita mendeklarasikan variabel dalam file header untuk tugas selanjutnya yang sudah ada dalam Cetak Biru yang diwarisi. Untuk contoh di atas, mungkin terlihat seperti ini:
UPROPERTY(EditDefaultsOnly, Category = "AimPointer") FCanvasIcon CenterDotIcon;
Sekarang, mengetahui cara mengakses Cetak Biru apa pun, kami dapat dengan mudah menghubungkan basis data kami.
UCLASS() class ADreampaxGameMode : public AGameMode { GENERATED_BODY() public: ADreampaxGameMode(const FObjectInitializer & ObjectInitializer);
Penyimpangan kecil untuk non-pro tentang mendeklarasikan variabelSebagai orang yang hampir tidak terbiasa dengan C ++ , saya memecahkan banyak salinan, mencoba mencari cara untuk mendeklarasikan variabel khusus dengan benar.
Jika tujuannya adalah untuk mendeklarasikan variabel kelas yang kami buat, seperti
UDreampaxItemsDataAsset * DreampaxItemsDataAsset;
Saya pribadi tidak mengerti untuk beberapa saat kapan harus menggunakan kelas , dan kapan tidak.
Semuanya ternyata sangat sederhana.
- Jika Anda tidak mengatur kelas , maka Anda harus memasukkan #include "Data / DreampaxItemsDataAsset.h" , yang berisi deklarasi kelas ini.
- Jika Anda mengatur kelas , #include "Data / DreampaxItemsDataAsset.h" sudah bisa dilakukan di .cpp .
- Dan satu lagi pilihan paragraf sebelumnya, jika Anda perlu mendeklarasikan banyak variabel dari kelas ini sekaligus. Segera setelah semua #sertakan, pra-deklarasikan kelas kelas kami UDreampaxItemsDataAsset; , dan kemudian mendeklarasikan variabel tanpa awalan kelas .
Yang mana dari metode ini yang benar - saya tidak bisa mengatakannya. Jika seseorang menjelaskan, saya akan berterima kasih.
Kami membuat variabel dalam ADreampaxGameMode kelas C ++ , karena hanya dapat dilihat oleh server, dan segala sesuatu yang terhubung dengan objek spawn harus melalui server saja. Kelas ini adalah induk untuk BP_DreampaxGameMode , tempat kami mencolokkan BP_DreampaxItemsDataAsset kami.
Koneksi BP_DreampaxItemsDataAsset Sekarang semua kekuatan C ++ dapat digunakan untuk bekerja dengan data dari basis data kami.
Pada artikel berikutnya (akhirnya!) Kita akan berbicara tentang membuat inventaris dan mencari tahu mengapa kita tidak bisa melakukannya tanpa DataAsset yang sudah dibuat.
Jika Anda memiliki pertanyaan atau saran untuk mengungkapkan aspek apa pun secara lebih rinci, silakan tulis di komentar.