Métodos de Extensão
Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 33 de 50.
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. Estes 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 do chamador e, em vez disso, retorna um novo. Essa também é a forma de contornar 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; qualquer nome serve, e nunca é adicionada a um objeto. Métodos herdados por um MonoBehaviour, como Destroy, precisam ter a classe especificada aqui: Object.Destroy. Destruir filhos dentro do foreach é seguro, porque o Unity só os remove no fim do frame.
Desafio
MédioUma coruja em um poste alto observa o quintal. As setas movimentam o Player (pronto). Dê ao projeto dois métodos de extensão e use-os na coruja:
- Em
FlatExtensions.cs, escreva uma classe estáticaFlatExtensions. FlatDistanceestende Vector3:a.FlatDistance(b)retorna a distância deaatébpelo chão, desconsiderando a diferença de altura. De (0, 5, 0) até (3, 0, 4), ela é 5.FaceFlatestende Transform:t.FaceFlat(target)giratpara ficar de frente para o alvo apenas em torno de y, mantendo-o na vertical, independentemente de quão alto ou baixo o alvo esteja.- Em
Owl.cs, a cada quadro, a coruja fica de frente para o jogador usando FaceFlat, e seuseyesficam acesos enquanto o jogador estiver a menos desight(3) de distância pelo chão; caso contrário, ficam apagados. A coruja fica no alto do poste, então isto não éVector3.Distance.
Pressione Play, caminhe ao redor do poste e por baixo da coruja e, em seguida, Check.
Experimente você mesmo
using UnityEngine;
// FlatExtensions: FlatDistance e FaceFlat
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