Menu
CoddyTech

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.

challenge icon

Desafio

Médio

Dê à coruja dois métodos de extensão.

  1. Em FlatExtensions, adicione FlatDistance(this Vector3 a, Vector3 b) como método estático público: a distância sem considerar a altura, 5 de (0, 5, 0) até (3, 0, 4).
  2. Da mesma forma, FaceFlat(this Transform t, Vector3 target) gira t apenas em torno do eixo y.
  3. Em Owl, vire-se para o jogador com FaceFlat; os eyes ficam acesos enquanto FlatDistance for menor que sight.

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

Pratique por conta própria: Playground de Unity