Sist gang vi så på nedtellingen i spill, hvordan de er satt opp, og hvilke elementer du kan bruke til å gjøre dem mer engasjerende. Det er mye mer enn det som passer inn i en enkelt artikkel!
Dette fortsetter fra del 1, og derfor begynner vi på nummer syv.
Klar? La oss gå!
Dette er et enkelt knep som ikke engang krever at du lyver til spilleren. Du sier bare "når timeren løper ut" og vis en tikkende klokke. Det du ikke nevner er enhet som er vist.
Hvis du viser en "10", vil spilleren intuit dette er 10 sekunder, men nummeret kan redusere tregere enn sekunder ville. Hvis du endrer verdien med en 0.5 multiplikator, for eksempel vil det løpe ut etter 20 sekunder i stedet for bare 10.
Du kan se på hvordan dette virker i mitt Ludum-Dare-spill, hvert tiende sekund dør en kattunge.
Temaet for syltetøyet nødvendiggjorde det 10 sekunder brukes, men 10 faktiske sekunder er en mye for lav tid for å oppnå noe meningsfylt.
Dette fungerer også bedre hvis tidsenheter ikke blir nevnt, og spilleren får bare en grov ide om "inntil dette skjer".
Hvis du har en serie paneler som lyser opp for å vise timeren, trenger du ikke å aktivere dem med samme hastighet. Faktisk blir det mer intens hvis de første få lyser raskt, og de sistnevnte har mer tid mellom dem. I varmen av action-pakket gameplay, vil spilleren ikke innse dette og vil ha en mye mer intens opplevelse.
Dette burde ikke være ansatt med faktiske tidsenheter, da spillere kunne føle seg utro og løy til. Ikke bry spillerenes tillit til systemet ditt.
Dette kan ses på ett nivå av Starfox 64, hvor spilleren må forsvare en posisjon mot et nærliggende gigantisk skip.
Minimap inn Starfox 64. Det angripende morsskipet (den svarte sirkelen) beveger seg mot basen i midten, noe som gir spilleren en grov tikkende klokke av hvor mye tid som er igjen for å ødelegge detVed første øyekast får du en grov ide om hvor mye tid som er igjen, men selve skipet ser ut til å bevege seg med forskjellige hastigheter og ikke i en rett linje.
Timeren er i hovedsak tilpasset på fluen, hvor prosessen er skjult bak røyk og speil.
Countdowns trenger ikke å være rent optisk! Et pipelyd hvert par sekunder vil i stor grad øke nedsenking.
Når du har det, kan du også tilpasse frekvensen når en viss tid har gått. Hvis pipet skjer hvert femte sekund, vil spilleren bli informert uten å måtte se på nummeret og i løpet av de siste 30 sekundene av timeren beregne hvor mye som er igjen.
På samme måte hjelper det også om en karakter kommenterer fremdriften. Å ha noen si "Vi er halvveis ferdig!" gir deg et godt innrammet stykke informasjon som er mye lettere å forstå enn å analysere det fra en lesing.
Dette fungerer veldig bra når telleren nærmer seg slutten. Når en annen stund går, skal du helle opp hele telleren i et halvt sekund.
I tillegg til farge og lyd, vil dette gjøre det mye juicier.
Sørg for at en tidtaker aldri går negativ - dette vil være forvirrende for mange mennesker og virke som en feil, som bugged, dårlige opprettede timere pleier å gjøre det.
Å ha det flash ville være en fin touch, som det understreker igjen poenget med at det bare har gått tom.
Hvis du har en positiv timer, er det et morsomt element å bare la det fortsette å løpe og bruke det elementet som en høy poengsum. Spillet Devil Daggers gjør en lignende ting, hvor hovedmålet er "Overlev 500 sekunder".
Spill fra Devil DaggersNår reglene for en tidtaker er blitt etablert, bør de forbli omtrent konsekvent, med mer spillerom tillates jo mindre nøyaktige en tidtaker er. Hovedspørsmålet bør være: "Hvordan er denne skjulte regelen til nytte for opplevelsen?"
Når du senker en timer i de siste tre sekunder, vil det gjøre situasjonen mer spenstig og gi spilleren noen få flere faktiske sekunder for å utføre ting. Slår det tilfeldig ned i midten, eller øker hastigheten, vil bare bryte spillerens tillit til reglene dine.
Dette vil fortsette med kodebasen fra den siste opplæringen og bygge videre på den. Hvis du ikke har sjekket ut det ennå, gjør det nå! Du kan også laste ned den ferdige kilden øverst til høyre i denne artikkelen.
Da vi sist forlot vår tidtaker, så det slik ut:
Nå vil nye tilføyelser få det til å virke mer interessant. Vi vil fortsette med countdown.cs-script
, som skal se slik ut:
bruker UnityEngine; bruker System.Collections; offentlig klasse Nedtelling: MonoBehaviour float timer = 60f; offentlig lydklip soundBlip; ugyldig oppdatering () hvis (timer> 0f) timer - = Time.deltaTime; ellers timer = 0f; hvis (timer < 10f) GetComponent() .color = Color.red; annet hvis (timer < 20f) GetComponent () .color = Color.yellow; GetComponent () .text = timer.ToString ("F2");
La oss lage vår tidssone pip hvert sekund, slik at spilleren vil vite at den avtar selv uten å se på den.
Først trenger vi en fin blip lyd effekt. Du kan finne en lydfil i kildefilene, eller lag en fin en med det frie verktøyet BFXR. Når du har en, kopier den inn i aktivmappen din.
Legg til en AudioSource-komponent i nedtellingen din via Komponent> Lyd> AudioSource. Legg til denne variabelen i nedtellingsskriptet:
offentlig lydklip soundBlip;
Du må også tilordne lydfilen til soundBlip
variabel:
Og legg til denne blokken til Oppdater
funksjon:
hvis (Mathf.Round (timer * 100) / 100% 1f == 0) GetComponent() .PlayOneShot (soundBlip);
Dette kontrollerer om timeren er på fullt andre merk, og hvis det er så, spill lydfilen.
Den faktiske arbeidet med denne koden er litt mer komplisert. Hva det gjør er første omdreiningstidspunktet til to desimaler, divider det med 1, og se om det er en gjenværende del. Hvis resten er null, betyr det at timeren har nådd et helt sekund, og blip lyden kan spilles.
Hvis vi ikke gjør dette, kan systemet utløse mye oftere, noe som ikke vil være morsomt og bidrar til en god timer.
Dette vil legge til en multiplikator som vil redusere eller akselerere hastigheten til tikkende klokke. Legg til denne variabelen i begynnelsen:
float multiplikator = 0,6f;
Finn nå linjen som reduserer timeren - det er denne:
timer - = Time.deltaTime;
Og tilpass det til å se slik ut:
timer - = Time.deltaTime * multiplikator;
Hvis multiplikatoren er under 1.0 Timeren vil nå løpe langsommere, og hvis den er over 1.0 det vil løpe raskere. Setter det på 1.0 vil ikke gjøre noe.
Prøv å eksperimentere for å finne en god verdi! Jeg føler meg litt lavere fart, som 0.85f, vil få spilleren til å føle den tikkende klokken mer.
Nå som vi har en multiplikator komponent, kan vi endre den under spill!
Gå til fargeskiftende blokk med kode:
hvis (timer < 10f) GetComponent() .color = Color.red; annet hvis (timer < 20f) GetComponent () .color = Color.yellow;
Her har vi allerede forholdene der en endring i tikkende fart ville være hensiktsmessig, så vi kan bare legge til det!
hvis (timer < 10f) GetComponent() .color = Color.red; multiplikator = 0,6f; annet hvis (timer < 20f) GetComponent () .color = Color.yellow; multiplikator = 0,8f; ellers multiplikator = 1.0f;
Når timeren blir gul på 20 sekunder, vil den nå krysse med 80% hastighet. Når det blir rødt, vil det gå ned til 60% vanlig hastighet. Ellers blir det satt til 100% hastighet.
En annen fin måte å få en timer å løpe ut av tiden skiller seg ut, er å skalere det opp hver gang det går andre når det er lavt. Siden vi allerede har kode som blir utløst hvert sekund, kan vi tilpasse det videre!
Først trenger vi en funksjon for å øke og redusere størrelsen på skjermen. Legg til denne funksjonen:
privat bool isBlinking = false; privat IEnumerator Blink () isBlinking = true; float startScale = transform.localScale.x; transform.localScale = Vector3.one * startScale * 1.4f; yield returnerer nye WaitForSeconds (0.3f); transform.localScale = Vector3.one * startScale; isBlinking = false;
Dette er en IEnumerator
, som er en type funksjon som kan inneholde ventekommandoer. Vi trenger isBlinking
variabel for å sikre at vi ikke kaller det flere ganger.
Når den er startet, vil den skalere størrelsen på objektet med faktor 1.4f, vent 0,3 sekunder, og deretter skalere ned igjen til originalstørrelsen.
Vi kaller det ved hjelp av denne spesielle koden:
hvis (Mathf.Round (timer * 100) / 100% 1f == 0) GetComponent() .PlayOneShot (soundBlip); hvis (timer < 10f) if(!isBlinking) StartCoroutine(Blink());
en IEnumerator
må initieres ved å ringe det via StartCoroutine
, ellers vil det ikke fungere.
Hele blokken vil bli kalt når et sekund passerer, på hvilket tidspunkt kan vi sjekke om timeren er lav nok til å få den til å blinke.
La oss gjøre noe når timeren løper ut. Å ha det bare sitte der ved null kan være kjedelig, så la oss få det til å blinke.
Først trenger vi en annen IEnumerator
funksjon:
privat bool isZeroBlinking = false; privat IEnumerator ZeroBlink () isZeroBlinking = true; GetComponent() .enabled = false; yield returnerer nye WaitForSeconds (1.5f); GetComponent () .enabled = true; yield returnerer nye WaitForSeconds (1.5f); isZeroBlinking = false;
Dette vil slå timeren på og av i 1.5-andre intervaller. Trigger den i blokken som allerede sjekker om timeren er null.
hvis (timer> 0f) timer - = Time.deltaTime * multiplikator; ellers timer = 0f; hvis (! erZeroBlinking) StartCoroutine (ZeroBlink ());
Før du kjører det, må vi deaktivere piping og blinkende ved null selv, ellers vil det kollidere atferd.
Tilpass betingelsene i blokken for å sjekke om et sekund har passert og også for å sjekke om nåværende tid er mer enn null:
hvis (Mathf.Round (timer * 100) / 100% 1f == 0 && timer> 0f) GetComponent() .PlayOneShot (soundBlip); hvis (timer < 10f && timer > 0f) hvis (! ErBlinking) StartCoroutine (Blink ());
Dette vil sørge for regelmessig blinking og null blinkende arbeid uten å forstyrre hverandre.
Hele nedtelling
Skriptet bør se slik ut:
bruker UnityEngine; bruker System.Collections; offentlig klasse Nedtelling: MonoBehaviour float timer = 5f; float multiplikator = 0,6f; offentlig lydklip soundBlip; ugyldig oppdatering () hvis (timer> 0f) timer - = Time.deltaTime * multiplikator; ellers timer = 0f; hvis (! erZeroBlinking) StartCoroutine (ZeroBlink ()); hvis (timer < 10f) GetComponent() .color = Color.red; multiplikator = 0,6f; annet hvis (timer < 20f) GetComponent () .color = Color.yellow; multiplikator = 0,8f; ellers multiplikator = 1.0f; hvis (Mathf.Round (timer * 100) / 100% 1f == 0 && timer> 0f) GetComponent () .PlayOneShot (soundBlip); hvis (timer < 10f && timer > 0f) hvis (! ErBlinking) StartCoroutine (Blink ()); GetComponent () .text = timer.ToString ("F2"); privat bool isBlinking = false; privat IEnumerator Blink () isBlinking = true; float startScale = transform.localScale.x; transform.localScale = Vector3.one * startScale * 1.4f; yield returnerer nye WaitForSeconds (0.3f); transform.localScale = Vector3.one * startScale; isBlinking = false; privat bool isZeroBlinking = false; privat IEnumerator ZeroBlink () isZeroBlinking = true; GetComponent () .enabled = false; yield returnerer nye WaitForSeconds (1.5f); GetComponent () .enabled = true; yield returnerer nye WaitForSeconds (1.5f); isZeroBlinking = false;
Dette vil få jobben gjort. Du kan selvfølgelig gjøre det mer elegant og kombinere kommandoene til en mer effektiv kode.
Vår standard lille nedtelling har blitt mye mer interessant og engasjerende. Hvis du bygger dette en gang, kan du bruke den og koble den til noe prosjekt du lager, uansett hvor lite.
Gå nå og legg det i et spill!