Menu
CoddyTech

IDamageable

Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 7 sur 64.

Une interface est une liste de méthodes qu’une classe promet de posséder, sans code à l’intérieur. Des classes qui n’ont rien d’autre en commun peuvent faire la même promesse. En C# classique :

interface IGreeter
{
    string Greet();
}

class Robot : IGreeter
{
    public string Greet() { return "Beep"; }
}

class Cat : IGreeter
{
    public string Greet() { return "Meow"; }
}

Une variable de type IGreeter peut contenir un Robot ou un Cat, et greeter.Greet() exécute la méthode correspondant à l’objet qu’elle contient. Une classe qui répertorie IGreeter mais ne possède pas de méthode publique Greet() ne compile pas.

Dans un jeu, beaucoup de choses peuvent subir des dégâts, et elles n’ont pas grand-chose d’autre en commun : le joueur a des points de vie, une caisse se brise au premier coup. Une classe de base commune les obligerait à appartenir à la même famille. Une interface nomme le seul élément qu’elles partagent, 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 répertorie les interfaces après celle-ci. L’interface est placée dans son propre fichier, IDamageable.cs, et ne dérive pas de MonoBehaviour : ce n’est pas un composant et elle n’est jamais ajoutée seule à un objet. Une classe qui la répertorie doit avoir une méthode publique TakeDamage(int), sinon elle ne compile pas.

Le code 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 brise les caisses avec les mêmes lignes, et un nouveau type de cible ajouté plus tard ne nécessite aucune modification ici. Unity n’affiche pas dans l’Inspector de champ de type interface ; 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

Rends le bonhomme de neige, la cloche et l’épouvantail IDamageable, afin que le marteau les frappe.

  1. Snowman : TakeDamage le rétrécit de 0.25f * amount sur chaque axe ; à 0,5 ou moins, détruis-le.
  2. Bell : consigne Dong une fois par point et ajoute amount à rings.
  3. Scarecrow : seule la première frappe exécute transform.Rotate(0f, 0f, 90f);.
  4. Dans Slam, appelle TakeDamage(power) sur l’IDamageable de chaque collider, s’il y en a un.

Appuie sur « Jouer » et frappe-les chacun. Puis clique sur « Vérifier ».

Essayez vous-même

using UnityEngine;

public class Snowman : MonoBehaviour
{
}

Toutes les leçons de Architecture de jeu dans Unity

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