Singletons For Unity
The singleton design pattern is basically a quick way to access an object which you only have one of. This is by no means necessary, as you can, of course, access a script on any object from any other object by using GetComponent, but using the singleton pattern eliminates the need for this extra step.
Conceptually this pattern also helps keep your code clean because you know which things are only happening in one place. This might be for things like spawning enemies or playing audio, where you could have different events happening all over the place but might get into trouble when they start happening in ways you didn’t expect. If there is only one place to look when you have problems, it is a lot easier to figure out just what went wrong, and when you come back to an old part of your code after a while, it’s a lot easier to remember how it works when you only have each type of thing happening in one place.
Singletons do have their downsides, however. The main objection to them seems to be that they are global, whereas best practices call for everything to be kept private. There is also the risk with only one tool; many different needs will be placed upon it, causing that tool to become bloated. In games, I think these things aren’t the biggest deal because the possibility space of any given singleton is typically going to be fairly limited. As always, there are innumerable ways to do things when it comes to code, so if you’re trying to look at how to architect your project, take a look through the singleton design pattern and see if it solves any of the problems you are facing.