This article was originally posted on 4th August 2013 at Programmer’s Ranch using Unity3D 4.2.0f4. This updated version of the article uses Unity3D 5.3.4f1, and the source code is available at the Gigi Labs BitBucket repository. Syntax highlighting and a new screenshot have been added, and the text is slightly modified.
In this article, we’ll learn about controlling time in Unity3D. This allows us to easily pause the game, slow it down, or speed it up.
Create a new project and add a sphere to your scene via GameObject menu -> 3D Object -> Sphere. Next, create a new C# script by right clicking in the Project panel, and selecting Create -> C# Script. Name it Ball, and drag it onto your Sphere in the Hierarchy panel. Double-click the script to open it in Visual Studio.
We’re going to make a very basic bouncing ball just to be able to see the effects of our change in speed. Start off with the following code for the Ball script:
public class Ball : MonoBehaviour { private Vector3 velocity; // Use this for initialization void Start() { this.velocity = new Vector3(1.0f, 1.0f, 0.0f); } // Update is called once per frame void Update() { this.transform.position += this.velocity * Time.deltaTime; if (this.transform.position.x > 5.0f) velocity.x = -velocity.x; else if (this.transform.position.x < -5.0f) velocity.x = -velocity.x; else if (this.transform.position.y > 6.0f) velocity.y = -velocity.y; else if (this.transform.position.y < -5.0f) velocity.y = -velocity.y; } }
This will make the ball bounce when it reaches the sides of the screen. This may vary depending on your monitor so use whichever values work best.
Games look interactive because they generate a certain number of images (frames) per second, usually something between 30 and 60. Time.deltaTime
is the time between one frame and the next; multiplying this by the velocity makes the ball move pretty uniformly.
Another important property of the Time
class is Time.timeScale
. This is a measure of how quickly scripts and animations run, and is set to 1.0f by default. We can change this to make the game run at different speeds. To try it out, add the following code to the Ball script’s Update()
method:
if (Input.GetKeyDown(KeyCode.P)) Time.timeScale = 0.0f; else if (Input.GetKeyDown(KeyCode.N)) Time.timeScale = 1.0f; else if (Input.GetKeyDown(KeyCode.F)) Time.timeScale = 2.0f; else if (Input.GetKeyDown(KeyCode.S)) Time.timeScale = 0.5f;
What we’re doing here is:
- If the player presses ‘P’ (pause), we set the time scale to zero, effectively stopping any movement in the game.
- If the player presses ‘N’ (normal speed), we set the time scale to the default of 1.0f.
- If the player presses ‘F’ (fast), we set the time scale to double the normal speed.
- If the player presses ‘S’ (slow), we set the time scale to half the normal speed.
This simple property allows you to not only pause the game, but also to play the game at different speeds. Several games including Starcraft and Warcraft 2 have settings that allow you to tweak the game speed in order to make it more challenging or less frenetic.
This article showed how a single line of code in Unity3D is enough to change the speed of a game or pause it. Although this was a very easy tutorial, I hope you will also find it very useful in any games you make!