Métodos de Extensão
Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 42 de 64.
Vector3 e Transform pertencem ao Unity, então você não pode adicionar um método a eles. Um método de extensão é um método estático que o C# permite chamar como se fosse deles. Esses dois economizam linhas que aparecem em todo projeto:
public static class UnityExtensions
{
public static Vector3 WithY(this Vector3 v, float y)
{
return new Vector3(v.x, y, v.z);
}
public static void DestroyChildren(this Transform parent)
{
foreach (Transform child in parent)
{
Object.Destroy(child.gameObject);
}
}
}// em qualquer script
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();Três coisas definem um método de extensão: uma classe estática que não seja aninhada nem genérica, um método estático e this antes do primeiro parâmetro. Esse parâmetro é o valor à esquerda do ponto, então transform.position.WithY(0.5f) é compilado como UnityExtensions.WithY(transform.position, 0.5f). Vector3 é uma struct, então v é uma cópia: WithY não pode alterar o vetor de quem o chamou e, em vez disso, retorna um novo. É assim também que ela contorna transform.position.y = 0.5f;, que não compila.
A classe estática não é um MonoBehaviour. Ela fica em um arquivo .cs próprio, que pode ter qualquer nome, e nunca é adicionada a um objeto. Métodos herdados por um MonoBehaviour, como Destroy, precisam indicar aqui a classe a que pertencem: Object.Destroy. Destruir filhos dentro do foreach é seguro, porque o Unity só os remove no final do frame.
Desafio
MédioDê à coruja dois métodos de extensão.
- Em
FlatExtensions, adicioneFlatDistance(this Vector3 a, Vector3 b)como método estático público: a distância sem considerar a altura,5de (0, 5, 0) até (3, 0, 4). - Da mesma forma,
FaceFlat(this Transform t, Vector3 target)giratapenas em torno do eixo y. - Em
Owl, vire-se para o jogador com FaceFlat; oseyesficam acesos enquanto FlatDistance for menor quesight.
Pressione “Jogar” e caminhe por baixo da coruja: os olhos dela brilham. Em seguida, pressione “Verificar”.
Experimente você mesmo
using UnityEngine;
public static class FlatExtensions
{
// FlatDistance (Vector3) e FaceFlat (Transform) vão aqui
}
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