Slowmotion-effekt i enhed
Det er ret nemt at ændre tidstempoet i Unity, alt du skal gøre er at ændre værdien af Time.timeScale.
Time.timeScale er en værdi i Unity, der styrer tidsafhængige hændelser, såsom Update funktioner, animationer, partikler, fysik osv. Når tidsskalaen er 1, går tiden lige så hurtigt som realtid, med 0,5 gang går 2 gange langsommere end realtid, og med 2,0 går tiden dobbelt så hurtigt. Time.timeScale med værdien 0 pauser alle framerate-afhængige beregninger, negative værdier ignoreres.
Det er dog ikke nok at indstille værdien af timeScale til at skabe en troværdig slowmotion-effekt.
Nogle komponenter såsom AudioSource påvirkes ikke af tid, men heldigvis er det nok at ændre deres tonehøjde til at tilføje en slowmotion-effekt til lyden.
Slowmotion i spil refererer til en visuel og nogle gange funktionel effekt, hvor gameplayet, grafikken og animationerne bremses for at skabe en dramatisk og stiliseret oplevelse. Det bruges til at understrege vigtige øjeblikke, forbedre spillerkontrol eller tilføje filmisk flair til gameplay-sekvenser.
Når spillet er i slowmotion, ser alt ud til at bevæge sig med en reduceret hastighed sammenlignet med normalt gameplay. Dette kan omfatte karakterbevægelser, miljøinteraktioner og endda projektil- eller partikeleffekter. Effekten opnås ofte ved at justere spillets billedhastighed eller ved at manipulere tidsrelaterede variabler i spillets kode.
For at lave en slowmotion-effekt i Unity-spillet skal vi skrive et script, der ændrer værdien af Time.timeScale og ændrer tonehøjden for alle aktive lydkilder.
Slow motion er det modsatte af hurtig bevægelse og er processen med at sænke spillets hastighed.
- Opret et nyt script, kald det 'SC_SlowMotionEffect', fjern alt fra det, og indsæt derefter koden nedenfor i det:
SC_SlowMotionEffect.cs
using UnityEngine;
public class SC_SlowMotionEffect : MonoBehaviour
{
public float slowMotionTimeScale = 0.5f;
public bool slowMotionEnabled = false;
[System.Serializable]
public class AudioSourceData
{
public AudioSource audioSource;
public float defaultPitch;
}
AudioSourceData[] audioSources;
// Start is called before the first frame update
void Start()
{
//Find all AudioSources in the Scene and save their default pitch values
AudioSource[] audios = FindObjectsOfType<AudioSource>();
audioSources = new AudioSourceData[audios.Length];
for (int i = 0; i < audios.Length; i++)
{
AudioSourceData tmpData = new AudioSourceData();
tmpData.audioSource = audios[i];
tmpData.defaultPitch = audios[i].pitch;
audioSources[i] = tmpData;
}
SlowMotionEffect(slowMotionEnabled);
}
// Update is called once per frame
void Update()
{
//Activate/Deactivate slow motion on key press
if (Input.GetKeyDown(KeyCode.Q))
{
slowMotionEnabled = !slowMotionEnabled;
SlowMotionEffect(slowMotionEnabled);
}
}
void SlowMotionEffect(bool enabled)
{
Time.timeScale = enabled ? slowMotionTimeScale : 1;
for (int i = 0; i < audioSources.Length; i++)
{
if (audioSources[i].audioSource)
{
audioSources[i].audioSource.pitch = audioSources[i].defaultPitch * Time.timeScale;
}
}
}
}
- Vedhæft scriptet ovenfor til ethvert GameObject, og tryk derefter på 'Q' i spillet for at aktivere/deaktivere slowmotion-effekten.
For at sikre, at Rigidbodies simuleres jævnt under slowmotion-effekten, skal du indstille deres Interpolate-værdi til Interpolate eller Extrapolate.