Der Rauch und die Spiegel der guten Countdowns, Teil 2

Was Sie erstellen werden

Letztes Mal haben wir Countdowns in Spielen betrachtet, wie sie eingerichtet werden und welche Elemente Sie verwenden können, um sie attraktiver zu machen. Es gibt jedoch viel mehr, als in einen einzelnen Artikel passt!

Dies wird ab Teil 1 fortgesetzt, weshalb wir bei Nummer sieben beginnen werden.

Bereit? Lass uns gehen!

7: Habe eine andere konstante Tickgeschwindigkeit

Dies ist ein einfacher Trick, bei dem Sie nicht einmal den Spieler anlügen müssen. Sie sagen einfach "Wenn der Timer abgelaufen ist" und zeigen eine tickende Uhr. Was Sie nicht erwähnen, ist das Einheit das wird gezeigt.

Wenn Sie eine "10" anzeigen, wird der Player wissen, dass dies 10 Sekunden sind, aber die Anzahl kann langsamer abnehmen als Sekunden. Wenn Sie den Wert mit a ändern 0,5 Multiplikator, zum Beispiel wird es danach ausgehen 20 Sekunden statt nur 10.

Wie das funktioniert, kannst du in meinem Ludum-Dare-Spiel Alle zehn Sekunden ein Kätzchen ertrinken sehen.

Ein Timer in Alle zehn Sekunden ertrinkt ein Kätzchen. Der Timer ist langsam genug, um dem Spieler eine ziemlich lange Zeit zu geben, während er immer noch sehr niedrig erscheint

Das Thema der Marmelade machte das notwendig 10 Sekunden werden verwendet, aber 10 tatsächliche Sekunden sind viel zu wenig Zeit, um etwas Sinnvolles zu erreichen.

8: Passen Sie die Ticking-Geschwindigkeit während des Spiels an

Dies funktioniert auch besser, wenn keine Zeiteinheiten erwähnt werden und der Spieler nur eine ungefähre Vorstellung davon erhält, "bis dies passiert"..

Wenn Sie eine Reihe von Anzeigen haben, die aufleuchten, um den Fortschritt des Timers anzuzeigen, müssen Sie diese nicht mit der gleichen Geschwindigkeit aktivieren. In der Tat wird es intensiver, wenn die ersten wenigen schnell aufleuchten und die letzteren mehr Zeit zwischen sich haben. In der Hitze des actiongeladenen Gameplays wird der Spieler dies nicht bemerken und wird eine viel intensivere Erfahrung haben.

Dies sollte nicht mit tatsächlichen Zeiteinheiten verwendet werden, da sich Spieler als betrogen und belogen fühlen könnten. Brechen Sie das Vertrauen des Spielers in Ihr System nicht.

Dies ist in einer Ebene von Starfox 64 zu sehen, wo der Spieler eine Position gegen ein sich näherndes riesiges Schiff verteidigen muss.

Minimap in Starfox 64. Das angreifende Mutterschiff (der schwarze Kreis) bewegt sich in der Mitte auf die Basis zu und gibt dem Spieler eine grobe tickende Uhr, wie viel Zeit noch übrig ist, um es zu zerstören

Auf den ersten Blick erhalten Sie eine ungefähre Vorstellung davon, wie viel Zeit noch übrig ist, aber das Schiff selbst scheint sich mit unterschiedlichen Geschwindigkeiten und nicht in einer geraden Linie zu bewegen.

Der Timer wird im Wesentlichen fliegend angepasst, wobei der Prozess hinter Rauch und Spiegeln verborgen ist.

9: Sounds verwenden

Countdowns müssen nicht rein optisch sein! Ein Signalton alle paar Sekunden verbessert das Eintauchen erheblich.

Danach können Sie die Frequenz auch nach Ablauf einer bestimmten Zeit anpassen. Wenn der Piepton alle fünf Sekunden ertönt, wird der Spieler in den letzten 30 Sekunden des Timers benachrichtigt, ohne sich die Anzahl ansehen zu müssen und im Kopf zu berechnen, wie viel noch übrig ist.

Ähnlich hilft es auch, wenn ein Charakter den Fortschritt kommentiert. Jemand sagen "Wir sind halb fertig!" gibt Ihnen eine gut gerahmte Information, die viel einfacher zu verstehen ist als das Analysieren einer Anzeige.

10: Verwenden Sie Scaling Visuals

Dies funktioniert sehr gut, wenn der Zähler sich seinem Ende nähert. Wenn eine weitere Sekunde verstrichen ist, erhöhen Sie den gesamten Zähler um eine halbe Sekunde.

Neben Farbe und Klang wird es dadurch noch saftiger.

11: Etwas tun, wenn es null erreicht

Stellen Sie sicher, dass ein Timer niemals negativ wird - dies wird für viele Leute verwirrend sein und erscheint wie ein Fehler, da fehlerbehaftete, schlecht erstellte Timer dazu neigen, dies zu tun.

Ein Blitz wäre eine nette Geste, denn es unterstreicht erneut den Punkt, an dem es knapp geworden ist.

Wenn Sie einen positiven Timer haben, ist es ein lustiges Element, wenn Sie einfach weiterlaufen lassen und dieses Element als Highscore verwenden. Das Spiel Teufelsdolche macht eine ähnliche Sache, wo das Hauptziel "500 Sekunden überleben" ist.

Gameplay von Teufelsdolche

Was nicht zu tun wäre, würde das Vertrauen des Spielers brechen

Sobald die Regeln eines Timers festgelegt sind, sollten sie erhalten bleiben grob konsistent, mit mehr Spielraum ist der Timer weniger genau. Die Hauptfrage sollte lauten: "Wie profitiert diese verborgene Regel von der Erfahrung?"

Wenn Sie einen Timer in den letzten drei Sekunden verlangsamen, wird die Situation angespannter und der Spieler erhält ein paar weitere Sekunden, um Dinge zu erledigen. Wenn Sie es zufällig in der Mitte verlangsamen oder beschleunigen, wird nur das Vertrauen des Spielers in Ihre Regeln gebrochen.

Lass es uns bauen

Dies wird mit der Code-Basis des letzten Tutorials fortfahren und darauf aufbauen. Wenn Sie es noch nicht überprüft haben, tun Sie es jetzt! Sie können die fertige Quelle auch oben rechts in diesem Artikel herunterladen.

Als wir unseren Timer zuletzt verlassen haben, sah das so aus:

Jetzt wird es durch neue Ergänzungen interessanter. Wir werden mit dem fortfahren countdown.cs-script, was sollte so aussehen:

mit UnityEngine; using System.Collections; öffentliche Klasse Countdown: MonoBehaviour Float-Timer = 60f; öffentlicher AudioClip soundBlip; void Update () if (Timer> 0f) Timer - = Time.deltaTime;  else timer = 0f;  if (Timer < 10f)  GetComponent() .color = Color.red;  else if (Timer < 20f)  GetComponent() .color = Color.yellow;  GetComponent() .text = Timer.ToString ("F2");  

Lass es piepen

Lassen Sie den Timer jede Sekunde piepen, damit der Spieler weiß, dass er abnimmt, ohne ihn anzusehen.

Zuerst brauchen wir ein schönes blip Sound-Effekt. Sie können eine Audiodatei in den Quelldateien finden oder eine nette mit dem kostenlosen Tool BFXR erstellen. Sobald Sie einen haben, kopieren Sie ihn in Ihren Asset-Ordner.

Fügen Sie Ihrem Countdown-Objekt über eine AudioSource-Komponente hinzu Komponente> Audio> AudioSource. Fügen Sie diese Variable dem Countdown-Skript hinzu:

öffentlicher AudioClip soundBlip;

Sie müssen die Sounddatei auch dem zuordnen soundBlip Variable:

Und füge diesen Block dem hinzu Aktualisieren Funktion:

if (Mathf.Round (Timer * 100) / 100% 1f == 0) GetComponent() .PlayOneShot (soundBlip); 

Dadurch wird geprüft, ob der Timer die volle Sekundenmarke erreicht hat. Falls ja, spielen Sie die Sounddatei ab.

Die eigentliche Funktionsweise dieses Codes ist etwas komplizierter. Der Gleitpunkt-Timer wird zuerst auf zwei Dezimalstellen gerundet, dann durch 1 dividiert und nach einem Rest gesucht. Ist der Rest gleich Null, bedeutet dies, dass der Timer eine volle Sekunde erreicht hat und der Blip-Sound abgespielt werden kann.

Wenn Sie dies nicht tun, wird das System möglicherweise viel öfter ausgelöst, was für einen guten Timer keinen Spaß macht.

Unterschiedliche Geschwindigkeit

Dadurch wird ein Multiplikator hinzugefügt, der die Geschwindigkeit des tickenden Takts verringert oder beschleunigt. Fügen Sie diese Variable am Anfang hinzu:

Float-Multiplikator = 0,6f;

Finden Sie jetzt die Zeile, die den Timer reduziert - es ist diese:

Timer - = TimeDeltaTime;

Und passen Sie es so an:

Timer - = Time.deltaTime * Multiplikator;

Wenn der Multiplikator unten ist 1,0 Der Timer läuft jetzt langsamer und wenn er oben ist 1,0 es wird schneller laufen. Setzen Sie es auf 1,0 werde nichts tun.

Versuchen Sie zu experimentieren, um einen guten Wert zu finden! Ich fühle eine etwas niedrigere Geschwindigkeit 0,85f, wird der Spieler die tickende Uhr mehr fühlen.

Verlangsamen Sie, wenn niedrig

Nun, da wir eine Multiplikator-Komponente haben, können wir sie während des Spiels ändern!

Gehen Sie zu dem Farbänderungsblock des Codes:

wenn (Timer) < 10f)  GetComponent() .color = Color.red;  else if (Timer < 20f)  GetComponent() .color = Color.yellow; 

Hier haben wir bereits die Bedingungen, unter denen eine Änderung der Tickgeschwindigkeit angemessen wäre, sodass wir sie einfach hinzufügen können!

wenn (Timer) < 10f)  GetComponent() .color = Color.red; Multiplikator = 0,6f;  else if (Timer < 20f)  GetComponent() .color = Color.yellow; Multiplikator = 0,8f;  else multiplier = 1.0f; 

Wenn der Timer gelb wird 20 Sekunden wird es jetzt mit 80% Geschwindigkeit ticken. Sobald sie rot wird, sinkt sie auf 60% Normalgeschwindigkeit. Andernfalls wird die Geschwindigkeit auf 100% gesetzt.

Skalierung wenn niedrig

Eine weitere großartige Möglichkeit, um einen Zeitgeber zur Neige zu bringen, besteht darin, ihn im Sekundentakt jede Sekunde zu erhöhen. Da wir bereits Code haben, der jede Sekunde ausgelöst wird, können wir ihn weiter anpassen!

Erstens benötigen wir eine Funktion, um die Größe unserer Anzeige zu vergrößern oder verkleinern. Fügen Sie diese Funktion hinzu:

private bool isBlinking = false; private IEnumerator Blink () isBlinking = true; float startScale = transform.localScale.x; transform.localScale = Vector3.one * startScale * 1.4f; Rendite Rendite neue WaitForSeconds (0.3f); transform.localScale = Vector3.one * startScale; isBlinking = false; 

Das ist ein IEnumerator, Dies ist eine Art von Funktion, die Wait-Befehle enthalten kann. Wir brauchen die isBlinking Variable, um sicherzustellen, dass wir es nicht mehrmals aufrufen.

Nach dem Start wird die Objektgröße um den Faktor 1,4f vergrößert, 0,3 Sekunden gewartet und dann wieder auf die Originalgröße verkleinert.

Wir nennen es mit diesem speziellen Code:

if (Mathf.Round (Timer * 100) / 100% 1f == 0) GetComponent() .PlayOneShot (soundBlip); wenn (Timer) < 10f)  if(!isBlinking)  StartCoroutine(Blink());   

Ein IEnumerator muss durch Aufrufen über gestartet werden StartCoroutine, Sonst funktioniert es nicht.

Der gesamte Block wird aufgerufen, wenn eine Sekunde verstrichen ist. An diesem Punkt können wir überprüfen, ob der Timer niedrig genug ist, um zu blinken.

Blinzeln bei null

Lassen Sie uns etwas tun, wenn der Timer abgelaufen ist. Es einfach langweilig zu haben, kann es langweilig werden, also blinzeln.

Zuerst brauchen wir noch einen IEnumerator Funktion:

private bool isZeroBlinking = false; privater IEnumerator ZeroBlink () isZeroBlinking = true; GetComponent() .enabled = false; Rendite Rendite neue WaitForSeconds (1.5f); GetComponent() .enabled = true; Rendite Rendite neue WaitForSeconds (1.5f); isZeroBlinking = false; 

Dadurch wird der Timer ein- und ausgeschaltet 1,5-zweite Intervalle. Trigger es in dem Block, der bereits prüft, ob der Timer Null ist.

if (Timer> 0f) Timer - = Time.deltaTime * Multiplikator;  else timer = 0f; if (! isZeroBlinking) StartCoroutine (ZeroBlink ()); 

Bevor Sie es ausführen, müssen Sie den Piepton und das Blinken bei Null selbst deaktivieren, da sonst das Verhalten kollidiert.

Passen Sie die Bedingungen im Block an, um zu prüfen, ob eine Sekunde vergangen ist, und um zu prüfen, ob die aktuelle Uhrzeit mehr als Null ist:

if (Mathf.Round (Timer * 100) / 100% 1f == 0 && Timer> 0f) GetComponent() .PlayOneShot (soundBlip); wenn (Timer) < 10f && timer > 0f) if (! IsBlinking) StartCoroutine (Blink ()); 

Dadurch wird sichergestellt, dass das regelmäßige Blinken und das Nullblinken ohne gegenseitige Beeinflussung funktionieren.

Das ganze Countdown Skript sollte so aussehen:

mit UnityEngine; using System.Collections; öffentliche Klasse Countdown: MonoBehaviour Float-Timer = 5f; Float-Multiplikator = 0,6f; öffentlicher AudioClip soundBlip; void Update () if (Timer> 0f) Timer - = Time.deltaTime * Multiplikator;  else timer = 0f; if (! isZeroBlinking) StartCoroutine (ZeroBlink ());  if (Timer < 10f)  GetComponent() .color = Color.red; Multiplikator = 0,6f;  else if (Timer < 20f)  GetComponent() .color = Color.yellow; Multiplikator = 0,8f;  else multiplier = 1.0f;  if (Mathf.Round (Timer * 100) / 100% 1f == 0 && Zeitgeber> 0f) GetComponent() .PlayOneShot (soundBlip); wenn (Timer) < 10f && timer > 0f) if (! IsBlinking) StartCoroutine (Blink ());  GetComponent() .text = Timer.ToString ("F2");  private bool isBlinking = false; private IEnumerator Blink () isBlinking = true; float startScale = transform.localScale.x; transform.localScale = Vector3.one * startScale * 1.4f; Rendite Rendite neue WaitForSeconds (0.3f); transform.localScale = Vector3.one * startScale; isBlinking = false;  private bool isZeroBlinking = false; privater IEnumerator ZeroBlink () isZeroBlinking = true; GetComponent() .enabled = false; Rendite Rendite neue WaitForSeconds (1.5f); GetComponent() .enabled = true; Rendite Rendite neue WaitForSeconds (1.5f); isZeroBlinking = false;  

Dies wird die Arbeit erledigen. Sie können es natürlich eleganter gestalten und die Befehle zu einem effizienteren Code kombinieren.

Fazit

Unser Standard-Countdown ist viel interessanter und ansprechender geworden. Wenn Sie dies einmal erstellen, können Sie es verwenden und in jedes Projekt einbinden, egal wie klein es ist.

Nun geh und bring es in ein Spiel!