So, you might be thinking; why not use Coroutines and yield return new WaitForSeconds()? And my answer is purely that I'm lazy. I am not entirely a fan of working with Coroutines on the basis that it's awkward to use in the Update() method, and I personally feel that there's better ways of doing the same thing.
Usually avoiding Coroutines means for me is creating timers using deltaTime. However I noticed I ended trying to make multiple of these in the exact same way.
Luckily, this means we can make a custom class to do this exact behavior. This is how I ended up doing it:
I plan to use these timer classes for purely the inspector, so this is how I've laid out the class variables.
I also created basic methods for the class so we can control the timer. In my use cases, I usually only want to do things at the end of the timer, then reset the timer, so we create those first.
Now we can finally make helper methods to make our lives easier down the line. Usually when I tick the timer, as previously mentioned, I only really need to do things at the end of the timer, so that's why I've added TickUntilFinish(); I've also noticed that I can usually encapsulate my behavior inside a delegate when the timer is finished, so we have an alternative method to do that.
Now we can simply create our timers the way we see fit.