Helper Generik
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 35 dari 50.
Beberapa helper sama untuk setiap tipe: mengambil component atau menambahkannya, memilih entri acak dari array. Generic method menuliskannya sekali, dengan tipe sebagai parameter T yang diisi oleh setiap pemanggilan:
public static class Helpers
{
public static T GetOrAdd<T>(this GameObject go) where T : Component
{
if (!go.TryGetComponent(out T found)) found = go.AddComponent<T>();
return found;
}
public static T RandomItem<T>(T[] items)
{
return items[Random.Range(0, items.Length)];
}
}Rigidbody body = crate.GetOrAdd<Rigidbody>();
Color paint = Helpers.RandomItem(colors);
GameObject enemy = Helpers.RandomItem(enemyPrefabs);where T : Component adalah jaminan tentang T, dan menentukan apa yang boleh dilakukan method terhadapnya. AddComponent hanya menerima component, jadi tanpa batasan tersebut, compiler menolak go.AddComponent<T>(); dengan batasan itu, semua component bisa digunakan, baik Rigidbody milik Unity maupun skrip buatanmu sendiri. Batasan tersebut juga memberimu akses ke setiap anggota Component pada T, seperti .transform dan .gameObject. Crate yang sudah memiliki Rigidbody akan mendapatkan Rigidbody itu kembali, dan tidak ada yang ditambahkan.
RandomItem tidak memiliki batasan karena tidak pernah mengakses T: method ini bekerja untuk warna, string, dan prefab. Kamu jarang menuliskan tipe saat memanggilnya: dari colors, sebuah Color[], compiler mengetahui bahwa T adalah Color. Method yang menerima IEnumerable<T> alih-alih T[] menerima array maupun list, termasuk array yang dikembalikan oleh FindObjectsByType<T>.
Tantangan
SedangSebuah menara kejut berdiri di halaman. Saat Space ditekan, menara itu mengirimkan denyut: peti dalam jarak 4 darinya terlempar ke atas, dan lampu dalam jarak 4 menyala. Lamp.cs sudah siap, dengan TurnOn(). Tulis satu helper yang menemukan keduanya:
- Di
Helpers.cs, tulis class statisHelpersdengan method generikInRange<T>(IEnumerable<T> items, Vector3 center, float range)untuk tipe component apa pun. Method ini mengembalikanList<T>yang berisi item dengan posisi berjarak paling jauhrangedaricenter. - Di
Pulse.cs, saat Space ditekan: setiap Rigidbody di scene dalam jarakrangedari menara mendapat impuls ke atas sebesarlift, dan setiap Lamp dalam jarakrangedinyalakan. Gunakan InRange untuk keduanya, pada array yang diberikan olehFindObjectsByType.
Tekan Play, tekan Space, lalu Check.
Coba sendiri
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>: item dalam jangkauan suatu titik
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja SamaRingkasan: Turret Modular5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaGelombang sebagai DataUlasan: database Item8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearest