Menu
CoddyTech

Generic Yardımcılar

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

Bazı yardımcılar her tür için aynıdır: bir bileşen 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ü T parametresi olarak kullanır:

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 güvencedir ve yöntemin T ile neler yapabileceğine karar verir. AddComponent yalnızca bileşenleri kabul eder; bu nedenle kısıtlama olmadan derleyici go.AddComponent<T>() ifadesini reddeder. Kısıtlamayla birlikte Unity'nin Rigidbody'si veya kendi betikleriniz gibi herhangi bir bileşen kullanılabilir. Kısıtlama, .transform ve .gameObject gibi Component'in tüm üyelerine T üzerinden erişmenizi de sağlar. Zaten bir Rigidbody bileşeni olan crate bu bileşeni geri alır ve hiçbir şey eklenmez.

RandomItem'ın kısıtlaması yoktur, çünkü T'ye hiç dokunmaz: renkler, dizeler ve prefab'lar için aynı şekilde çalışır. Çağrıda türü nadiren yazarsınız: Color[] türündeki colors değişkeninden derleyici, T'nin Color olduğunu çıkarır. T[] yerine IEnumerable<T> alan bir yöntem hem dizileri hem de List'leri, FindObjectsByType<T> yönteminin döndürdüğü diziler de dahil, kabul eder.

challenge icon

Görev

Orta

Bahçede bir şok kulesi duruyor. Space tuşuna basıldığında bir darbe gönderiyor: 4 birim yakınındaki kasalar havaya fırlatılıyor ve 4 birim yakınındaki lambalar yanıyor. Lamp.cs hazır, TurnOn() da mevcut. İkisini de bulan bir yardımcı yaz:

  • Helpers.cs içinde, herhangi bir bileşen türü için genel bir InRange<T>(IEnumerable<T> items, Vector3 center, float range) metoduna sahip statik bir Helpers sınıfı yaz. Bu metot, konumu center noktasından en fazla range uzaklıkta olan öğelerden oluşan bir List<T> döndürür.
  • Pulse.cs içinde, Space tuşuna basıldığında: sahnedeki kuleye range uzaklıkta bulunan her Rigidbody, yukarı doğru lift şiddetinde bir itki alır ve range uzaklıktaki her Lamp yakılır. Her ikisi için de FindObjectsByType metodunun verdiği diziler üzerinde InRange kullan.

Oynat'a bas, Space tuşuna bas, ardından Kontrol Et'e bas.

Kendin dene

using System.Collections.Generic;
using UnityEngine;

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

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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