Menu
CoddyTech

Méthodes d’extension

Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 42 sur 64.

Vector3 et Transform appartiennent à Unity, donc tu ne peux pas leur ajouter de méthode. Une méthode d’extension est une méthode statique que C# te permet d’appeler comme si elle leur appartenait. Ces deux méthodes t’évitent de répéter du code dans chaque projet :

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);
        }
    }
}
// dans n’importe quel script
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();

Trois éléments définissent une méthode d’extension : une classe statique qui n’est ni imbriquée ni générique, une méthode statique et this avant le premier paramètre. Ce paramètre correspond à la valeur située à gauche du point : transform.position.WithY(0.5f) se compile donc en UnityExtensions.WithY(transform.position, 0.5f). Vector3 est une structure, donc v est une copie : WithY ne peut pas modifier le vecteur de l’appelant et renvoie plutôt un nouveau vecteur. C’est aussi ce qui permet de contourner transform.position.y = 0.5f;, qui ne compile pas.

La classe statique n’est pas un MonoBehaviour. Elle se trouve dans son propre fichier .cs, qui peut porter n’importe quel nom, et ne s’ajoute jamais à un objet. Les méthodes héritées par un MonoBehaviour, comme Destroy, doivent ici préciser leur classe : Object.Destroy. Détruire des enfants dans la boucle foreach ne pose pas de problème, car Unity ne les supprime qu’à la fin de la frame.

challenge icon

Défi

Moyen

Donne deux méthodes d’extension au hibou.

  1. Dans FlatExtensions, ajoute FlatDistance(this Vector3 a, Vector3 b) en public static : la distance sans tenir compte de la hauteur, 5 de (0, 5, 0) à (3, 0, 4).
  2. De même, FaceFlat(this Transform t, Vector3 target) fait pivoter t uniquement autour de l’axe y.
  3. Dans Owl, fais regarder le joueur avec FaceFlat ; eyes sont allumés lorsque FlatDistance est inférieur à sight.

Appuie sur « Jouer » et passe sous le hibou : ses yeux brillent. Puis appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;

public static class FlatExtensions
{
    // FlatDistance (Vector3) et FaceFlat (Transform) vont ici
}

Toutes les leçons de Architecture de jeu dans Unity

Entraînez-vous par vous-même : Playground Unity