Un script de base pour les ennemis
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 2 sur 64.
En C#, une classe peut hériter d’une autre : class Ghost : Enemy obtient tous les champs et toutes les méthodes de Enemy et ajoute les siens. Une méthode que la classe de base déclare virtual peut être remplacée dans la sous-classe avec override, et base.Describe() exécute la version de la classe de base depuis la nouvelle méthode. En C# standard :
class Enemy
{
protected int hp = 3;
public virtual string Describe()
{
return "Enemy with " + hp + " hp";
}
}
class Ghost : Enemy
{
public override string Describe()
{
return base.Describe() + ", see-through";
}
}Describe() d’un Ghost renvoie Enemy with 3 hp, see-through. protected signifie que Enemy et ses sous-classes peuvent utiliser hp, contrairement aux autres classes.
Dans Unity, les ennemis partagent la majeure partie de leur code : des points de vie, une vitesse et une façon de se déplacer. Ce code se trouve dans une classe de base qui hérite de MonoBehaviour, et chaque type d’ennemi en hérite. Cet Enemy définit ses points de vie dans Start et avance dans la direction à laquelle il fait face dans Update, tandis qu’un Ghost modifie le démarrage pour se déplacer deux fois plus vite :
public class Enemy : MonoBehaviour
{
public int maxHp = 3;
public float speed = 2f;
protected int hp;
protected virtual void Start()
{
hp = maxHp;
}
protected virtual void Update()
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
}public class Ghost : Enemy
{
protected override void Start()
{
base.Start();
speed *= 2f;
}
}Ghost hérite des champs : l’Inspector affiche donc maxHp et speed pour un Ghost. Il hérite aussi de Update, et avance donc sans avoir son propre Update. hp est protected : Enemy et ses sous-classes peuvent l’utiliser, mais pas les autres scripts.
Unity trouve Start et Update par leur nom, quel que soit leur niveau d’accès, et appelle celle qui se trouve dans la classe la plus dérivée. Si Start de Enemy était un void Start() privé et que Ghost déclarait le sien, Unity n’appellerait que celui de Ghost : celui de Enemy ne s’exécuterait jamais, et hp resterait à 0 sans qu’aucune erreur ne soit signalée. Déclarer les méthodes de base protected virtual rend cela explicite en C# : la sous-classe écrit override, et base.Start() exécute la partie de la classe de base à l’endroit où tu l’appelles. Si tu omets cet appel, la partie de la classe de base est ignorée : c’est ainsi qu’une sous-classe remplace une étape au lieu de la compléter.
Défi
FacileFais exécuter à Golem et Wasp la partie de Enemy avant la leur.
- Dans
Enemy, écrisprotected virtualdevantvoid Start()etvoid Update(). - Dans
Golem, écrisprotected override void Start()avecbase.Start();comme première ligne. - Dans
Wasp, écrisprotected override void Update()avecbase.Update();comme première ligne.
Clique sur « Jouer » : le golem avance avec ses hp au maximum, et la guêpe zigzague en avançant. Puis clique sur « Vérifier ».
Essayez vous-même
using UnityEngine;
// Ce que tous les monstres ont en commun.
public class Enemy : MonoBehaviour
{
public int maxHp = 4;
public float speed = 1.5f;
protected int hp;
protected Vector3 spawnPoint;
void Start()
{
hp = maxHp;
spawnPoint = transform.position;
}
void Update()
{
// avancer vers le château en descendant le long de l’axe z
transform.position += Vector3.back * speed * Time.deltaTime;
}
}
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