Helper Generik
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 44 dari 64.
Beberapa helper sama untuk setiap tipe: mengambil komponen atau menambahkannya, memilih entri acak dari array. Metode generik menulisnya 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 metode terhadapnya. AddComponent hanya menerima komponen, jadi tanpa batasan tersebut, compiler menolak go.AddComponent<T>(); dengan batasan itu, semua komponen bisa digunakan, baik Rigidbody dari Unity maupun skrip buatanmu sendiri. Batasan itu 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 metode itu tidak pernah menyentuh T: metode ini bisa digunakan untuk warna, string, dan prefab. Kamu jarang menulis tipe saat memanggilnya: dari colors, yang bertipe Color[], compiler mengetahui bahwa T adalah Color. Metode yang menerima IEnumerable<T> alih-alih T[] menerima array dan List, termasuk array yang dikembalikan oleh FindObjectsByType<T>.
Tantangan
SedangTulis satu helper generik untuk peti dan lampu di menara kejut.
- Di
Helpers.cs, tulis class statisHelpersdenganInRange<T>(IEnumerable<T> items, Vector3 center, float range)publik untuk komponen: sebuahList<T>berisi item yang berjarak paling jauhrange. - Di
Pulse, saat tombol Space ditekan, berikan impuls ke atas sebesarliftkepada setiap Rigidbody dalam jangkauan. - Lalu panggil
TurnOn()pada setiap Lamp dalam jangkauan.
Tekan tombol “Main” dan tekan Space: peti yang dekat akan melompat. Lalu tekan tombol “Periksa”.
Coba sendiri
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>: item dalam jangkauan suatu titik
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearestLatihan sendiri: Playground Unity