Menu
CoddyTech

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.

challenge icon

Défi

Facile

Un 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 : affiche Dong une 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
{
}
quiz iconTestez-vous

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