Menu
CoddyTech

De petits composants

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

Un GameObject est une liste de composants, et chaque script que tu écris en est un de plus. Les jeux Unity sont construits en attribuant une tâche à chaque script et en plaçant plusieurs scripts sur un objet. Le déplacement, le tir et les points de vie d’un joueur pourraient tous se trouver dans un seul PlayerController, mais en tant que trois composants, Mover, Shooter et Health, chacun peut aussi être placé sur d’autres objets :

public class Health : MonoBehaviour
{
    public int hp = 3;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
    }
}
  • Joueur : Mover, Shooter, Health
  • Étourelle : Shooter, Health
  • Caisse : Health

Avec de simples classes C#, tu pourrais plutôt construire un arbre : Character, puis ShootingCharacter : Character, puis Player : ShootingCharacter. Une tourelle tire, mais ne marche jamais, et une caisse ne fait que se casser ; chaque nouveau type d’objet implique donc de remanier l’arbre. Avec des composants, un nouveau type d’objet est une nouvelle combinaison de scripts existants, assemblés dans l’Inspector, et chaque script peut y avoir ses propres valeurs : un Mover lent sur un objet, un rapide sur un autre.

Les composants d’un même objet partagent son Transform, donc chacun ne devrait modifier que la partie dont il est responsable. Un Mover qui ajoute une valeur à x et z avec transform.position += laisse y inchangé, ce qui permet à un Jumper sur le même objet de modifier encore la hauteur. Un Mover qui définissait toute la position avec new Vector3(x, 0.5f, z) remettrait y à sa valeur précédente à chaque image et annulerait le saut.

challenge icon

Défi

Facile

Divise Boat.cs pour que chaque script n’ait qu’un seul rôle.

  1. Déplace le mouvement de va-et-vient dans Bobber : startY défini dans Start(), le mouvement de va-et-vient dans Update(), en utilisant ses propres height et speed.
  2. Déplace le clignotement dans Blinker, avec son propre minuteur.
  3. Supprime ces deux rôles et leurs champs de Boat, pour qu’il ne fasse que diriger le bateau.

Appuie sur « Jouer » : le canard monte et descend, la bouée clignote et le bateau se dirige. Puis appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;
using UnityEngine.InputSystem;

// Un seul script, trois tâches : diriger, osciller et clignoter.
public class Boat : MonoBehaviour
{
    public float speed = 3f;
    public float bobHeight = 0.1f;
    public float bobSpeed = 2f;
    public Renderer lamp;
    public float blinkInterval = 0.5f;

    private InputAction moveAction;
    private float startY;
    private float blinkTimer;

    void Start()
    {
        moveAction = InputSystem.actions.FindAction("Move");
        startY = transform.position.y;
    }

    void Update()
    {
        // direction
        Vector2 input = moveAction.ReadValue<Vector2>();
        transform.position += new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime;

        // oscillation
        Vector3 p = transform.position;
        p.y = startY + Mathf.Sin(Time.time * bobSpeed) * bobHeight;
        transform.position = p;

        // clignotement
        blinkTimer += Time.deltaTime;
        if (blinkTimer >= blinkInterval)
        {
            blinkTimer -= blinkInterval;
            lamp.enabled = !lamp.enabled;
        }
    }
}

Toutes les leçons de Architecture de jeu dans Unity

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