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.
Desafio
MédioEscreva um auxiliar genérico para as caixas e lâmpadas da torre de choque.
- Em
Helpers.cs, escreva a classe estáticaHelperscomInRange<T>(IEnumerable<T> items, Vector3 center, float range)público para componentes: umaList<T>com os itens que estejam a uma distância de no máximorange. - Em
Pulse, ao pressionar Espaço, dê um impulso para cima delifta cada Rigidbody dentro do alcance. - 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
1Componentes, não hierarquias
Componentes pequenosUm script base de inimigoComponentes abstratosComponentes trabalhando juntosRevisão: torre modularRevisão: canhão duplo4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de LootRevisão: Sorteie o Loot2Interfaces no Unity
IDamageableInterfaces e TryGetComponentGetComponentsRevisão: tecla de interaçãoRevisão: mais próximo ao alcance5ScriptableObjects
Ativos de DadosAtributos da ArmaConfigurações CompartilhadasSalve o VentoOndas como DadosRevisão: Banco de ItensRevisão: Comprar na Loja8Código Reutilizável
Métodos de ExtensãoUm Singleton GenéricoMétodos Auxiliares GenéricosRevisão: FindNearestPratique por conta própria: Playground de Unity