Update function versus FixedUpdate function
The next thing to look at is our movement code. You may have noticed that we are currently using the Update
function in order to move our player. As the comment above it states, the Update
function is called once per frame that the game is running. One thing to consider is that the frequency of Update
being called is variable, meaning that it can change over time. This is dependent on a number of factors, including the hardware that is being used. This means that the more times the Update
function is called, the better the computer is. We want a consistent experience for all of our players, and one of the ways that we can do that is by using the FixedUpdate
function.
FixedUpdate
is similar to Update
with some key differences. The first is that it is called at fixed timesteps, meaning the same time between calls. It’s also important to note that physics calculations are done after FixedUpdate
is called. This means code-modifying physics-based objects should be executed within the FixedUpdate
function generally, apart from one-off events such as jumping:
/// <summary> /// FixedUpdate is a prime place to put physics /// calculations happening over a period of time. /// </summary> void FixedUpdate() { // Check if we're moving to the side var horizontalSpeed = Input.GetAxis("Horizontal") * dodgeSpeed; rb.AddForce(horizontalSpeed, 0, rollSpeed); }
By adjusting the code to use FixedUpdate
, the ball should be much more consistent in its movement speed.
Note
For more information on FixedUpdate
, check out https://docs.unity3d.com/ScriptReference/MonoBehaviour.FixedUpdate.html.
Putting it all together
With all of the stuff we’ve been talking about, we can now have the final version of the script, which looks like the following:
using UnityEngine; /// <summary> /// Responsible for moving the player automatically and /// receiving input. /// </summary> [RequireComponent(typeof(Rigidbody))] public class PlayerBehaviour : MonoBehaviour { /// <summary> /// A reference to the Rigidbody component /// </summary> private Rigidbody rb; [Tooltip("How fast the ball moves left/right")] public float dodgeSpeed = 5; [Tooltip("How fast the ball moves forward automatically")] [Range(0, 10)] public float rollSpeed = 5; // Start is called before the first frame update public void Start() { // Get access to our Rigidbody component rb = GetComponent<Rigidbody>(); } /// <summary> /// FixedUpdate is a prime place to put physics /// calculations happening over a period of time. /// </summary> void FixedUpdate() { // Check if we're moving to the side var horizontalSpeed = Input.GetAxis("Horizontal") * dodgeSpeed; rb.AddForce(horizontalSpeed, 0, rollSpeed); } }
I hope that you also agree that this makes the code easier to understand and better to work with. Now, we can move on to additional features in the game!