Dalam artikel ini saya akan mencoba untuk mengungkap makna dan metodologi pembuatan DataAsset , sebagai repositori untuk berbagai jenis data, dan dalam kasus kami ini adalah perpustakaan untuk Aktor dan parameternya.
Sedikit pengantar untuk dilewatiUntuk membuat keputusan untuk membuat game sekitar 2 tahun yang lalu, itu membantu saya bahwa saya secara tidak sengaja menemukan informasi tentang Unreal Engine 4 dan membaca betapa keren dan sederhana itu. Faktanya, sangat sulit bagi seseorang yang tidak tahu cara menulis kode (bahasa pemrograman tidak masalah dalam konteks ini) untuk membuat sesuatu yang lebih rumit daripada modifikasi kecil dari satu set benda kerja standar dari mesin. Karenanya, keinginan awal untuk membuat game super-mega, dengan tumbuhnya pengetahuan tentang realitas proyek ini, lambat laun tumbuh menjadi hobi. Mengangkat semua lapisan pengembangan game, mulai dari pemodelan 3D dan animasi, dan hingga penulisan kode, bagi satu orang tampaknya merupakan usaha yang layak. Namun, ini adalah latihan yang baik untuk otak.
Mengapa Anda memutuskan untuk menulis sesuatu? .. Mungkin karena itu. bahwa buku pedoman yang disajikan dapat memberikan pengetahuan yang sangat dangkal (dan ada sebagian besar darinya), atau bahkan untuk yang sangat profesional dan hanya berisi instruksi umum.
Hampir selalu lebih baik untuk memulai dari awal. Saya tidak bisa mengatakan bahwa saya selalu melakukan ini, tetapi saya akan mencoba menyatakan secara konsisten.
Tentu saja, yang terbaik adalah memulai dengan struktur, tetapi, sayangnya, memiliki kotak tertutup dengan alat, sangat sulit untuk memahami apa sebenarnya yang bisa dibangun dengan bantuan mereka. Jadi mari kita buka kotak ini dan melihat apa yang ada di dalamnya.
Pertanyaan pertama untuk dijawab. Mengapa DataAsset ?
- Sangat sering dalam artikel dan tutorial Anda bisa melihat penggunaan DataTable . Kenapa ini buruk? Jika Anda menyimpan alamat untuk Cetak Biru tertentu, maka saat mengganti nama atau memindahkannya ke folder lain, Anda akan dipaksa untuk mengubah alamat ini secara manual. Setuju - tidak nyaman? Dengan DataAsset , ini tidak akan terjadi. Semua komunikasi akan diperbarui secara otomatis. Jika Anda benar-benar yakin dengan struktur proyek Anda selama bertahun-tahun yang akan datang, maka, tentu saja, Anda dapat menggunakan tabel.
- Keuntungan tak terbantahkan kedua adalah kemampuan untuk menyimpan tipe data yang kompleks, seperti struktur ( Struct ).
Sekarang sedikit tentang kerugian relatif. Bahkan, saya hanya melihat satu. Ini adalah kebutuhan untuk menulis kode C ++ .
Jika Anda sudah mengerti bahwa tanpa bekerja dengan kode Anda tidak akan melakukan apa pun epik , maka ini bukan kelemahan, tetapi fitur.
Perlu dicatat bahwa ada satu solusi - menggunakan Actor sebagai repositori. Tetapi aplikasi seperti itu kelihatannya merupakan alasan terakhir untuk tidak ingin belajar C ++, dan memiliki potensi untuk berakhir di jalan buntu di masa depan.
Jika Anda yakin bahwa semua yang Anda butuhkan untuk proyek Anda dapat dilakukan di Cetak Biru , gunakan tabel.
Sekarang Anda sudah percaya bahwa DataAsset baik, pertimbangkan bagaimana Anda bisa membuatnya untuk proyek Anda.
Bagi mereka yang masih sepenuhnya 'tidak di dalam tangki'Ada deskripsi yang sangat rinci tentang langkah-langkah dan dengan gambar di forum berbahasa Rusia yang didedikasikan untuk UE4 . Hanya google "UE4 DataAsset" untuk . Dia menguasai dasar-dasar manual ini sekitar setahun yang lalu.
Pertama-tama, buat Kelas C ++ , seperti Child dari UDataAsset .
(Semua kode di bawah ini diambil dari proyek saya yang belum lahir. Cukup ganti nama namanya sesuai keinginan.)
Sekarang, berdasarkan kelas ini, Anda dapat dengan aman membuat Cetak Biru , tetapi masih terlalu dini untuk melakukannya ... sejauh ini hanya tiruan. Meskipun, perhatikan bahwa inklusi untuk tekstur dan nama telah dibuat.
Mulai saat ini, Anda mulai membuat struktur repositori Anda. Ini akan diulang berkali-kali, jadi saya sangat menyarankan untuk tidak segera mengisi penyimpanan Anda. Tiga hingga lima elemen, dalam item inventaris kasus kami, cukup untuk pengujian. Terkadang, setelah dikompilasi, Cetak Biru Anda bisa kosong, yang sangat tidak menyenangkan jika Anda telah mengisi selusin atau dua posisi.
Anda dapat membuat struktur langsung di file header, karena dalam hal ini, tidak mungkin diterapkan di tempat lain. Biasanya, saya lebih suka menjadikannya sebagai file header terpisah "SrtuctName.h" , dan hubungkan jika diperlukan sesuai kebutuhan.
Dalam kasus saya, sepertinya ini USTRUCT(BlueprintType) struct FItemsDatabase { GENERATED_USTRUCT_BODY() UPROPERTY(EditDefaultsOnly, Category = "ItemsDatabase") TMap<FGameplayTag, float> ItemData; UPROPERTY(EditDefaultsOnly, Category = "ItemsDatabase") FGameplayTagContainer ItemPropertyTags; UPROPERTY(EditDefaultsOnly, Category = "ItemsDatabase") UTexture2D* IconTexture; UPROPERTY(EditDefaultsOnly, Category = "ItemsDatabase") TSubclassOf<class ADreampaxOutfitActor> ItemOutfitClass; UPROPERTY(EditDefaultsOnly, Category = "ItemsDatabase") TSubclassOf<class ADreampaxPickupActor> ItemPickupClass;
Jadilah akun dengan TMap . Tidak direplikasi! Dalam hal ini, itu tidak masalah.
Harap dicatat bahwa saya tidak menggunakan FName . Menurut tren modern, penggunaan FGameplayTag dianggap lebih benar, karena secara signifikan mengurangi risiko kesalahan dan memiliki beberapa keunggulan yang akan berguna nanti.
DataTable untuk GameplayTag diekspor dari Excel Ini juga praktik yang baik untuk mendefinisikan fungsi untuk memanggil variabel dalam struktur, seperti GetSomething () . Rupanya, saya masih harus bekerja di asuhan saya, karena itu ada di database ini, saya belum melakukan panggilan seperti itu.
Berikut ini cara melakukannya dengan menggunakan database lain sebagai contoh. USTRUCT(BlueprintType) struct FBlocksDatabase { GENERATED_USTRUCT_BODY() UPROPERTY(EditDefaultsOnly, Category = "BlocksDatabase") TSubclassOf<class ADreampaxBuildingBlock> BuildingBlockClass; UPROPERTY(EditDefaultsOnly, Category = "BlocksDatabase") FVector DefaultSize; UPROPERTY(EditDefaultsOnly, Category = "BlocksDatabase") FVector SizeLimits; UPROPERTY(EditDefaultsOnly, Category = "BlocksDatabase") TArray<class UMaterialInterface *> BlockMaterials; FORCEINLINE TSubclassOf<class ADreampaxBuildingBlock> * GetBuildingBlockClass() { return &BuildingBlockClass; } FORCEINLINE FVector GetDefaultSize() { return DefaultSize; } FORCEINLINE FVector GetSizeLimits() { return SizeLimits; } FORCEINLINE TArray<class UMaterialInterface *> GetBlockMaterials() { return BlockMaterials; } };
Dan poin terpenting adalah deklarasi basis data:
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "ItemsDatabase") TMap<FGameplayTag, FItemsDatabase> ItemsDataBase;
Sekarang Anda sudah dapat membuat Cetak Biru kami dan mengisinya.
Tetapi sebelum itu, kami akan menulis beberapa fungsi panggilan lagi untuk dapat menerima data dari database.
DreampaxItemsDataAsset.pp Dari multiplayer masih belum ada. Tetapi ini adalah langkah pertama yang telah diambil ke arah yang benar.
Pada artikel selanjutnya saya akan berbicara tentang metode menghubungkan DataAsset (ya, dan cetak biru apa pun) untuk membaca data dalam C ++, dan menunjukkan mana yang paling benar.
Jika Anda memiliki pertanyaan atau saran untuk mengungkapkan aspek apa pun secara lebih rinci, silakan tulis di komentar.