Menu
CoddyTech

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>.

challenge icon

Défi

Moyen

Écris un helper générique pour les caisses et les lampes de la tour à impulsions.

  1. Dans Helpers.cs, écris la classe statique Helpers avec la méthode publique InRange<T>(IEnumerable<T> items, Vector3 center, float range) pour les composants : une List<T> contenant les éléments situés à une distance maximale de range.
  2. Dans Pulse, lorsque tu appuies sur Espace, donne une impulsion vers le haut de lift à chaque Rigidbody à portée.
  3. 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

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