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.
Défi
MoyenDonne deux méthodes d’extension au hibou.
- Dans
FlatExtensions, ajouteFlatDistance(this Vector3 a, Vector3 b)en public static : la distance sans tenir compte de la hauteur,5de (0, 5, 0) à (3, 0, 4). - De même,
FaceFlat(this Transform t, Vector3 target)fait pivotertuniquement autour de l’axe y. - Dans
Owl, fais regarder le joueur avec FaceFlat ;eyessont 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
1Des composants, pas des hiérarchies
De petits composantsUn script de base pour les ennemisComposants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaireRécapitulatif : canon double4Données sérialisées
Classes sérialisablesListes dans l’InspecteurÉnumérations dans l’InspecteurRécapitulatif : table de butinRécapitulatif : tirer le butin2Les interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interactionLe plus proche à portée5ScriptableObjects
Ressources de donnéesStatistiques des armesParamètres partagésSauver le ventLes vagues comme donnéesRécapitulatif : base de données des objetsRécapitulatif : acheter dans la boutique8Code réutilisable
Méthodes d’extensionUn singleton génériqueFonctions utilitaires génériquesRécapitulatif : FindNearest3Événements
Les événements C# dans UnityS’abonner dans OnEnableChamps UnityEventLes événements pilotent l’interfaceRécapitulatif : fenêtre de succèsRécapitulatif : minuteur de la fenêtreEntraînez-vous par vous-même : Playground Unity