Menu
CoddyTech

Méthodes d’extension

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

Vector3 et Transform appartiennent à Unity, donc vous ne pouvez pas leur ajouter de méthode. Une méthode d’extension est une méthode statique que C# vous permet d’appeler comme si elle leur appartenait. Ces deux méthodes permettent d’économiser des lignes qui reviennent 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 caractérisent 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 à gauche du point ; ainsi, transform.position.WithY(0.5f) est compilé 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 en renvoie un nouveau à la place. C’est aussi ainsi que l’on contourne transform.position.y = 0.5f;, qui ne compile pas.

La classe statique n’est pas un MonoBehaviour. Elle se trouve dans un fichier .cs qui lui est propre ; n’importe quel nom convient, et elle ne s’ajoute jamais à un objet. Les méthodes héritées par un MonoBehaviour, comme Destroy, doivent être précédées de leur classe ici : Object.Destroy. Détruire des enfants à l’intérieur du foreach est sans danger, car Unity ne les supprime qu’à la fin de la frame.

challenge icon

Défi

Moyen

Un hibou perché sur un poteau élevé observe la cour. Les flèches déplacent le Player (prêt). Ajoute au projet deux méthodes d’extension et utilise-les pour le hibou :

  • Dans FlatExtensions.cs, écris une classe statique FlatExtensions.
  • FlatDistance étend Vector3 : a.FlatDistance(b) renvoie la distance entre a et b au sol, sans tenir compte de la différence de hauteur. De (0, 5, 0) à (3, 0, 4), elle vaut 5.
  • FaceFlat étend Transform : t.FaceFlat(target) fait pivoter t pour qu’il regarde la cible uniquement autour de l’axe y, afin qu’il reste droit quelle que soit la hauteur de la cible.
  • Dans Owl.cs, à chaque image, le hibou fait face au joueur avec FaceFlat, et ses eyes sont allumés lorsque le joueur se trouve à moins de sight (3) unités au sol, et éteints sinon. Le hibou est perché haut sur son poteau : il ne faut donc pas utiliser Vector3.Distance.

Appuie sur Play, fais le tour du poteau et passe sous le hibou, puis appuie sur Check.

Essayez vous-même

using UnityEngine;

// FlatExtensions : FlatDistance et FaceFlat
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Architecture de jeu dans Unity