Zum Inhalt springen

FOS Teleport

Version 1.0.1 · benötigt FOS Essentials Core 1.0.0 oder neuer

Einseitiger Teleport A → B, mit drei Auslösern. Benötigt FOS Essentials Core 1.0.0.


Komponente Auslöser Nötig am GameObject
FOSTeleportInteract Interaktion der Spielenden („Use”) Ein Collider
FOSTeleportTrigger Betreten eines Volumens Ein Collider mit aktiviertem Is Trigger
FOSTeleportButton Klick auf einen UI-Button Ein im Inspektor referenzierter Button

Alle drei leiten von FOSTeleporterBase ab, die das Ziel, die Optionen und die Bewegung selbst enthält. Ein vierter Auslöser kostet eine Klasse von drei Zeilen.

Menü: Add Component > FOS Essentials > Teleport > ...


  1. Setze die Komponente auf das Objekt, das den Teleport auslöst.
  2. Erstelle ein leeres GameObject dort, wo die Person ankommen soll, drehe es in die gewünschte Richtung und ziehe es in Destination. Verwendet wird seine Drehung, nicht nur seine Position.
  3. Für die Button-Variante: Ziehe den Button in sein Feld und klicke auf Wire this Button. Das OnClick wird automatisch ausgefüllt.

Option Wirkung
Keep momentum Behält die Geschwindigkeit bei. Standardmäßig aus: mit voller Geschwindigkeit anzukommen lässt die Person rutschen oder fallen.
Align play space Nur VR. Dreht den gesamten Spielbereich zum Ziel, nicht nur die Person. Sinnvoll, wenn das Ziel genau angeschaut werden muss.
Cooldown Sekunden, bis der Teleporter erneut auslösen kann. Standard 0,5 s.
Teleport sound Lokal abgespielte AudioSource. Optional.
On teleport Komponenten, die über das öffentliche Event OnFOSTeleported() benachrichtigt werden.

Die VRChat-API weigert sich, eine entfernte Person zu bewegen — ClientSim sagt es ausdrücklich: „Teleporting remote players will do nothing”. Jeder Client bewegt also seine eigene Person. Folgen:

  • kein Netzwerk, kein Ownership, keine Bandbreite;
  • wer teleportiert wird, ist es für alle, denn VRChat synchronisiert die Position ohnehin;
  • jemand anderen zu teleportieren ist mit dieser Komponente unmöglich. Das wäre ein anderes Werkzeug, mit Synchronisierung.

OnPlayerTriggerEnter feuert auf jedem Client, für jede Person, die das Volumen betritt. Ohne Filter würde eine entfernte Person, die durch den Trigger läuft, die lokale Person am anderen Ende der Welt teleportieren. FOSTeleportTrigger prüft zuerst player.isLocal.

Liegt das Ziel von A im Volumen von B und umgekehrt, pendelt die Person endlos. Der Cooldown begrenzt den Schaden, aber die eigentliche Lösung ist, den Ankunftspunkt außerhalb des Volumens des gegenüberliegenden Teleporters zu setzen.

Die Cooldown-Sperre wird vor der Bewegung gesetzt: Ein Teleport lässt die Person Volumen verlassen und betreten, und diese Ereignisse können im selben Frame zurückkommen.


Ein neuer Auslöser ist nur eine Klasse, die von FOSTeleporterBase ableitet und TeleportLocalPlayer() aufruft:

using UdonSharp;
using UnityEngine;
namespace FOS.Teleport
{
[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
public class FOSTeleportOnTimer : FOSTeleporterBase
{
private void Start()
{
SendCustomEventDelayedSeconds(nameof(TeleportLocalPlayer), 10f);
}
}
}

Zur Erinnerung: Der Klassenname muss exakt dem Dateinamen der .cs entsprechen, und das Program Asset wird beim nächsten Laden des Editors von selbst erzeugt.