Menu
CoddyTech

Actions d’entrée

Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 46 sur 56.

Tester les touches une par une lie un script au clavier. Une action nomme plutôt ce que fait le joueur, et le projet répertorie les touches, les sticks et les boutons qui la déclenchent. Un nouveau projet Unity 6 est livré avec un ensemble d’actions (l’asset InputSystem_Actions, défini comme actions à l’échelle du projet), dont la carte Player comporte Move (WASD, les flèches et le stick gauche d’une manette), Look (la souris ou le stick droit), Attack (le bouton gauche de la souris et Entrée), Interact (E, maintenue), Crouch (C), Jump (Espace et le bouton sud de la manette), Previous et Next (1 et 2) et Sprint (Maj gauche). Elles sont activées dès le départ, et InputSystem.actions.FindAction("Jump") permet d’en récupérer une par son nom. Cette grue à pince en vue latérale se déplace sur les axes x et y et attrape avec Jump :

using UnityEngine;
using UnityEngine.InputSystem;

public class ClawCrane : MonoBehaviour
{
    public float speed = 3f;

    private InputAction moveAction;
    private InputAction jumpAction;

    void Start()
    {
        moveAction = InputSystem.actions.FindAction("Move");
        jumpAction = InputSystem.actions.FindAction("Jump");
    }

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

        if (jumpAction.WasPressedThisFrame())
            Debug.Log("Grab!");
    }
}

Les actions sont récupérées une seule fois, dans Start, puis conservées dans des champs InputAction. Move renvoie un Vector2 : x correspond à droite et gauche, y à haut et bas sur les touches, et la valeur est normalisée. Ainsi, W et D ensemble renvoient (0.71, 0.71) plutôt que (1, 1). La grue est en vue latérale, elle utilise donc cet axe y pour la hauteur ; un jeu vu de dessus l’utiliserait pour z. Les actions de bouton se comportent comme les touches : WasPressedThisFrame(), WasReleasedThisFrame() et IsPressed(). Deux erreurs provoquent une exception : un nom mal orthographié fait renvoyer null à FindAction (une NullReferenceException à la première lecture), et ReadValue<Vector3>() sur Move provoque une InvalidOperationException dès qu’une touche est maintenue, car Move contient un Vector2.

challenge icon

Défi

Moyen

L’arpenteur cartographie un champ de neige vu de dessus et transporte des flags (3) à planter en chemin. Le script contient speed (4), flags, flagPrefab et une liste planted. Utilise les actions du projet :

  • Move déplace l’arpenteur sur la neige à raison de speed unités par seconde : vers la droite et la gauche le long de x, vers le haut et le bas le long de z.
  • Chaque pression sur Jump plante un drapeau : une copie de flagPrefab aux coordonnées x et z de l’arpenteur, à y 0.75, ajoutée à planted. Cela consomme un des flags et affiche le nombre restant, par exemple Flags left: 2. S’il ne reste aucun drapeau, Jump n’en plante aucun.
  • Chaque pression sur Attack (un clic gauche) récupère le dernier drapeau planté : il est détruit et retiré de la liste, flags augmente d’une unité et la même ligne est affichée.

Appuie sur Play, plante trois drapeaux et récupère-en un, puis clique sur Check.

Essayez vous-même

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class Surveyor : MonoBehaviour
{
    public float speed = 4f;
    public int flags = 3;
    public GameObject flagPrefab;

    private List<GameObject> planted = new List<GameObject>();

    void Start()
    {
        // trouver les actions Move, Jump et Attack
    }

    void Update()
    {
        // se déplacer avec Move, planter un drapeau avec Jump et en retirer un avec Attack
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Créer de vrais jeux