Menu
CoddyTech

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

challenge icon

Tantangan

Sedang

Tulis satu helper generik untuk peti dan lampu di menara kejut.

  1. Di Helpers.cs, tulis class statis Helpers dengan InRange<T>(IEnumerable<T> items, Vector3 center, float range) publik untuk komponen: sebuah List<T> berisi item yang berjarak paling jauh range.
  2. Di Pulse, saat tombol Space ditekan, berikan impuls ke atas sebesar lift kepada setiap Rigidbody dalam jangkauan.
  3. 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

Latihan sendiri: Playground Unity