Unity: mengenal Objek Skrip

gambar

Dalam tutorial ini, Anda akan belajar cara membuat dan menggunakan Objek Skrip di Unity. Objek Skrip dapat membantu meningkatkan alur kerja Anda, mengurangi jejak memori, dan bahkan memungkinkan Anda untuk membagi arsitektur kode.

Menurut dokumentasi Unity , ScriptableObject adalah kode kelas yang memungkinkan Anda untuk membuat Objek Skrip dalam game untuk menyimpan sejumlah besar data bersama yang tidak tergantung pada instance skrip.

Ada banyak alasan untuk menggunakan Objek Skrip di Unity. Mereka dapat mengurangi jumlah memori yang digunakan untuk setiap cetakan tambahan, karena Objek Skrip pada dasarnya mengikuti pola desain Flyweight .

Keuntungan lain dari Scriptable Objects, yang akan menjadi tema utama tutorial ini, adalah penggunaannya untuk transfer data yang mudah. Kami akan mempertimbangkan properti ini sebagai contoh pembuatan toko pedagang pedang, yang akan menampilkan parameter, harga, dan deskripsi berbagai pedang.

Catatan: tutorial ini mengasumsikan bahwa Anda terbiasa dengan editor Unity. Anda harus memahami cara mengedit kode dalam editor kode dan memiliki pengetahuan dasar C #. Jika Anda perlu meningkatkan keterampilan Unity Anda, lihat tutorial Unity lainnya.

Mulai bekerja


Mari kita mulai dengan mengunduh materi yang kita butuhkan.

Buka zip file yang diunduh ke tempat yang nyaman bagi Anda dan buka proyek Scriptable Object Tutorial-Starter di Unity.

Anda harus melihat folder berikut ini dibuat sebagai bagian dari pengadaan proyek:


  • _Setup : untuk tutorial folder ini tidak diperlukan.
  • Adegan : berisi adegan Pedang Pedagang yang akan kita bahas sepanjang tutorial. Buka adegan ini.
  • Skrip : sejauh ini hanya ada satu skrip, tetapi selama tutorial kita akan membuat skrip baru.
  • Sword Icons : Berisi gambar diam dari masing-masing pedang.
  • Pedang Prefab : Berisi cetakan dari semua pedang di adegan Pedang Pedang.

Membuat Objek Skrip


Untuk memulai, pergi ke adegan Pedang Pedagang . Seharusnya terlihat seperti ini:


Mempersiapkan Objek Skrip


Inilah saatnya untuk membuat Objek Skrip pertama!

Di folder Skrip , buat skrip baru bernama SwordData . Kelas ini akan digunakan sebagai wadah untuk semua data pedang yang ditampilkan di toko pedagang pedang.

Di dalam kelas ini, mulailah dengan mewarisi dari ScriptableObject alih-alih MonoBehaviour :

 public class SwordData : ScriptableObject { } 

Tindakan ini memberi tahu Unity bahwa kami masih ingin menggunakan fitur dan metode Unity, sama seperti MonoBehaviour biasa, tetapi kami tidak perlu lagi melampirkan skrip ini ke GameObject. Sebaliknya, itu akan diproses seperti aset biasa, yang dapat dibuat dengan cara yang sama seperti membuat cetakan, adegan atau bahan.

Isi skrip dengan bidang serial, yang akan berisi semua data yang sesuai dengan informasi yang ditampilkan di Pedang Pedagang Merchant.

 public class SwordData : ScriptableObject { [SerializeField] private string swordName; [SerializeField] private string description; [SerializeField] private Sprite icon; [SerializeField] private int goldCost; [SerializeField] private int attackDamage; } 

  • swordName : string , di mana nama pedang akan disimpan.
  • description : string , di mana deskripsi pedang akan disimpan.
  • ikon : sprite yang akan berisi ikon pedang.
  • goldCost : int untuk menyimpan nilai pedang dalam emas.
  • attackDamage : int untuk menyimpan kerusakan saat menyerang dengan pedang.

Catatan: SerializeField

Di Unity, atribut SerializeField memungkinkan Anda memiliki variabel skrip pribadi yang tersedia di Inspektur. Ini akan memungkinkan Anda untuk menetapkan nilai di editor tanpa memberikan akses ke variabel dari skrip lain.

Setiap pedang akan membutuhkan implementasi unik dari Scriptable Object SwordData . Tetapi sebelum kita dapat membuat implementasi ini, kita perlu menambahkan Objek Scriptable ke Menu Aset.

Tambahkan Objek Skrip kami ke Menu Aset dengan menambahkan atribut berikut ke kelas SwordData :

 [CreateAssetMenu(fileName = "New SwordData", menuName = "Sword Data", order = 51)] public class SwordData : ScriptableObject 

  • fileName : nama default saat membuat aset.
  • menuName : nama aset yang ditampilkan di Menu Aset.
  • order : Penempatan aset dalam Menu Aset. Unity membagi aset menjadi subkelompok dengan faktor 50. Artinya, nilai 51 menempatkan aset baru dalam grup kedua dari Menu Aset.

Jika semuanya dilakukan dengan benar, maka Anda dapat pergi ke Aset >> Buat dan lihat aset Data Pedang baru di menu. Itu harus terletak di grup kedua di bawah aset Folder:


Anda juga dapat mengklik kanan di jendela Proyek dan juga melihat aset Data Pedang baru:


Menambahkan Data


Kami akan mengatur proyek dengan membuat folder yang disebut Objek Scriptable di folder Script, dan di dalam folder ini folder lain yang disebut Data Pedang .

Di dalam folder Data Pedang yang baru dibuat, buat aset Data Pedang pertama kami.

Aset Data Pedang baru harus tetap memiliki nama file nama default yang ditentukan sebelumnya. Pilih satu aset dan duplikatnya enam kali ( Ctrl / Cmd + D ) untuk membuat tujuh aset Data Pedang, satu untuk masing-masing pedang. Sekarang ganti nama setiap aset sesuai dengan cetakan awal:


Klik pada aset Data Pedang pertama di folder Data Pedang dan lihat jendela Inspektur :


Di sini kita melihat aset di mana informasi tentang pedang tertentu akan disimpan. Isi informasi untuk setiap pedang. Cobalah untuk memberi mereka deskripsi unik, nilai emas, dan kerusakan selama serangan. Di bidang Ikon Sprite, gunakan sprite terkait yang berada di folder Sword Ikon :


Selamat! Anda membuat Objek Scriptable dan mengkonfigurasi beberapa aset dengan Objek Scriptable ini.

Menggunakan Objek Skrip


Sekarang kita akan mulai mendapatkan data dari Objek Skrip ini.

Pertama, kita perlu menambahkan beberapa metode pengambil publik sehingga skrip lain dapat mengakses bidang pribadi di dalam Objek Skrip. Buka SwordData.cs dan tambahkan yang berikut di bawah bidang yang ditambahkan sebelumnya:

  public string SwordName { get { return swordName; } } public string Description { get { return description; } } public Sprite Icon { get { return icon; } } public int GoldCost { get { return goldCost; } } public int AttackDamage { get { return attackDamage; } } 

Buka Sword.cs dan tambahkan kode berikut:

  [SerializeField] private SwordData swordData; // 1 private void OnMouseDown() // 2 { Debug.Log(swordData.name); // 3 Debug.Log(swordData.Description); // 3 Debug.Log(swordData.Icon.name); // 3 Debug.Log(swordData.GoldCost); // 3 Debug.Log(swordData.AttackDamage); // 3 } 

Inilah yang kami tambahkan dengan kode ini:

  1. Wadah data untuk data untuk pedang ini.
  2. OnMouseDown adalah fungsi MonoBehaviour internal yang dipanggil saat pengguna menekan tombol kiri mouse.
  3. Contoh cara mendapatkan data dari aset Objek Skrip kami

Kembali ke Unity dan pergi ke jendela Hierarchy . Pilih objek permainan pedang 1_Longswab di prefab pedang. Tambahkan aset Data 1_Longsword yang sesuai ke variabel Data Sword dari skrip Sword.cs di jendela Inspektur:


Klik Play ( Ctrl / Cmd + P ) di editor Unity, dan kemudian klik pedang paling kiri:


Konsol harus menampilkan informasi yang menyerupai data yang ditransfer dari aset Data Pedang.

Objek Skrip memudahkan untuk mengganti data ini. Coba masukkan Objek Skrip Data Pedang yang berbeda ke dalam bidang Data Pedang dari pedang.

Objek Skrip yang Mungkin Terjadi


Jadi, kami membuat Objek Skrip, dan Anda melihat bagaimana Anda dapat mengakses datanya di dalam game. Tapi kita masih perlu mengintegrasikan Data Pedang dengan UI!

Anda dapat menggunakan pola Singleton yang cepat dan kotor untuk ini. Namun, kami sekarang memiliki kemungkinan lain ...

... yaitu, Objek Skrip! Kami akan menggunakannya untuk membuat kode yang bersih dan terbagi rapi.

Di bagian ini, Anda akan belajar cara membuat Acara Game menggunakan kelas UnityEvent .

Acara Game dan Pendengar


Di folder Skrip, buat dua skrip: GameEvent.cs dan GameEventListener.cs . Mereka saling bergantung satu sama lain, jadi untuk menghilangkan kesalahan, Anda harus membuat keduanya.

 using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(fileName = "New Game Event", menuName = "Game Event", order = 52)] // 1 public class GameEvent : ScriptableObject // 2 { private List<GameEventListener> listeners = new List<GameEventListener>(); // 3 public void Raise() // 4 { for (int i = listeners.Count - 1; i >= 0; i--) // 5 { listeners[i].OnEventRaised(); // 6 } } public void RegisterListener(GameEventListener listener) // 7 { listeners.Add(listener); } public void UnregisterListener(GameEventListener listener) // 8 { listeners.Remove(listener); } } 

Inilah yang dilakukan oleh kode di atas:

  1. Menambahkan GameEvent sebagai aset ke Menu Aset.
  2. GameEvent adalah Obyek Skrip, jadi objek itu harus diwarisi dari ScriptableObject.
  3. Daftar GameEventListeners untuk berlangganan GameEvent.
  4. Metode untuk memanggil semua pelanggan GameEvent.
  5. GameEventListener yang ditandatangani terakhir akan menjadi yang pertama dipanggil (last come, first come out).
  6. Panggil masing-masing UnityEvent GameEventListeners.
  7. Metode yang memungkinkan GameEventListeners berlangganan GameEvent ini.
  8. Metode yang memungkinkan GameEventListeners untuk berhenti berlangganan dari GameEvent ini.


 using UnityEngine; using UnityEngine.Events; // 1 public class GameEventListener : MonoBehaviour { [SerializeField] private GameEvent gameEvent; // 2 [SerializeField] private UnityEvent response; // 3 private void OnEnable() // 4 { gameEvent.RegisterListener(this); } private void OnDisable() // 5 { gameEvent.UnregisterListener(this); } public void OnEventRaised() // 6 { response.Invoke(); } } 

Dalam kode yang ditunjukkan di atas, proyek terus berkembang:

  1. Persyaratan untuk menggunakan kelas UnityEvent.
  2. GameEvent tempat GameEventListener ini akan berlangganan.
  3. Respons UnityEvent yang akan dimunculkan ketika acara GameEvent melempar GameEventListener ini.
  4. Mengikat GameEvent ke GameEventListener saat GameObject ini diaktifkan.
  5. Mengikat GameEvent dari GameEventListener saat GameObject ini dinonaktifkan.
  6. Dipanggil ketika GameEvent dihasilkan yang menyebabkan GameEventListener memanggil acara UnityEvent.

Apakah ini sulit? Tidak ada, Anda akan mengetahuinya seiring waktu!

Pelatihan Editor


Kembali ke editor Unity dan buat folder Game Game baru di Scripts >> ScriptableObjects. Kemudian buat tujuh Peristiwa Game dari Menu Aset, seperti yang kami lakukan untuk setiap aset Data Pedang. Tempatkan mereka di folder Event Game baru.


Ganti kode di dalam skrip Sword.cs dengan baris berikut:

  [SerializeField] private GameEvent OnSwordSelected; // 1 private void OnMouseDown() { OnSwordSelected.Raise(); // 2 } 

Kode ini menambahkan dua kemungkinan ke toko pedagang pedang:

  1. Acara Generasi Game ketika memilih pedang.
  2. Generasi acara ketika Anda mengklik pada pedang.

Simpan skripnya. Sekarang, di setiap GameObject Hierarchy of the sword, hubungkan acara OnSwordSelected yang sesuai.


Setiap pedang sekarang memiliki tautan ke acara yang dipicu saat pedang diklik.

Integrasi UI


Sekarang Anda harus membuat UI berfungsi. Tujuan kami adalah untuk menampilkan Data Pedang yang sesuai saat mengklik pada setiap pedang.

Tautan UI


Sebelum memperbarui UI, Anda harus mendapatkan tautan ke setiap elemen UI. Mari kita mulai dengan membuat skrip baru bernama SwordMerchant.cs dan menambahkan kode berikut ke skrip baru ini:

 using UnityEngine; using UnityEngine.UI; public class SwordMerchant : MonoBehaviour { [SerializeField] private Text swordName; // 1 [SerializeField] private Text description; // 2 [SerializeField] private Image icon; // 3 [SerializeField] private Text goldCost; // 4 [SerializeField] private Text attackDamage; // 5 } 

Dengan menggunakan kode ini, kami menambahkan yang berikut:

  1. Referensi ke komponen Teks objek game NameText .
  2. Tautan ke komponen teks dari objek game DescriptionText .
  3. Tautan ke komponen gambar dari objek game Sword_Icon .
  4. Tautan ke komponen teks objek game GoldText .
  5. Tautan ke komponen Teks objek game AttackText .

Objek permainan di atas terletak di SwordMerchantCanvas >> SwordMerchantPanel dari jendela Hierarchy. Tambahkan skrip ke GameObject SwordMerchantCanvas , lalu konfigurasikan semua tautan:


Tanggapan Pendengar dan UI


Semua pedang memiliki acara yang dapat digunakan UI untuk menggunakan skrip GameEventListener . Tambahkan GameEventListener untuk setiap acara OnSwordSelected ke GameObject SwordMerchantCanvas :


Seperti yang Anda lihat, Pendengar Acara Game kami memiliki dua bidang: acara Acara Game yang didengarkannya, dan respons yang dimunculkan ketika Acara Game dihasilkan.

Dalam kasus kami, respons akan diperbarui oleh UI. Tambahkan metode berikut ke skrip SwordMerchant.cs :

  public void UpdateDisplayUI(SwordData swordData) { swordName.text = swordData.SwordName; description.text = swordData.Description; icon.sprite = swordData.Icon; goldCost.text = swordData.GoldCost.ToString(); attackDamage.text = swordData.AttackDamage.ToString(); } 

Metode ini menerima aset Data Pedang, lalu memperbarui setiap bidang UI dengan nilai bidang Data Pedang yang sesuai. Perhatikan bahwa GoldCost dan AttackDamage mengembalikan int , jadi Anda perlu mengubahnya menjadi string untuk teks.

Dengan menggunakan metode baru kami, kami dapat menambahkan respons ke setiap GameEventListener .

Untuk setiap respons yang Anda tambahkan, Anda memerlukan tautan ke objek game SwordMerchantCanvas kami sebagai nilai dari bidang None (Object) . Setelah itu, pilih SwordMerchant.UpdateDisplayUI dari menu drop-down di sebelah kanan daftar drop-down Runtime Only .

Hati-hati dan gunakan aset Data Pedang yang benar untuk setiap acara OnSwordSelected .


Sekarang kita dapat memulai permainan, klik pada pedang dan melihat bahwa UI diperbarui!


Karena kami menggunakan Peristiwa Game, Anda cukup menggunakan SwordMerchantCanvas , dan semuanya akan tetap berfungsi, hanya tanpa UI. Ini berarti bahwa cetakan pedang terpisah dari SwordMerchantCanvas .

Ke mana harus pergi selanjutnya?


Jika Anda melewatkan sesuatu selama cerita, Anda dapat mengunduh proyek yang sudah selesai , yang ada dalam materi tutorial.

Jika Anda ingin melanjutkan, cobalah membuat setiap pedang mereproduksi suaranya sendiri. Coba OnSwordSelected Data Pedang Objek OnSwordSelected dan dengarkan acara yang dipilih OnSwordSelected .

Ingin mempelajari lebih lanjut tentang Persatuan? Lihat seri video Unity kami atau baca tutorial Unity .

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


All Articles