Menu
CoddyTech

Actions d’entrée

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

Tester les touches une par une lie un script au clavier. Une action désigne plutôt ce que fait le joueur, et le projet indique quelles touches, quels sticks et quels boutons la déclenchent. Un nouveau projet Unity 6 est livré avec un ensemble d’actions (l’asset InputSystem_Actions, défini comme ensemble d’actions à l’échelle du projet), dont la map Player contient 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 inférieur 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 saisit 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, et conservées dans des champs InputAction. Move fournit un Vector2 : x correspond à droite et à gauche, y à haut et bas sur les touches, et le vecteur est normalisé, donc W et D ensemble donnent (0.71, 0.71) plutôt que (1, 1). La grue est en vue latérale, donc elle utilise y pour la hauteur ; un jeu vu de dessus l’utiliserait pour z. Les actions de bouton répondent 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 fournit un Vector2.

challenge icon

Défi

Moyen

Déplace le géomètre et plante des drapeaux à l’aide des actions du projet.

  1. Dans Start(), définis moveAction, jumpAction et attackAction avec InputSystem.actions.FindAction("Move"), "Jump" et "Attack".
  2. Dans Update(), déplace-toi en multipliant moveAction.ReadValue<Vector2>() par speed, en utilisant sa coordonnée y pour l’axe z.
  3. Appelle Plant() lorsque jumpAction.WasPressedThisFrame() est activée, et PullUp() lorsque la touche Attaque est enfoncée.

Appuie sur « Jouer », plante trois drapeaux, puis clique pour en retirer un. Ensuite, appuie sur « Vérifier ».

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 InputAction moveAction;
    private InputAction jumpAction;
    private InputAction attackAction;
    private List<GameObject> planted = new List<GameObject>();

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

    void Update()
    {
        // se déplacer avec Move, appeler Plant() lors d’un appui sur Jump et PullUp() lors d’un appui sur Attack
    }

    void Plant()
    {
        if (flags == 0) return;
        Vector3 spot = new Vector3(transform.position.x, 0.75f, transform.position.z);
        planted.Add(Instantiate(flagPrefab, spot, Quaternion.identity));
        flags--;
        Debug.Log("Flags left: " + flags);
    }

    void PullUp()
    {
        if (planted.Count == 0) return;
        GameObject last = planted[planted.Count - 1];
        planted.RemoveAt(planted.Count - 1);
        Destroy(last);
        flags++;
        Debug.Log("Flags left: " + flags);
    }
}

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

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