IDamageable
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 6 sur 50.
Dans un jeu, beaucoup de choses peuvent être endommagées et ont peu d’autres points communs : le joueur a des points de vie, une caisse se casse au premier coup. Une classe de base commune les obligerait à appartenir à une même famille. Une interface nomme le seul élément qu’elles ont en commun, et chaque script l’implémente à sa manière :
public interface IDamageable
{
void TakeDamage(int amount);
}public class PlayerHealth : MonoBehaviour, IDamageable
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
Debug.Log("Ouch! hp: " + hp);
}
}public class Crate : MonoBehaviour, IDamageable
{
public void TakeDamage(int amount)
{
Destroy(gameObject);
}
}Un script a toujours une classe de base, MonoBehaviour, et énumère les interfaces après celle-ci. L’interface se trouve dans son propre fichier, IDamageable.cs, et ne dérive pas de MonoBehaviour : ce n’est pas un composant et elle ne s’ajoute jamais seule à un objet. Une classe qui l’énumère doit avoir une méthode publique TakeDamage(int), sinon elle ne compile pas.
Le script qui inflige les dégâts demande l’interface, pas une classe :
// Fireball.cs
void OnCollisionEnter(Collision collision)
{
IDamageable target = collision.gameObject.GetComponent<IDamageable>();
if (target != null)
{
target.TakeDamage(3);
}
Destroy(gameObject);
}La boule de feu blesse le joueur et casse les caisses avec les mêmes lignes, et un type de cible ajouté plus tard ne nécessitera aucune modification ici. Unity n’affiche pas de champ de type interface dans l’Inspector ; les scripts stockent donc un GameObject ou un composant et lui demandent l’interface, comme le fait la boule de feu.
Défi
FacileUn géant garde la place du village. Les flèches déplacent le géant (Mover.cs, prêt), et la barre d’espace fait tournoyer son marteau : Hammer.cs appelle Slam(), qui trouve chaque collider dans un rayon de radius. Trois choses sur la place encaissent un coup, chacune à sa manière, et ne partagent rien d’autre :
Snowman: chaque point de dégâts réduit sa taille de 0.25 sur chaque axe (elle commence à 1.5). À une taille de 0.5 ou moins, il fond : détruisez le bonhomme de neige.Bell: afficheDongune fois par point de dégâts (un coup de 2 l’affiche deux fois) et ajoute les points àrings.Scarecrow: le premier coup le fait basculer, en le tournant de 90 degrés autour de z, quelle que soit la quantité de dégâts. Les coups suivants ne changent rien.
IDamageable.cs déclare l’interface, avec une seule méthode : void TakeDamage(int amount). Faites implémenter cette interface par Snowman, Bell et Scarecrow, chacun avec sa propre réaction. Ensuite, dans Slam, appelez TakeDamage(power) sur l’IDamageable de chaque collider trouvé. Les colliders qui n’en ont pas, comme le sol, sont ignorés.
Appuyez sur Play, approchez-vous de chacun d’eux et frappez, puis Check.
Essayez vous-même
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
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’objets