NodeWorld

Interaction et commandes

L'interaction se passe dans le jeu de chaque joueur : le joueur qui utilise ou attrape un objet reçoit le callback dans son propre jeu. Pour le montrer aux autres, synchronise-le (objets et valeurs synchronisés) ou envoie un événement (événements réseau). Le serveur n'a pas de joueur : ces appels y sont refusés, alors fais-les dans un script marqué [ClientOnly] ou derrière if (!World.isServer).

Des objets que les joueurs utilisent

csharp
using NodeWorld.Flux;

namespace MonMonde
{
    public class Sonnette : FluxScript
    {
        public AudioSource carillon;

        protected override void Start()
        {
            if (World.isServer) return;
            Interaction.SetInteractable(gameObject, true);
            Interaction.SetText(gameObject, Player.language == "fr" ? "Sonner" : "Ring");
        }

        protected override void OnInteract() => carillon.Play();
    }
}
  • Interaction.SetInteractable(go, true) : les joueurs visent l'objet et l'utilisent (la gâchette en VR, le clic gauche au clavier et à la souris : voir les commandes) : OnInteract() tourne sur les scripts de cet objet, dans le jeu de ce joueur.
  • L'objet a besoin d'un collider, sur lui ou sur un enfant ; un collider en trigger marche aussi. Sans collider, le journal dit 'Sonnette' has no collider: it cannot be clicked.
  • Interaction.SetText(go, texte) : le texte qu'un joueur voit en visant l'objet (« S'asseoir », « Enlever »…) ; vide : aucun. GetText(go) le lit.
  • SetInteractable(go, false) l'éteint.

Des objets que les joueurs attrapent

  • Interaction.SetGrabbable(go, true) : les joueurs prennent l'objet en main. OnGrab() et OnDrop() tournent dans le jeu de ce joueur ; tant qu'il le tient, la gâchette donne OnUseDown() et OnUseUp().
  • Il a besoin d'un collider ('Tasse' needs a collider to be grabbed.) et reçoit un Rigidbody s'il n'en a pas. Son Rigidbody décide comment il est lâché : kinematic, il reste là où on le lâche ; sinon, il est lancé.
  • Interaction.SetGrabOptions(go, exactGrip, allowTheft) : exactGrip le garde là où la main l'a pris (sinon il se place dans la main) ; allowTheft laisse un autre joueur le prendre dans la main qui le tient.
  • Interaction.IsHeld(go), Interaction.GetHand(go) (Hand.Left, Hand.Right ou Hand.None), Interaction.GetHeld(hand) et Interaction.Drop(go) pour le joueur local.

Un objet s'attrape ou s'utilise, pas les deux : 'Tasse' is interactable: an object is grabbable or interactable, not both (a grabbable gets OnUseDown / OnUseUp).

Un objet attrapé ne reste dans la main que d'un seul joueur, sauf si tu le synchronises : donne-lui un Network Id et appelle Networking.SyncTransform dans Start. L'attraper prend alors sa propriété. Le script SyncedGrabbable du monde d'exemple fait exactement ça.

Des zones où le joueur entre

Sur un objet avec un collider en trigger (Is Trigger), OnPlayerTriggerEnter() et OnPlayerTriggerExit() tournent quand le corps du joueur local y entre ou en sort. Le jeu de chaque joueur parle de son propre joueur : une zone qui ouvre une porte « pour celui qui s'y tient » l'ouvre dans le jeu de ce joueur, puis la synchronise.

Pour n'importe quel collider qui entre dans un trigger (une balle, un objet), vois OnTriggerEnter dans physique.

Touches, boutons et joysticks

Input lit les commandes du joueur local à chaque image :

Input.GetKey(key), GetKeyDown(key), GetKeyUp(key)Une touche du clavier (Key.Space, Key.E, Key.F1…), pour les joueurs sur ordinateur.
Input.GetButton(button), GetButtonDown(button), GetButtonUp(button)InputButton.Jump, Use (gâchette de l'une ou l'autre main), Grab (Grip de l'une ou l'autre main), LeftTrigger, RightTrigger, LeftGrip, RightGrip, LeftPrimary, RightPrimary (A, X), LeftSecondary, RightSecondary (B, Y), Down (s'accroupir ; C ou Ctrl sur ordinateur).
Input.GetAxis(axis)InputAxis.MoveHorizontal, MoveVertical (-1 à 1), LookHorizontal, LookVertical, et l'enfoncement de chaque gâchette et de chaque Grip (LeftTrigger… 0 à 1).
Input.isDesktopLe joueur joue au clavier et à la souris.

Certaines touches et certains boutons sont au joueur et se lisent toujours comme non enfoncés : Échap, P, Maj+R, et Y sur la manette gauche. Pendant que le joueur tape dans un champ de texte, tes scripts ne reçoivent aucune touche. Voir ce qu'un script ne peut pas bloquer et les champs de texte.