Menu
CoddyTech

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.

challenge icon

Desafio

Médio

Uma 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ática FlatExtensions.
  • FlatDistance estende Vector3: a.FlatDistance(b) retorna a distância de a até b pelo chão, desconsiderando a diferença de altura. De (0, 5, 0) até (3, 0, 4), ela é 5.
  • FaceFlat estende Transform: t.FaceFlat(target) gira t para 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 seus eyes ficam acesos enquanto o jogador estiver a menos de sight (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
quiz iconTeste seus conhecimentos

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