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.
Défi
MoyenUn 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 statiqueFlatExtensions. FlatDistanceétend Vector3 :a.FlatDistance(b)renvoie la distance entreaetbau 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 pivotertpour 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 seseyessont allumés lorsque le joueur se trouve à moins desight(3) unités au sol, et éteints sinon. Le hibou est perché haut sur son poteau : il ne faut donc pas utiliserVector3.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
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
1Des composants, pas des hiérarchies
Des composants simplesUn script de base pour les ennemisDes composants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaire4Données sérialisées
Classes sérialisablesListes dans l’inspecteurÉnumérations dans l’inspecteurRécapitulatif : table de butin7Machines à états
Les états sous forme de classesUne machine à étatsTransitionsLes cerveaux des ennemisRécapitulatif : états d’une porte10Projet : Survivant de l’arène
Le hérosTypes d’ennemis2Interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interaction5ScriptableObjects
Assets de donnéesStatistiques des armesParamètres partagésLes vagues sous forme de donnéesRécapitulatif : base de données d’objets8Code réutilisable
Méthodes d’extensionUn singleton génériqueFonctions utilitaires génériquesRécapitulatif : FindNearest