Fonctions utilitaires génériques
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 44 sur 64.
Certains utilitaires sont identiques pour tous les types : récupérer un composant ou en ajouter un, choisir une entrée aléatoire dans un tableau. Une méthode générique permet de les écrire une seule fois, en utilisant le type comme paramètre T que chaque appel précise :
public static class Helpers
{
public static T GetOrAdd<T>(this GameObject go) where T : Component
{
if (!go.TryGetComponent(out T found)) found = go.AddComponent<T>();
return found;
}
public static T RandomItem<T>(T[] items)
{
return items[Random.Range(0, items.Length)];
}
}Rigidbody body = crate.GetOrAdd<Rigidbody>();
Color paint = Helpers.RandomItem(colors);
GameObject enemy = Helpers.RandomItem(enemyPrefabs);where T : Component est une garantie concernant T, qui détermine ce que la méthode peut faire avec lui. AddComponent n'accepte que les composants : sans cette contrainte, le compilateur refuse go.AddComponent<T>() ; avec elle, tous les composants fonctionnent, qu'il s'agisse de Rigidbody dans Unity ou de vos propres scripts. La contrainte vous donne également accès à tous les membres de Component sur un T, comme .transform et .gameObject. Si une caisse possède déjà un Rigidbody, elle récupère celui-ci, sans en ajouter.
RandomItem n'a pas de contrainte, car elle n'accède jamais à T : elle fonctionne aussi bien avec des couleurs, des chaînes de caractères et des prefabs. Il est rare d'indiquer le type dans l'appel : à partir de colors, un Color[], le compilateur déduit que T est Color. Une méthode qui accepte IEnumerable<T> au lieu de T[] accepte aussi bien les tableaux que les Lists, y compris les tableaux renvoyés par FindObjectsByType<T>.
Défi
MoyenÉcris un helper générique pour les caisses et les lampes de la tour à impulsions.
- Dans
Helpers.cs, écris la classe statiqueHelpersavec la méthode publiqueInRange<T>(IEnumerable<T> items, Vector3 center, float range)pour les composants : uneList<T>contenant les éléments situés à une distance maximale derange. - Dans
Pulse, lorsque tu appuies sur Espace, donne une impulsion vers le haut deliftà chaque Rigidbody à portée. - Ensuite, appelle
TurnOn()sur chaque Lamp à portée.
Appuie sur « Jouer », puis sur Espace : la caisse proche saute. Ensuite, appuie sur « Vérifier ».
Essayez vous-même
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T> : les éléments situés à portée d’un point
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