Ich versuche, einen relativ einfachen Aufzug zu bauen (der den Spieler im Wesentlichen teleportiert), aber ich möchte nicht, dass er sie sofort teleportiert. Ich möchte, dass der Spieler den Collider betritt, 2-3 Sekunden wartet und es dann so macht, dass es etwas natürlicher erscheint.
Mein bisheriger Code:
using UnityEngine;
using System.Collections;
public class Teleporter : MonoBehaviour
{
public GameObject TeleportTo;
//public Material NewSkybox;
void TimerInvoke()
{
}
void OnTriggerEnter(Collider other)
{
Vector3 displacement = other.transform.position - this.transform.position;
other.transform.position = TeleportTo.transform.position;
other.transform.position += displacement;
//RenderSettings.skybox = NewSkybox;
}
}
Auch wenn möglich möchte ich mich von Coroutinen entfernen. Wie soll ich das machen?
Antworten:
Normalerweise mache ich das mit Coroutines, aber da Sie sehr genau waren, dass Sie sie vermeiden möchten, könnten Sie in Ihrem Fall vielleicht etwas ganz Einfaches ausprobieren, wie:
Natürlich können Anpassungen vorgenommen werden, je nachdem, wie lange Sie warten möchten. Bedenken Sie auch, dass deltaTime nicht in jedem Frame gleich ist. Wenn Sie also für Ihr Warten Präzision auf wissenschaftlicher Ebene benötigen, sind wahrscheinlich einige Anpassungen erforderlich. Aber ich denke, Sie haben die Idee, was der Code tut.
Vielleicht auch von Interesse, sehen Sie sich diese Implementierung einer WaitUntil-Funktion an, die genau zur Vermeidung von Coroutinen erstellt wurde: http://theinstructionlimit.com/a-replacement-for-coroutines
BEARBEITEN: Obwohl die Antwort nur die Absicht hatte, eine grundlegende Vorstellung davon zu geben, wie mit dem OP umgegangen werden soll, habe ich beschlossen, die Bool-Variable "Trigger" als einfache Möglichkeit einzuschließen, um zu vermeiden, dass der Code die gewünschte Aktion startet (in diesem Fall) , die Funktion "TeleporPlayer"), wenn der Code initialisiert wird. Auf diese Weise wird das Leben zukünftiger lernender Leser einfacher.
quelle
Sie können auch Invoke verwenden, um dies zu erreichen.
quelle
Verwenden Sie Coroutinen. Sie können
yield return new waitforseconds(3);
in der TeleportPlayer-Methode sehen. Das wird 3 Sekunden warten, bevor der Spieler teleportiert wird. Denken Sie jedoch daran, dass nur die Ausführung der nächsten Zeile innerhalb der Coroutine angehalten wird. Alle anderen Methoden werden weiterhin ausgeführt.quelle
Natürlich können Sie dies im Code tun, aber mein Ansatz ist etwas "natürlicher".
In Ihrem Beispiel - Aufzug - werde ich Folgendes tun:
Sie müssen also nicht alles per Code optimieren, aber Sie würden dies in Animationen tun, damit es einfacher und natürlicher ist.
quelle