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.
Défi
FacileRends le bonhomme de neige, la cloche et l’épouvantail IDamageable, afin que le marteau les frappe.
Snowman:TakeDamagele rétrécit de0.25f * amountsur chaque axe ; à 0,5 ou moins, détruis-le.Bell: consigneDongune fois par point et ajouteamountàrings.Scarecrow: seule la première frappe exécutetransform.Rotate(0f, 0f, 90f);.- Dans
Slam, appelleTakeDamage(power)sur l’IDamageablede 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
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 boutique3É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