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>.
Desafio
MédioUma 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áticaHelperscom um método genéricoInRange<T>(IEnumerable<T> items, Vector3 center, float range)para qualquer tipo de componente. Ele retorna umaList<T>dos itens cuja posição esteja a uma distância de no máximorangedecenter. - Em
Pulse.cs, quando a tecla Space for pressionada: cada Rigidbody na cena a uma distância derangeda torre recebe um impulso para cima delift, e cada Lamp a uma distância derangeé ligada. Use InRange para ambos, nos arrays queFindObjectsByTypefornece.
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
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
1Componentes, não hierarquias
Componentes pequenosUm script-base para inimigosComponentes abstratosComponentes trabalhando juntosRevisão: Torre modular4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de Loot7Máquinas de Estados
Estados como ClassesUma Máquina de EstadosTransiçõesInteligências dos InimigosRevisão: Estados da Porta10Projeto: Sobrevivente da Arena
O HeróiTipos de Inimigos5ScriptableObjects
Assets de dadosAtributos das armasConfigurações compartilhadasOndas como dadosRevisão: banco de dados de itens8Código Reutilizável
Métodos de ExtensãoUm Singleton GenéricoMétodos Auxiliares GenéricosRevisão: FindNearest