For moment-to-moment I like the GameManager singleton pattern. If you make the GameManager a MonoBehaviour you automagically get all the benefits of Unity calling your Update() loop when you want, and you can run coroutines too obviously.
As for longer-term world state, after that it would be serialize and save to disk, just a regular old load/save step I imagine. If you want the world to “continue living” even when you’re not playing, then you just check time at shutdown, time at startup, and simulate as much as you need when you resume.
For the first, here are some super-simple Singleton examples to take and modify:
Simple Unity3D Singleton (no predefined data):
Unity3D Singleton with Prefab used for predefined data:
These are pure-code solutions, do not put anything into any scene, just access it via .Instance!
If it is a GameManager, when the game is over, make a function in that singleton that Destroys itself so the next time you access it you get a fresh one, something like:
public void DestroyThyself()
{
Destroy(gameObject);
Instance = null; // because destroy doesn't happen until end of frame
}
For loading/saving, there’s tons of Youtube tutorials, but here are my scribblings:
Load/Save steps:
Don’t use the binary formatter/serializer: it is insecure, it cannot be made secure, and it makes debugging very difficult, plus it actually will NOT prevent people from modifying your save data on their computers.