Menu
CoddyTech

Generic Yardımcılar

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 44 / 64.

Bazı yardımcılar her tür için aynıdır: bir bileşeni al ya da ekle, bir diziden rastgele bir öğe seç. Genel bir yöntem bunları bir kez yazar; her çağrının doldurduğu tür parametresi T olur:

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, T hakkında bir garantidir ve yöntemin T ile neler yapabileceğini belirler. AddComponent yalnızca bileşenleri kabul eder; bu nedenle kısıtlama olmadan derleyici go.AddComponent<T>() kullanımını reddeder. Kısıtlamayla birlikte Unity'nin Rigidbody bileşeni veya kendi betiklerin gibi her bileşen kullanılabilir. Kısıtlama ayrıca T üzerinde Component'in tüm üyelerine erişmeni sağlar; örneğin .transform ve .gameObject. Zaten Rigidbody bileşeni olan bir crate, o bileşeni geri alır ve hiçbir şey eklenmez.

RandomItem için kısıtlama gerekmez, çünkü T'ye hiç dokunmaz: renkler, dizeler ve prefab'lar için aynı şekilde çalışır. Çağrı sırasında türü nadiren belirtirsin: colors bir Color[] olduğundan derleyici T'nin Color olduğunu çıkarır. T[] yerine IEnumerable<T> alan bir yöntem hem dizileri hem de List'leri kabul eder; buna FindObjectsByType<T> tarafından döndürülen diziler de dahildir.

challenge icon

Görev

Orta

Şok kulesinin kasaları ve lambaları için genel bir yardımcı yaz.

  1. Helpers.cs içinde, bileşenler için Helpers statik sınıfını ve InRange<T>(IEnumerable<T> items, Vector3 center, float range) genel metodunu yaz: en fazla range uzaklıktaki öğelerden oluşan bir List<T> döndürsün.
  2. Pulse içinde, Space tuşuna basıldığında menzil içindeki her Rigidbody'ye lift değerinde yukarı yönlü bir darbe uygula.
  3. Ardından menzil içindeki her Lamp için TurnOn() metodunu çağır.

“Oyna” düğmesine bas ve Space tuşuna bas: yakındaki kasa zıplar. Ardından “Kontrol et” düğmesine bas.

Kendin dene

using System.Collections.Generic;
using UnityEngine;

// Helpers.InRange<T>: bir noktanın menzili içindeki öğeler

Unity'de Oyun Mimarisi bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground