Hurtig Tips Pause, Slow Motion og Double-Time i enhet

Det er enkelt å pause et enhetsspill. Det er et par ting du bør være oppmerksom på, men vi kommer til dem på slutten av dette tipset. Vi skal legge til noen få enkle GUI-knapper for å kontrollere tiden i et grunnleggende Unity-prosjekt.


Endelig resultatforhåndsvisning

La oss se på det endelige resultatet vi vil jobbe for:


Trinn 1: Opprett et nytt prosjekt

La oss starte med å åpne Unity og opprette et nytt prosjekt. Du vil kanskje legge til litt animasjon eller en slags handling i saken, slik at du faktisk kan se en effekt når vi trykker på knappene. I eksemplet som er oppgitt, har jeg bare gjort noen enkle spinnende kuber.

Å åpne et nytt prosjekt er fint og enkelt. Når Unity er ferdig med å laste inn, kan du klikke på "Create New Project" -fanen og angi et filnavn hvis du har det satt til å vise prosjektveiviseren. Enhet vil ta vare på resten. Hvis vinduet Prosjektveiviser ikke kommer opp når du starter Unity, går du til Arkiv> Nytt prosjekt.


Trinn 2: Opprett et nytt JavaScript-skript

Unity har sitt eget GUI-system bygget inn, som går langt utover dette tipset. La oss bare si at alt GUI klokt skjer i en funksjon som kalles OnGUI og GUI-klassen gir en hel masse kule ting, som en knapp.

Gå videre og opprett et nytt skript gjennom aktivitetsmenyen - velg Eiendeler> Opprett> JavaScript:

Ditt nye skript skal vises i prosjektvinduet. Klikk en gang på skriptet, og det skal markere slik at du kan gi nytt navn til det. Navngi skriptet "PauseScript" og trykk enter. Nå vil vi starte kodingen, så fortsett og dobbeltklikk på den denne gangen. Det skal åpne standardskriptredigeringsprogrammet med Unitys mal / standardkode allerede i den. Når skripteditoren er lastet opp, sletter du standardkoden og erstatter den med koden nedenfor:

 funksjon OnGUI () // vis en pause-knapp hvis (GUI.Button (Rect (0,0,120,30), "TILGÅENDE PAUSE")) // ring vår byttefunksjon doPauseToggle (); 

GUI.Button krever en Rect (som inneholder x, y, bredde og høyde på vår knapp) og strengen som skal vises i den. Å finne ut om knappen har blitt trykket eller ikke, er like enkelt som å sette på GUI.Button tegne metode i en if-setning.


Trinn 3: Koding av pause-funksjonen

Her refererer vi til en funksjon som vi skal ringe doPauseToggle (). Dette vil være en enkel funksjon som kontrollerer for å se om vi er pause eller ikke stoppet, og utfører deretter den riktige handlingen. Legg til følgende kode nederst i PauseScript.js-skriptet, under funksjonen OnGUI vi la til i trinn 2:

 funksjon doPauseToggle () // her sjekker vi for å se om vi kjører på en tidsskala over 0 hvis (Time.timeScale> 0) // tidsskalaen er over null, så vi må pause spillet her pauseGame () ;  ellers // tidsskala var mindre enn null, så vi pause spillet her unPauseGame (); 

Time.timeScale er hvordan vi håndterer spillet. I hovedsak endrer vi skalaen som passerer. Når timeScale er 1.0, er tiden realtid. Ved null (0) er tiden stoppet. Så i vår doPauseToggle funksjon vi bare sjekker for å se om tiden er større enn null, un-paused, hvis så kaller vi en ny pauseGame () funksjon. Ellers kalles unPauseGame ().


Trinn 4: Kodingspause og pausefunksjoner

Funksjonene i trinn 3, pauseGame () og unPauseGame (), bare manipulere Time.timeScale verdi til enten 0 eller 1. Legg til følgende kode nederst i PauseScript.js-skriptet, under koden vi la til i trinn 3:

 funksjons pauseGame () // angitt skala til hvilken tid går til 0, frysetid (!) Time.timeScale = 0;  funksjonen unPauseGame () // sett skalaen til hvilken tid går til 1, kjører i realtid igjen Time.timeScale = 1; 

Tro det eller ei, det er alt vi trenger å gjøre for å legge til en pause-knapp i en Unity-fil. Hvis du har noen handling i Unity-scenen, vil du nå se at den pause og pause når vi klikker på knappen! Merk at hvis du ikke har noe på scenen din, ser du ikke noe som skjer når du treffer spill.


Trinn 5: Flytter i slowmotion

Tenker du på hva jeg tenker? Hvis 0 pause og 1 gjør det gå, hva med 0,5? Tenk kuletid!

Først, la oss gå videre og legge til en ny knapp til vår OnGUI () funksjon. Drop dette nederst på funksjonen, like over avslutningen stag.

 // vis en 'slowmo'-knapp hvis (GUI.Button (Rect (0,30,80,30), "SLOWMO")) // ring vår vekselfunksjon slowMo (); 

Nå trenger vi en ny funksjon for å justere tidsfaktoren til mindre enn 1. Rull ned til bunnen av PauseScript.js-skriptet og legg til denne nye funksjonen:

 funksjon slowMo () // sett skala til hvilken tid 5asses til 0.1, kjører i slowmo Time.timeScale = 0.1; 

? og dermed bevise at du ikke trenger å være Neo for kuletid i enhet!


Trinn 6: Dobbelt tid!

Til slutt, for moro skyld, la oss få alt til å bli litt gal ved å spille på dobbel tid. Selv om jeg ikke har sett dette brukt i en faktisk spillmekaniker, har jeg sett tidsskalert midlertidig for å få en partikkel-effekt oppe og løp - det var en brannvirkning, og forfatteren ville at skjermen skulle fylles med brann raskt for å bringe bakgrunnen av menyskjermbildet til livet. Han skalerte tiden opp høyt i et sekund etter at menyen var lastet og brannen fylte skjermen. Han reduserte tiden tilbake til 1 slik at flammen beveget seg riktig og alt annet i spillet var med vanlig hastighet.

For å legge til dobbelt tid, følger vi samme fremgangsmåte som i trinn 5, og legger til en ny knapp som vil ringe til en ny funksjon. Den nye funksjonen vil ganske enkelt sette vår timeScale til 2. Finn OnGUI () Funger i PauseScript.js-skriptet og legg til følgende, over slutten av funksjonen og over avslutningen krøllete brace.

 // vis en 'dobbelt tid' knapp hvis (GUI.Button (Rect (0,60,120,30), "DOBBELTID")) // ring vår vekselfunksjon doubleTime (); 

Ikke sant. Vi har en knapp, la oss legge til i den doubleTime () -funksjonen:

 funksjon doubleTime () // sett skala på hvilken tid går til 0,5, kjører i slowmo Time.timeScale = 2; 

For moro skyld, prøv å justere timeScale opptil 100 og se hva som skjer.


La oss ta oversikt over skriptet vårt. Her er PauseScript.js i sin helhet, bare i tilfelle noe skjedde underveis:

 funksjon OnGUI () // vis en pause-knapp hvis (GUI.Button (Rect (0,0,120,30), "TILGÅENDE PAUSE")) // ring vår byttefunksjon doPauseToggle ();  // vis en 'slowmo'-knapp hvis (GUI.Button (Rect (0,30,80,30), "SLOWMO")) // ring vår vekselfunksjon slowMo ();  // vis en "dobbelt tid" -knapp hvis (GUI.Button (Rect (0,60,120,30), "DOBBELTID")) // ring vår vekselfunksjon doubleTime ();  funksjon doPauseToggle () // her sjekker vi for å se om vi kjører på en tidsskala over 0 hvis (Time.timeScale> 0) // tidsskalaen er over null, så vi må pause spillet her pauseGame ();  ellers // tidsskala var mindre enn null, så vi pause spillet her unPauseGame ();  funksjon pauseGame () // angitt skala til hvilken tid går til 0, frysetid (!) Time.timeScale = 0;  funksjonen unPauseGame () // sett skalaen til hvilken tid går til 1, kjører i realtid igjen Time.timeScale = 1;  funksjon slowMo () // angitt skala til hvilken tid går til 0.1, kjører i slowmo Time.timeScale = 0,1;  funksjon doubleTime () // sett skala hvor klokken går til 0,5, kjører i slowmo Time.timeScale = 2; 

Endelige ord og et par Gotchas!

Det er viktig å merke seg det Time.timeScale vil ikke påvirke kode innenfor en Oppdater() funksjon. Oppdateringen finner sted hver "tick" og det skjer utenfor tidsskalaen, så hvis du trenger ting som skal skje når spillet er pauset, for eksempel en bakgrunns animasjon, er stedet som er mest sannsynlig, oppdatert. Sjekk Unity-dokumentasjonen for mer informasjon om dette.

Merk at hvis du endrer Time.timeScale verdi, vil eventuelle tidsrelaterte handlinger som anrop til Invoke-funksjonen eller noen timere som bruker verdier fra Time.time også bli påvirket av endringen. Hvis spillet ditt kjører med to ganger hastigheten, må du halvere hastigheten på dine tidsbaserte handlinger (for eksempel hvis du har et løpsspill med en omgangstimer og Time.timeScale er satt til 2,0, må du senk lap timeren med en halv for å nøyaktig måle tiden).

Fysikkreaksjoner er ikke direkte påvirket, så spillet ditt skal løpe som det normalt ville kollisjoner og fysikk-klokt - bare på en annen tidsskala.

Det er det! Takk for at du leste mitt raske tips. Spill rundt med Time.timeScale og jeg gleder meg til å se kule matrise-lignende effekter i prosjektene dine. Ha det gøy, lage spill!