Teleportation

Enkel setup

Det behöver finnas en Locomotion System-komponent och en Teleportation Provider-komponent nÄgonstans i scenen. Enklast Àr att bara lÀgga till dem i XR Origin-objektet.

SÄ lÀnge VR-handkontrollerna har Ray Interactors Àr detta den enda setup som behövs.

Giltiga mÄl för teleportationen

Det finns tvÄ sorters objekt som kan teleporteras till: Area och Anchor. I bÄda fallen genomförs teleportationen genom att spelaren markerar mÄlobjektet och trycker pÄ en knapp för att genomföra teleportationen.

Objekt med en Teleport Area-komponent lÄter spelaren teleporteras till den exakta punkt pÄ objektet som hen pekade pÄ. Oftast Àr detta ett objekt med ett Plane-mesh.

Objekt med en Teleport Anchor-komponent lÄter spelaren teleporteras till objektet mittpunkt.

De har ett antal viktiga instÀllningar gemensamma:

  • Interaction Layer Mask: För att skilja teleportation frĂ„n andra typer av interaktion kan det vara praktiskt att ge teleportations-mĂ„l ett eget Interaction Layer och se till sĂ„ att de enbart finns pĂ„ detta lager. Om du anvĂ€nder den fĂ€rdiga prefaben för din XR Rig sĂ„ utgĂ„r dess XR controllers frĂ„n att lager 31 Ă€r teleportationslagret.

  • Custom Reticle: Ett objekt som skapas nĂ€r spelaren markerar objektet och placeras dĂ€r hen planeras dyka upp efter teleportationen.

  • Teleportation Configuration Ă€r en liten undermeny – den viktigaste hĂ€r Ă€r nog Teleport Trigger, som Ă€r den hĂ€ndelse som fĂ„r teleportationen att utföras. HĂ€r kan man bara vĂ€lja mellan Select (greppknapp) och Activate (avtryckare).

Avancerad setup

Hela den hÀr delen Àr inspirerad av den hÀr videon: https://www.youtube.com/watch?v=9dc1zq8eH54

Ett vanligt sÀtt att dela upp interaktionen i VR-projekt Àr att lÄta anvÀndaren plocka upp saker och interagera med miljön med sina egna hÀnder (Direct Interaction), och anvÀnda VR-handkontrollens joystick för att teleportera (Ray interaction). Normalt kan man bara ha en sorts interactor per XR Controller.

Dela upp scenens interagerbara objekt via interaction layers. Ett exempel pÄ hur det kan göras Àr att skapa ett lager med namnet "intractables" och se till sÄ att alla vanliga interagerbara objekt Àr pÄ det lagret, men att inga av teleporterings-mÄlen Àr det.

De hÀr instruktionerna kommer att anvÀnda tvÄ fördefinierade InputActions som finns i XRI Default Input Actions-asseten: Locomotion/Teleport Mode Activate och Locomotion/Teleport Select. Det finns separata Input Actions för vÀnster och höger hand.

Normalt anropas Mode Activate av att spelaren drar styrspaken pÄ VR-handkontrollen framÄt, och Select anropas av att spelaren slÀpper styrspaken.

XR-controllers

Instruktionerna nedan beskriver hur Left Hand-controllern anpassas för det nya sÀttet att teleportera och interagera. Samma steg anvÀnds för Right Hand; det enda som behöver Àndras Àr vilket spelobjekt som modifieras och vilken hands kontroller och liknande som anvÀnds.

Markera XR Origin -> Camera Offset -> LeftHand Controller. Ta bort alla komponenter som har med Ray Interactorn att göra: XR Ray Interactor, XR Interactor Line Visual och Line Renderer.

LÀgg till en Direct Interactor och en Sphere Collider. VÀlj radie 0.1 för collidern och gör den till en trigger. Se till sÄ att Direct Interaction har med Interactable-lagret i sin Layer mask.

Högerklicka pÄ LeftHand Controller och vÀlj XR -> Ray Interactor (Action-based). Det lÀgger till ett nytt objekt under LeftHand Controller, med standardnamnet Ray Interactor. Tryck Enter för att acceptera namnet, och se till sÄ objektet Àr markerat.

Gör följande Àndringar:

  • Kryssa ur Enable Input Tracking. Objektet kommer redan att flyttas genom att det ligger under den vanliga LeftHand-controllern.

  • Kryssa ur Use Reference för Rotate Anchor Action och Translate Anchor Action. Den hĂ€r interactorn ska inte vrida och vĂ€nda pĂ„ objekt den interagerar med.

  • Se till sĂ„ Model Prefab Ă€r tom.

  • Skapa och lĂ€gg till RayToggler-scriptet (se nedan), och dra in XRI LeftHand Locomotion/Teleport Mode Activate till dess Input Action-referens.

RayToggler

Nedan finns ett exempel pÄ hur ett script för att vÀxla huruvida en Ray Interactor Àr aktiv (enabled) beroende pÄ en InputActions avfyrade actions.

Scriptet har alltsÄ en referens till en InputActionReference, som senare kopplas (enligt instruktionerna ovan) till XRI LeftHand Locomotion/Teleport Mode Activate eller dess högerhands-motsvarighet.

Den har ocksÄ en referens till den XRRayInteractor-komponent som ska aktiveras eller avaktiveras, och en bool-variabel som hÄller reda pÄ ifall den ska vara aktiveras eller avaktiverad just nu. RequireComponent anvÀnds ovanför klassdeklarationen för att sÀkerstÀlla att det alltid finns en sÄdan komponent.

NÀr objektet skapas, hÀmtar det en referens till interactorn.

NĂ€r scriptet aktiveras (OnEnable) sĂ„ lĂ€ggs metoden ToggleRay till InputActionens started och canceled-metoder, och nĂ€r det deaktiveras (OnDisable) sĂ„ tas den bort dĂ€rifrĂ„n. Det gör att det bara Ă€r nĂ€r scriptet Ă€r aktivt som det har nĂ„gon effekt – sĂ„ teoretiskt sett kan man bygga andra script som i sin tur aktiverar eller stĂ€nger av det hĂ€r scriptet.

ToggleRay-metoden ser helt enkelt till sÄ att isEnabled-variabeln har rÀtt vÀrde beroende pÄ om metoden avfyrades av att "knappen" trycktes ner (i det hÀr fallet: att styrspaken dras framÄt) eller av att den slÀpptes upp igen.

Sedan i LateUpdate, sÄ ser scriptet till sÄ att XRRayInteractor-komponentens lÀge synkas med isEnabled-variabeln.

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.XR.Interaction.Toolkit;

[RequireComponent(typeof(XRRayInteractor))]
public class RayToggler : MonoBehaviour
{
  [SerializeField]
  private InputActionReference inputAction = null;

  private XRRayInteractor interactor = null;
  private bool isEnabled = false;

  private void Awake()
  {
    interactor = GetComponent<XRRayInteractor>();
  }

  private void OnEnable()
  {
    inputAction.action.started += ToggleRay;
    inputAction.action.canceled += ToggleRay;
  }

  private void OnDisable()
  {
    inputAction.action.started -= ToggleRay;
    inputAction.action.canceled -= ToggleRay;
  }

  private void ToggleRay(InputAction.CallbackContext context)
  {
    isEnabled = context.control.IsPressed();
  }

  private void LateUpdate()
  {
    if (interactor.enabled != isEnabled)
    {
      interactor.enabled = isEnabled;
    }
  }
}

Last updated