Menu
CoddyTech

Métodos Auxiliares Genéricos

Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 44 de 64.

Alguns métodos 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 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 permite acessar em T todos os membros de Component, como .transform e .gameObject. Uma caixa que já tem um Rigidbody recebe esse mesmo componente de volta, e nada é adicionado.

RandomItem não tem restrição, porque nunca acessa T: funciona tanto com cores e strings quanto com prefabs. Raramente você precisa escrever 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 que FindObjectsByType<T> retorna.

challenge icon

Desafio

Médio

Escreva um auxiliar genérico para as caixas e lâmpadas da torre de choque.

  1. Em Helpers.cs, escreva a classe estática Helpers com InRange<T>(IEnumerable<T> items, Vector3 center, float range) público para componentes: uma List<T> com os itens que estejam a uma distância de no máximo range.
  2. Em Pulse, ao pressionar Espaço, dê um impulso para cima de lift a cada Rigidbody dentro do alcance.
  3. Em seguida, chame TurnOn() em cada Lamp dentro do alcance.

Pressione “Jogar” e depois Espaço: a caixa próxima salta. Em seguida, clique em “Verificar”.

Experimente você mesmo

using System.Collections.Generic;
using UnityEngine;

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

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

Pratique por conta própria: Playground de Unity