Menu
CoddyTech

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>.

challenge icon

Tantangan

Sedang

Sebuah 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 statis Helpers dengan method generik InRange<T>(IEnumerable<T> items, Vector3 center, float range) untuk tipe component apa pun. Method ini mengembalikan List<T> yang berisi item dengan posisi berjarak paling jauh range dari center.
  • Di Pulse.cs, saat Space ditekan: setiap Rigidbody di scene dalam jarak range dari menara mendapat impuls ke atas sebesar lift, dan setiap Lamp dalam jarak range dinyalakan. Gunakan InRange untuk keduanya, pada array yang diberikan oleh FindObjectsByType.

Tekan Play, tekan Space, lalu Check.

Coba sendiri

using System.Collections.Generic;
using UnityEngine;

// Helpers.InRange<T>: item dalam jangkauan suatu titik
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Arsitektur Game di Unity