Composants abstraits
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 3 sur 64.
Certaines classes de base décrivent un type de chose qui n’existe jamais par elle-même. Chaque arme tire, mais une arme qui n’est ni un pistolet ni un fusil à pompe n’a aucun moyen de tirer. Marquez une telle classe avec abstract et déclarez chaque étape que ses sous-classes doivent écrire comme une méthode abstraite, sans corps :
public abstract class Weapon : MonoBehaviour
{
public int shots;
public void Pull()
{
shots++;
Fire();
}
protected abstract void Fire();
}public class Shotgun : Weapon
{
public GameObject pelletPrefab;
protected override void Fire()
{
for (int i = -1; i <= 1; i++)
{
Instantiate(pelletPrefab, transform.position + transform.right * i * 0.3f, transform.rotation);
}
}
}Une sous-classe qui n’écrit pas Fire ne compile pas : CS0534, 'Pistol' does not implement inherited abstract member 'Weapon.Fire()'. Unity refuse également d’ajouter un script abstrait à un objet. Faites glisser Weapon sur un objet et Unity affiche Can't add script behaviour 'Weapon'. The script class can't be abstract!, car Unity ne pourrait pas créer une arme sans Fire.
Les autres scripts fonctionnent toujours avec le type de base. GetComponent<Weapon>() renvoie la sous-classe présente sur l’objet, et Pull() exécute le Fire de cette sous-classe :
// Player.cs
private Weapon weapon;
void Start()
{
weapon = GetComponent<Weapon>();
}
void Update()
{
if (Mouse.current.leftButton.wasPressedThisFrame)
{
weapon.Pull();
}
}Remplacez le composant Shotgun par un Pistol et le script Player reste identique.
Défi
FacileRends Monster abstraite et fais en sorte que la tour électrocute tous les types de monstres.
- Dans
Monster, écrispublic abstract class Monsteretprotected abstract void React();, sans corps. - Le compilateur pointe maintenant vers
Imp: ajouteprotected override void React(), qui ajouteVector3.forward * 2fà sa position. - Dans
Tower, à l’intérieur de la boucle, appelleZap()surtarget.GetComponent<Monster>().
Appuie sur « Jouer », puis sur la barre d’espace : les slimes rétrécissent et l’imp saute en arrière. Ensuite, appuie sur « Vérifier ».
Essayez vous-même
using UnityEngine;
// Ce que tous les monstres ont en commun.
public class Monster : MonoBehaviour
{
public int hp = 3;
public void Zap()
{
hp--;
if (hp <= 0)
{
Destroy(gameObject);
}
else
{
React();
}
}
// Comment ce type de monstre réagit à un coup de zap auquel il survit.
protected virtual void React()
{
}
}
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