Kann man in Unity nach Sekunden abfragen?
Ich lasse Meteoriten jede Sekunde random spawnen. Ich wollte fragen ob ich es machen kann, dass nach zb. 30 Sekunden jede halbe Sekunde welche spawnen. Gibt es da irgendetwas?
4 Antworten
Du kannst du Klasse Time aus dem Unity Framework nutzen um die Zeit zu stoppen. Das könnte etwa so aussehen:
private float timePassed = 0.0f;
void Update() //wird bei jedem Frame aufgerufen
{
time += Time.deltaTime; //addiert die vergange Zeit seit dem letzten Frame
if (timePassed >= 30) //wenn 30 Sekunden vergangen sind
{
if (timePased % 0.5 == 0) //und die Zeit durch 0.5 teilbar ist
{
//hier deine Meteoriten spawnen
}
}
}
In der timePassed Variable merkst du dir die vergangene Zeit. Die Variable wird bei jeden Frame aktualisiert. Ist der Wert durch 0,5 teilbar, ist eine halbe Sekunde vergangen.
Das müsste man mal ausprobieren
ich persönlich gehe stark davon aus dass die Überprüfung bei jedem frame mehr Ressourcen frisst als die Timer Klasse
Zumal die Überprüfung in dem frame task im mainthread läuft
die Timer Klasse könnte man sogar auf eine eigenen thread verschieben
Eine Neuerfindung des Rads ist diese Lösung eigentlich nicht, sondern eher eine Anpassung an das ECS, auf welchem der Prozess in Unity beruht (daher wird es in den Unity Tutorials auch mit angesprochen: Delta Time).
Bei der Verwendung von Threads hingegen sollte man hier vorsichtig sein, da die Unity API-Zugriffe nicht thread-safe sind.
Erstelle ein Funktion die du nach 30 Sekunden aufrufst und benutze InvokeRepeating("Funktion",30f,0.5f); in Start();
C# besitzt eine Timer Klasse sich selbst wieder aufrufend hast du eine Endlosschleife.
https://docs.microsoft.com/de-de/dotnet/api/system.timers.timer?view=netframework-4.8
Coroutinen wären ein guter Weg, dein Problem zu lösen.
Warum das Rad neu erfinden wenn C# die richtigen Werkzeuge an Board hat.
https://docs.microsoft.com/de-de/dotnet/api/system.timers.timer?view=netframework-4.8