Let me explain the way I understand it from the documentation, and its kind of confusing at first, and if anyone wants to chime in feel free.
Update() gets called every frame. This means it occurs after all the computations need to be completed in order to generate a new image to be transferred to your screen.
If you have Vsync enabled in your graphics settings it will often not be called any more than 60 times a second because most monitors these days update at that rate. Back in the days of CRT monitors this could vary from 50 to 90 but with modern monitors it seems to stay at 60. If you turn off Vsync, Update() will be called as fast as your machine can process the next frame, which can be dependent on the processor speed, graphics card and available memory.
To see some interesting information press the little Stats button in the upper right of your game window, and to go even deeper check out Window->Analysis->Profiler. Note that if you look at the FPS in the Stats window, that’s the time to render graphics and not the real FPS that represents the rate which Update() gets called. To see an accurate FPS, add an empty game object and then add the first script shown here :
https://wiki.unity3d.com/index.php/FramesPerSecond
Vsync can be adjusted at Edit->Project Settings, then choose Quality. For each quality level at the top, you can choose V Sync Count, under “Other” at the bottom. A V Blank is the time at which your monitor finishes writing an image to your screen. To change the quality for your current project, choose it under the “Default” dropdown at the top.
Ok so with all that being said, Update() can get called at different time intervals on your machine depending on the Quality settings, as well as on any other machine your game runs on. For this reason, when you make changes to values inside the Update() function that get called every time, you multiply those values by Time.deltaTime to compensate. In my example above, again, sorry for the confusion, where I have
rb.AddForce(Vector2.right * speed, ForceMode2D.Impulse);
I’m not multiplying Vector2.right * speed * Time.deltaTime, because that code is not running on every call to Update(). Its only running when the timer completes. This is also the reason why I use ForceMode.Impulse, because its a single event that does not occur every frame.
FixedUpdate() gets called on a continuous fixed interval, by default every 1/50th of a second. If you’re going to add physics forces to bodies on a continual basis, do it inside FixedUpdate() and use ForceMode.Force
You don’t need to use Time.deltaTime here because FixedUpdate() gets called at a consistent time interval.
Now, all that being said, the place you would use Time.deltaTime was when you were modifying values inside the Update() function that get called every time within. (For things that are not physics) In my example above :
currentTime += Time.deltaTime * delay;
that line gets called every time and maintains the consistency of the timer. Technically I could have put everything in FixedUpdate if I wanted to and it would have been fine. I hope I didn’t confuse you more.