Snabbtips Paus, Slow Motion och Double-Time i enhet

Att pausa en enhet spel är lätt. Det finns ett par saker du bör vara medveten om, men vi kommer till dem i slutet av detta tips. Vi ska lägga till några enkla GUI-knappar för att styra tiden inom ett grundläggande Unity-projekt.


Slutresultatförhandsvisning

Låt oss ta en titt på det slutliga resultatet vi ska arbeta för:


Steg 1: Skapa ett nytt projekt

Låt oss börja med att öppna Unity och skapa ett nytt projekt. Du kanske vill lägga till lite animering eller någon form av åtgärd i förfarandet, så att du faktiskt kan se en effekt när vi trycker på knapparna. I det givna exemplet gjorde jag bara några enkla spinnbitar.

Att öppna ett nytt projekt är fint och enkelt. När Unity har slutfört laddning, om du har den inställd för att visa projektguiden kan du klicka på fliken Skapa nytt projekt och ange ett filnamn. Enhet kommer att ta hand om resten. Om fönstret Projektguiden inte kommer upp när du startar Unity, gå till Arkiv> Nytt projekt.


Steg 2: Skapa ett nytt JavaScript-skript

Unity har ett eget GUI-system inbyggt, vilket går långt bortom detta tips. Låt oss bara säga att allt GUI klokt händer i en kallad funktion OnGUI och GUI-klassen ger en hel massa coola saker, som en knapp.

Fortsätt och skapa ett nytt skript via menyn Tillgångar - välj Tillgångar> Skapa> JavaScript:

Ditt nya skript ska visas i projektfönstret. Klicka en gång på manuset och det ska markera så att du kan byta namn på det. Nämn skriptet "PauseScript" och tryck på Enter. Nu vill vi börja kodning, så fortsätt och dubbelklicka på den här gången. Det borde öppna standardskriptredigeraren med Unitys mall / standardkod redan i den. När skripteditorn har laddats upp, ta bort standardkoden och ersätt den med koden nedan:

 funktionen OnGUI () // visa en pausknapp om (GUI.Button (Rect (0,0,120,30), "TOGGLE PAUSE")) // ringa till vippfunktionen doPauseToggle (); 

GUI.Button kräver en Rect (som innehåller x, y, bredd och höjd på vår knapp) och strängen som ska visas inom den. Ta reda på huruvida knappen har tryckts eller inte är lika enkelt som att sätta på oss GUI.Button rita metoden i ett if-uttalande.


Steg 3: Kodning av pausfunktionen

Här hänvisar vi till en funktion som vi ska ringa doPauseToggle (). Det här blir en enkel funktion som kontrollerar om vi är pausade eller pausade och utför sedan rätt åtgärd. Lägg till följande kod längst ner i ditt PauseScript.js-skript, nedanför funktionen OnGUI som vi lade till i steg 2:

 funktion doPauseToggle () // Här kontrollerar vi om vi kör på en tidsskala över 0 om (Time.timeScale> 0) // tidsskala är över noll, så vi måste pausa spelet här pauseGame () ;  annars // tidskalan var mindre än noll, så vi stoppar spelet här unPauseGame (); 

Time.timeScale är hur vi handlar om att pausa spelet. I huvudsak förändrar vi skalan vid vilken tidpunkt som passerar. När timeScale är 1,0 är tiden realtid. Vid noll (0) är pausen pausad. Så i vår doPauseToggle funktion vi kontrollerar helt enkelt för att se om tiden är större än noll, oavbruten, om så kallar vi en ny pauseGame () fungera. Annars kallas unPauseGame ().


Steg 4: Kodningspaus och oavbrutna funktioner

Funktionerna i steg 3, pauseGame () och unPauseGame (), helt enkelt manipulera Time.timeScale värdet till antingen 0 eller 1. Lägg till följande kod längst ner i ditt PauseScript.js-skript, nedanför koden vi lade till i steg 3:

 funktion pauseGame () // Ange skala vid vilken tidpunkt passerar till 0, frysningstid (!) Time.timeScale = 0;  funktion unPauseGame () // Ange skala vid vilken tidpunkt som går till 1, springa i realtid igen Time.timeScale = 1; 

Tro det eller inte, det är allt vi behöver göra för att lägga till en pausknapp till en Unity-fil. Om du har någon åtgärd i din Unity-scen ser du nu att det pausar och pausar när vi klickar på knappen! Observera att om du inte har något på gång i din scen, så kommer du inte se någonting hända när du slår spel.


Steg 5: Flyttar i slowmotion

Tänker du vad jag tänker? Om 0 pausar och 1 får det att gå, vad sägs om 0,5? Tänk kultid!

Låt oss först och lägg till en ny knapp till vår OnGUI () fungera. Släpp det här längst ner i funktionen, precis ovanför stängningen spänna.

 // visa en "slowmo" -knapp om (GUI.Button (Rect (0,30,80,30), "SLOWMO")) // ringa till vippfunktionen slowMo (); 

Nu behöver vi en ny funktion för att justera tidsfaktorn till mindre än 1. Bläddra ner till botten av ditt PauseScript.js-skript och lägg till den här nya funktionen:

 funktion slowMo () // set skala vid vilken tid 5asses till 0.1, springa i slowmo Time.timeScale = 0.1; 

? därmed bevisar att du inte behöver vara Neo för kulltid i Unity!


Steg 6: Dubbel tid!

Slutligen, för skojs skull, låt oss få allt att bli lite galet genom att spela på dubbeltid. Även om jag inte har sett det här som används i en verklig spelmekaniker, har jag sett tidskalad tillfälligt för att få en partikel effekt igång - det var en brandeffekt och författaren ville att skärmen skulle fyllas med eld snabbt för att få bakgrunden av sin menyskärm till liv. Han skala upp tiden för en sekund efter att menyn laddats och elden fyllde skärmen. Han reducerade sedan tiden tillbaka till 1 så att flammorna rör sig rätt och allt annat i spelet var i regelbunden hastighet.

För att lägga till dubbeltid följer vi samma procedur som i steg 5 och lägger till en ny knapp som kommer att ringa en ny funktion. Den nya funktionen kommer helt enkelt att ställa in vår timeScale till 2. Hitta OnGUI () funktionen i ditt PauseScript.js-skript och lägg till följande, över slutet av funktionen och över stängningen lockig stag.

 // visa en "dubbeltid" -knapp om (GUI.Button (Rect (0,60,120,30), "DUBBELTID")) // ringa till vippfunktionen doubleTime (); 

Höger. Vi har en knapp, vi lägger till i den funktionen doubleTime ():

 funktion doubleTime () // set skala vid vilken tidpunkt som går till 0.5, springa i slowmo Time.timeScale = 2; 

För skojs skull, försök att justera timeScale upp till 100 och se vad som händer.


Låt oss ta reda på vårt manus. Här är PauseScript.js i sin helhet, bara om något dåligt hände under vägen:

 funktionen OnGUI () // visa en pausknapp om (GUI.Button (Rect (0,0,120,30), "TOGGLE PAUSE")) // ringa till vippfunktionen doPauseToggle ();  // Visa en "slowmo" -knapp om (GUI.Button (Rect (0,30,80,30), "SLOWMO")) // kalla vår växlingsfunktion slowMo ();  // Visa en "dubbeltid" -knapp om (GUI.Button (Rect (0,60,120,30), "DUBBELTID")) // ringa till vippfunktionen doubleTime ();  funktion doPauseToggle () // här kontrollerar vi om vi kör på en tidsskala över 0 om (Time.timeScale> 0) // tidsskala är över noll, så vi måste pausa spelet här pauseGame ();  annars // tidskalan var mindre än noll, så vi stoppar spelet här unPauseGame ();  funktion pauseGame () // Ange skala vid vilken tidpunkt passerar till 0, frysningstid (!) Time.timeScale = 0;  funktion unPauseGame () // Ange skala vid vilken tidpunkt som går till 1, springa i realtid igen Time.timeScale = 1;  funktion slowMo () // set skala vid vilken tidpunkt som går till 0,1, springa i slowmo Time.timeScale = 0.1;  funktion doubleTime () // set skala vid vilken tidpunkt som går till 0.5, springa i slowmo Time.timeScale = 2; 

Finalord och ett par Gotchas!

Det är viktigt att notera det Time.timeScale påverkar inte koden inom en Uppdatering() fungera. Uppdatering sker varje "tick" och det händer utanför tidsskalan, så om du behöver saker att hända när spelet är pausat, till exempel en bakgrundsanimering, är platsen som är mest sannolikt uppdaterad. Kolla Unity-dokumentationen för mer information om detta.

Observera att om du ändrar Time.timeScale värde, kan eventuella tidsrelaterade åtgärder som samtal till Invoke-funktionen eller alla tidtagare som använder värden från Time.time påverkas av förändringen. Om ditt spel körs med dubbelt så hög hastighet måste du halvera hastigheten på dina tidsbaserade åtgärder (till exempel om du har ett tävlingsspel med en varvtimer och din Time.timeScale är satt till 2,0 måste du sakta ner varvtimern med en halv för att noggrant mäta tiden).

Fysikreaktioner påverkas inte direkt, så ditt spel borde springa som det normalt skulle kollisioner och fysikvisa - endast på en annan tidsskala.

Det är allt! Tack för att du läste mitt snabba tips. Leka med Time.timeScale och jag ser fram emot att se coola Matrix-liknande effekter i dina projekt. Ha kul, gör spel!