NodeWorld

Sièges

Un siège est un script FL# de ton monde : NodeWorld n'a pas de composant de siège. Le script se sert de trois choses de Player (joueurs) :

  • Player.sittingPoint = siege : l'avatar prend sa pose assise sur le transform siege, sa racine (le sol sous ses hanches) sur le point, tournée vers l'avant du point, et le suit quand il bouge. Sa tête et ses mains suivent toujours le joueur. null le relève.
  • Player.sittingEyeOffset : où sont les yeux de l'avatar assis, depuis le point, dans l'espace du point. Vector3.zero sans avatar.
  • Player.Teleport : le script place la vue du joueur là où sont les yeux de l'avatar.

Seul le joueur local s'assoit, dans son propre jeu ; les autres le voient assis par la pose de son avatar.

Une chaise

csharp
using NodeWorld.Flux;

namespace MonMonde
{
    [ClientOnly]
    public class Chaise : FluxScript
    {
        public Transform sortie;    // où le joueur se relève ; vide : la chaise elle-même
        private bool _assis;
        private float _gravite;
        private bool _immobile;

        protected override void Start()
        {
            Interaction.SetInteractable(gameObject, true);
            Interaction.SetText(gameObject, "S'asseoir");
        }

        protected override void OnInteract()
        {
            if (_assis) return;
            _assis = true;
            _gravite = Player.gravityStrength;
            _immobile = Player.immobilized;
            Player.gravityStrength = 0f;
            Player.immobilized = true;
            Player.sittingPoint = transform;
            var yeux = Player.sittingEyeOffset;
            if (yeux == Vector3.zero)   // pas d'avatar : 0,77 de la hauteur des yeux debout, comme les sièges de La Guinguette
                yeux = new Vector3(0f, 0.77f * (Player.headPosition.y - Player.GetTrackingPosition(TrackingPoint.Origin).y), 0f);
            PlacerVue(transform.position + transform.rotation * yeux, transform.eulerAngles.y);
        }

        protected override void Update()
        {
            if (_assis && Input.GetButtonDown(InputButton.Jump)) Lever();
        }

        // Réapparaître relève le joueur et lui rend ses propres mouvements.
        protected override void OnPlayerRespawn() => _assis = false;

        private void Lever()
        {
            _assis = false;
            Player.sittingPoint = null;
            Player.gravityStrength = _gravite;
            Player.immobilized = _immobile;
            var place = sortie != null ? sortie : transform;
            Player.Teleport(place.position, place.eulerAngles.y);
        }

        // Pose les yeux du joueur en "yeux", tournés vers "lacet" : en VR, la tête n'est pas au-dessus de l'origine de l'espace de jeu.
        private static void PlacerVue(Vector3 yeux, float lacet)
        {
            var origine = Player.GetTrackingPosition(TrackingPoint.Origin);
            var tour = Mathf.DeltaAngle(Player.headRotation.eulerAngles.y, lacet);
            var tete = Quaternion.Euler(0f, tour, 0f) * (Player.headPosition - origine);
            Player.Teleport(yeux - tete, Player.GetTrackingRotation(TrackingPoint.Origin).eulerAngles.y + tour);
        }
    }
}

Mets-le sur un objet posé au sol sous l'assise, tourné vers l'avant de la chaise : la racine de l'avatar va là, ses hanches au-dessus. Donne-lui un collider, sur lui ou sur un enfant, pour que les joueurs puissent le viser.

Des sièges qui bougent

Sur un véhicule, le siège bouge sous le joueur : dans LateUpdate, applique au joueur son déplacement et sa rotation depuis l'image précédente avec Player.Teleport(position, rotation). Cette forme incline la vue avec le siège quand le véhicule tangue et roule ; Player.Teleport(position, yRotationDegrees) et Réapparaître la remettent droite.

Ce que le joueur garde

Le joueur peut toujours ouvrir le menu et choisir Réapparaître (ou appuyer sur Maj+R) : NodeWorld le relève, lui rend ses propres mouvements (pas immobilisé, gravité 1, ses vitesses) et le ramène au point d'apparition. Ton script reçoit OnPlayerRespawn() (ce qu'un script ne peut pas bloquer).