Fumul și oglinzile binemeritatelor, partea a 2-a

Ce veți crea

Ultima dată, ne-am uitat la numărătoare inversă în jocuri, la modul în care sunt configurate și la ce elemente puteți utiliza pentru a le face mai angajați. Există mult mai mult decât se va potrivi într-un singur articol!

Acest lucru va continua din partea 1, motiv pentru care vom începe la numărul șapte.

Gata? Sa mergem!

7: Aveți o viteză diferită de fixare constantă

Acesta este un truc simplu, care nu vă impune nici măcar să mințiți jucătorului. Spuneți doar "când cronometrul se termină" și afișați un ceas bifând. Ceea ce nu menționați este unitate care este afișat.

Dacă afișați un "10", jucătorul va intui acest lucru este de 10 secunde, dar numărul poate scădea mai lent decât secundele. Dacă modificați valoarea cu a 0.5 multiplicatorul, de exemplu, se va termina după 20 secunde în loc de doar 10.

Poți să te uiți la modul în care funcționează în jocul meu Ludum-Dare, la fiecare zece secunde o pisică se aruncă.

Un cronometru în La fiecare zece secunde o pisică se aruncă. Timerul este suficient de lent pentru a oferi jucătorului o cantitate suficientă de timp, în timp ce încă apar foarte scăzut

Tema gemului a necesitat acest lucru 10 secunde sunt utilizate, dar 10 secunde efective sunt o cantitate mult prea mică pentru a realiza ceva semnificativ.

8: Adaptați viteza de marcare în timpul jocului

Acest lucru, de asemenea, funcționează mai bine dacă unitățile de timp nu sunt menționate și jucătorul este doar dat o idee brută de "până când acest lucru se întâmplă".

Dacă aveți o serie de panouri care se aprind pentru a afișa progresul temporizat, nu este necesar să le activați la aceeași rată. De fapt, va deveni mai intens dacă primele câteva se aprind rapid, iar cele din urmă au mai mult timp între ele. În căldura de joc cu acțiune împachetată, jucătorul nu va realiza acest lucru și va avea o experiență mult mai intensă.

Acest lucru nu ar trebui să fie angajat cu unități de timp reale, deoarece jucătorii s-ar putea simți înșelat și mințit. Nu distrugeți încrederea jucătorului în sistemul dvs..

Acest lucru poate fi vazut la un nivel al Starfox 64, unde jucatorul trebuie sa apere o pozitie impotriva unei nave gigante care se apropie.

Minimap in Starfox 64. Mamă atacă (cercul neagră) se îndreaptă spre centru în mijloc, dând jucătorului un ceas bruiaj grosolan cu privire la cât timp este lăsat să-l distrugă

La prima vedere, aveți o idee grosolană despre cât timp a rămas, dar nava în sine pare să se miște la viteze diferite și nu într-o linie dreaptă.

Timerul este în esență adaptat pe zbor, procesul căruia este ascuns în spatele fumului și oglinzilor.

9: Utilizați sunete

Numărătoarea inversă nu trebuie să fie pur optică! Un sunet de beep la fiecare câteva secunde va spori considerabil imersia.

Odată ce ați făcut acest lucru, puteți adapta și frecvența după ce a trecut o anumită perioadă de timp. Dacă se produce bipul la fiecare 5 secunde, în ultimele 30 de secunde ale cronometrului, jucătorul va fi anunțat fără a fi nevoie să se uite la număr și să se calculeze mental cantitatea rămasă.

În mod similar, aceasta ajută, de asemenea, dacă un personaj comentează progresul. Dacă cineva spune "Suntem la jumătate făcuți!" vă oferă o informație bine încadrată, care este mult mai ușor de înțeles decât parsarea ei dintr-o citire.

10: Utilizați vizualizări Scaling

Acest lucru funcționează foarte bine atunci când contorul se apropie de sfârșit. Ori de câte ori survine o altă secundă, scade întregul contor pentru o jumătate de secundă.

În plus față de culoare și sunet, acest lucru va face mult mai juicier.

11: Faceți ceva când ajunge la zero

Asigurați-vă că un cronometru nu merge niciodată negativ - acest lucru va fi confuz pentru o mulțime de oameni și pare a fi un bug, așa cum bugged, timeri creat greșit tind să facă asta.

Lansarea acestuia ar fi o atingere drăguță, deoarece subliniază din nou punctul în care tocmai a ieșit.

Dacă aveți un cronometru pozitiv, este un element distractiv să îl lăsați să ruleze și să folosească acel element ca un scor mare. Jocul Diavolul Pumnii face un lucru similar, unde obiectivul principal este "Supraviețuiți 500 de secunde".

Gameplay de la Diavolul Pumnii

Ce să nu faci ar sparge încrederea jucătorului

Odată ce regulile unui cronometru au fost stabilite, acestea ar trebui să rămână aproximativ consecvent, cu mai multă libertate permisă, cu cât un timer este mai puțin exact. Întrebarea principală ar trebui să fie: "Cum beneficiază această regulă ascunsă experiența?"

Când încetini un cronometru în ultimele trei secunde, situația va fi mai tensionată și va da jucătorului câteva secunde mai efective pentru a realiza lucrurile. În mod obișnuit, încetinirea acestuia în mijloc sau accelerarea acestuia va sparge încrederea jucătorului în regulile dvs..

Să construim

Acest lucru va continua cu baza de cod din ultimul tutorial și se va baza pe acesta. Dacă nu ați verificat-o încă, faceți-o acum! De asemenea, puteți descărca sursa finalizată din partea dreaptă sus a acestui articol.

Când ne-am lăsat ultima dată timerul, arăta astfel:

Acum, adăugările noi o vor face să se comporte mai interesant. Vom continua cu countdown.cs-script, care ar trebui să arate astfel:

utilizând UnityEngine; utilizând System.Collections; clasa publică numărătoare inversă: MonoBehavior float timer = 60f; public AudioClip soundBlip; void Actualizare () if (timer> 0f) timer - = Time.deltaTime;  altfel timer = 0f;  dacă (timer < 10f)  GetComponent() .color = Color.red;  altfel dacă (timer < 20f)  GetComponent() .color = Color.yellow;  GetComponent() .text = timer.ToString ("F2");  

Faceți-o Beep

Să facem bip-ul nostru în fiecare secundă, astfel încât jucătorul să știe că scade chiar și fără să se uite la el.

În primul rând, avem nevoie de o idee bună blip efect sonor. Puteți găsi un fișier audio în fișierele sursă sau creați unul frumos utilizând instrumentul gratuit BFXR. Odată ce aveți unul, copiați-l în dosarul dvs. de materiale.

Adăugați o componentă AudioSource la obiectul numărătoare inversă prin Componentă> Audio> Sursă audio. Adăugați această variabilă în scriptul de numărătoare inversă:

public AudioClip soundBlip;

De asemenea, trebuie să alocați fișierul de sunet la soundBlip variabil:

Și adăugați acest bloc la Actualizați funcţie:

dacă (Mathf.Round (timer * 100) / 100% 1f == 0) GetComponent() .PlayOneShot (soundBlip); 

Acest lucru va verifica dacă timerul se află la cel de-al doilea semnal complet, iar dacă este așa, redați fișierul de sunet.

Lucrările actuale ale acestui cod sunt ceva mai complicate. Ceea ce face este prima rundă a timerului cu virgulă mobilă la două puncte zecimale, apoi împărțiți-l cu 1 și vedeți dacă există un rest. Dacă restul este zero, înseamnă că temporizatorul a atins o secundă completă, iar sunetul blip poate fi redat.

Dacă nu facem acest lucru, sistemul ar putea declanșa mult mai des, ceea ce nu va fi distractiv și nu va conduce la un timp bun.

Viteza diferită

Aceasta va adăuga un multiplicator care va reduce sau accelera viteza ceasului de bifare. Adăugați această variabilă la început:

float multiplicator = 0.6f;

Acum găsiți linia care reduce timer-ul este:

timer - = Time.deltaTime;

Și adaptați-o astfel încât să arate astfel:

timer - = Time.deltaTime * multiplicator;

Dacă multiplicatorul este mai jos 1.0 cronometrul va funcționa mai lent și dacă este mai sus 1.0 acesta va rula mai repede. Setarea la 1.0 nu va face nimic.

Încercați să experimentați pentru a găsi o valoare bună! Simt o viteză ușor mai mică, cum ar fi 0.85f, va face ca jucătorul să simtă mai mult ceasul.

Încetinire când este scăzută

Acum că avem o componentă multiplicatoare, o putem schimba în timpul jocului!

Mergeți la blocul de schimbare a culorilor de cod:

dacă (timer < 10f)  GetComponent() .color = Color.red;  altfel dacă (timer < 20f)  GetComponent() .color = Color.yellow; 

Aici avem deja condițiile în care o schimbare a vitezei de bifare ar fi adecvată, așa că putem să o adăugăm!

dacă (timer < 10f)  GetComponent() .color = Color.red; multiplicator = 0.6f;  altfel dacă (timer < 20f)  GetComponent() .color = Color.yellow; multiplicator = 0,8f;  altfel multiplicator = 1.0f; 

Când cronometrul devine galben la 20 secunde, acesta va bifa acum cu viteza de 80%. Odată ce devine roșu, se va reduce la viteza normală de 60%. În caz contrar, va fi setat la viteza de 100%.

Scalarea când este scăzută

O altă modalitate excelentă de a face ca un cronometru să se termine în afara timpului este mai important decât să-l măriți în fiecare secundă când treceți. Deoarece avem deja un cod care se declanșează în fiecare secundă, îl putem adapta mai departe!

În primul rând, avem nevoie de o funcție pentru a mări și micșora dimensiunea ecranului nostru. Adăugați această funcție:

bool privat esteBlinking = false; IEnumerator privat Blink () isBlinking = true; float startScale = transform.localScale.x; transform.localScale = Vector3.one * startScale * 1.4f; randamentul randament nou WaitForSeconds (0.3f); transform.localScale = Vector3.one * startScale; isBlinking = false; 

Aceasta este o IEnumerator, care este un tip de funcție care poate conține comenzi de așteptare. Avem nevoie de isBlinking pentru a ne asigura că nu o numim de mai multe ori.

Odată inițiat, se va mări dimensiunea obiectului cu factorul de 1,4 f, se așteaptă 0,3 secunde, apoi se scade din nou la dimensiunea originală.

O numim folosind acest cod special:

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

Un IEnumerator trebuie inițiat prin apelarea acestuia StartCoroutine, altfel nu va funcționa.

Întregul bloc va fi sunat când trece o secundă, moment în care putem verifica dacă timerul este suficient de mic pentru a clipi.

Blink la Zero

Să facem ceva când cronometrul se termină. Având doar sta acolo la zero poate fi plictisitor, așa că haideți să clipească.

În primul rând, avem nevoie de altul IEnumerator funcţie:

bool privat isZeroBlinking = false; IEnumerator privat ZeroBlink () isZeroBlinking = true; GetComponent() .enabled = false; randamentul randament nou WaitForSeconds (1.5f); GetComponent() .enabled = true; randamentul randament nou WaitForSeconds (1.5f); isZeroBlinking = false; 

Aceasta va activa și dezactiva temporizatorul 1.5-intervale secunde. Activați-o în blocul care verifică deja dacă temporizatorul este zero.

dacă (timer> 0f) timer - = Time.deltaTime * multiplicator;  altfel timer = 0f; dacă (! isZeroBlinking) StartCoroutine (ZeroBlink ()); 

Înainte de ao executa, trebuie să dezactivați beep-ul și să clipească la zero în sine, altfel acest lucru se va ciocni comportamentele.

Adaptați condițiile din bloc pentru a verifica dacă a trecut o secundă și, de asemenea, pentru a verifica dacă timpul curent este mai mare de zero:

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

Acest lucru va face ca intermitentul normal și intermitentul să funcționeze fără a interfera unul cu celălalt.

Intregul numărătoarea inversă script-ul ar trebui să arate astfel:

utilizând UnityEngine; utilizând System.Collections; clasa publică Countdown: MonoBehavior float timer = 5f; float multiplicator = 0.6f; public AudioClip soundBlip; void Actualizare () if (timer> 0f) timer - = Time.deltaTime * multiplicator;  altfel timer = 0f; dacă (! isZeroBlinking) StartCoroutine (ZeroBlink ());  dacă (timer < 10f)  GetComponent() .color = Color.red; multiplicator = 0.6f;  altfel dacă (timer < 20f)  GetComponent() .color = Color.yellow; multiplicator = 0,8f;  altfel multiplicator = 1.0f;  dacă (Mathf.Round (timer * 100) / 100% 1f == 0 && timer> 0f) GetComponent() .PlayOneShot (soundBlip); dacă (timer < 10f && timer > 0f) dacă (! IsBlinking) StartCoroutine (Blink ());  GetComponent() .text = timer.ToString ("F2");  bool privat esteBlinking = false; IEnumerator privat Blink () isBlinking = true; float startScale = transform.localScale.x; transform.localScale = Vector3.one * startScale * 1.4f; randamentul randament nou WaitForSeconds (0.3f); transform.localScale = Vector3.one * startScale; isBlinking = false;  bool privat isZeroBlinking = false; IEnumerator privat ZeroBlink () isZeroBlinking = true; GetComponent() .enabled = false; randamentul randament nou WaitForSeconds (1.5f); GetComponent() .enabled = true; randamentul randament nou WaitForSeconds (1.5f); isZeroBlinking = false;  

Aceasta va face treaba. Desigur, puteți face mai elegant și combinați comenzile într-un cod mai eficient.

Concluzie

Numărătoarea noastră standard mică a devenit mult mai interesantă și mai interesantă. Dacă o construiți o dată, o puteți folosi și conectați-o la orice proiect pe care îl faceți, indiferent cât de mic este.

Acum mergeți și puneți-l într-un joc!