Des composants qui fonctionnent ensemble
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 4 sur 64.
Les petits composants ont tout de même besoin les uns des autres. Un Jetpack a besoin de Fuel sur le même objet : il récupère donc Fuel une fois dans Awake, le conserve dans un champ et communique avec lui par l’intermédiaire de deux petites méthodes publiques :
public class Fuel : MonoBehaviour
{
public float amount = 10f;
public bool IsEmpty()
{
return amount <= 0f;
}
public void Burn(float units)
{
amount = Mathf.Max(amount - units, 0f);
}
}[RequireComponent(typeof(Fuel))]
public class Jetpack : MonoBehaviour
{
public float lift = 4f;
private Fuel fuel;
void Awake()
{
fuel = GetComponent<Fuel>();
}
void Update()
{
if (Keyboard.current.spaceKey.isPressed && !fuel.IsEmpty())
{
fuel.Burn(Time.deltaTime);
transform.position += Vector3.up * lift * Time.deltaTime;
}
}
}[RequireComponent(typeof(Fuel))] fait en sorte que Unity ajoute un composant Fuel chaque fois qu’un Jetpack est ajouté, dans l’éditeur ou avec AddComponent, et empêche de supprimer ce composant Fuel tant que le Jetpack est présent. Unity ne vérifie cela qu’au moment où le Jetpack est ajouté : un Jetpack déjà présent sur un objet avant que vous écriviez l’attribut conserve donc sa configuration précédente. Awake est l’endroit où le récupérer : cette méthode s’exécute une fois, et tous les composants de l’objet sont alors disponibles.
Le Jetpack ne modifie jamais amount lui-même. Fuel décide de ce que signifie brûler du carburant, par exemple ne jamais descendre sous 0, et le Jetpack se contente de le lui demander. Si Fuel affiche plus tard une jauge ou se recharge grâce à des objets ramassés, le Jetpack n’a pas besoin de changer.
Défi
FacileFais en sorte que le dash du patineur coûte de l’endurance.
- Dans
Stamina, ajoutepublic bool TrySpend(float cost): sicurrentest supérieur ou égal àcost, déduis cette valeur et renvoietrue, sinonfalse. - Place
[RequireComponent(typeof(Stamina))]au-dessus depublic class Dash, puis récupère le composant dans un champ dansAwake(). - Quand tu appuies sur Espace, effectue un dash uniquement si
TrySpend(cost)renvoietrue; sinon, afficheToo tireddans le journal.
Appuie sur « Jouer » : après deux dashs, la Console affiche Too tired. Ensuite, clique sur « Vérifier ».
Essayez vous-même
using UnityEngine;
using UnityEngine.InputSystem;
public class Dash : MonoBehaviour
{
public float distance = 3f;
public float cost = 40f;
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
transform.position += Vector3.forward * distance;
}
}
}
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