Menu
CoddyTech

Métodos Auxiliares Genéricos

Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 35 de 50.

Alguns auxiliares são iguais para todos os tipos: obter um componente ou adicioná-lo, escolher uma entrada aleatória de um array. Um método genérico os define uma única vez, com o tipo como parâmetro T, que cada chamada preenche:

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 é uma garantia sobre T e determina o que o método pode fazer com ele. AddComponent só aceita componentes, então, sem a restrição, o compilador rejeita go.AddComponent<T>(); com ela, qualquer componente funciona, seja o Rigidbody do Unity ou seus próprios scripts. A restrição também dá acesso a todos os membros de Component em um T, como .transform e .gameObject. Uma crate que já tenha um Rigidbody recebe esse mesmo de volta, e nada é adicionado.

RandomItem não tem restrição, porque nunca manipula T: funciona igualmente com cores, strings e prefabs. Raramente você escreve o tipo na chamada: a partir de colors, um Color[], o compilador deduz que T é Color. Um método que recebe IEnumerable<T> em vez de T[] aceita tanto arrays quanto Lists, incluindo os arrays retornados por FindObjectsByType<T>.

challenge icon

Desafio

Médio

Uma torre de choque está no quintal. Quando a tecla Space é pressionada, ela emite um pulso: as caixas a até 4 unidades dela são lançadas para cima, e as lâmpadas a até 4 unidades se acendem. Lamp.cs está pronta, com TurnOn(). Escreva um auxiliar que encontre ambas:

  • Em Helpers.cs, escreva uma classe estática Helpers com um método genérico InRange<T>(IEnumerable<T> items, Vector3 center, float range) para qualquer tipo de componente. Ele retorna uma List<T> dos itens cuja posição esteja a uma distância de no máximo range de center.
  • Em Pulse.cs, quando a tecla Space for pressionada: cada Rigidbody na cena a uma distância de range da torre recebe um impulso para cima de lift, e cada Lamp a uma distância de range é ligada. Use InRange para ambos, nos arrays que FindObjectsByType fornece.

Pressione Play, pressione Space e, em seguida, Check.

Experimente você mesmo

using System.Collections.Generic;
using UnityEngine;

// Helpers.InRange<T>: os itens dentro do alcance de um ponto
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Arquitetura de jogos no Unity