This is my collection of tips for programmers that use Unity.
It's a lot, but all well considered, and I've cut a lot that I actually intended to include when I started writing. Check out my twitter channel for more.
Always use GIT, Asset Serialization: Force Text and Version Control: Visible Meta Files
GIT is the most feature rich version control system that can be relied upon by large projects. Its layered architecture enables both convenient use and high power, while being incredibly stable at the same time. You need it for the code and text assets, at least.
Force Text is super important, because this is the only way you can resolve conflicts in scene files, asset files and prefabs. The alternative is to loose your colleagues data when they need a merge. I don't do that.
Visible Meta Files is important if you want to check whether something is being linked from scenes, asset files or prefabs. The 'guid' field in the meta file is the key here. It's the identifier for your script, prefab, asset or whatever it is that you have a question about.
GIT returns a handy list of all the scenes that use that particular asset. No need to iterate through all your scenes from a script.
Store static configuration data (audio databases etc.) as many ScriptableObjects.
Here there is a lot of knowledge that comes together in a beautiful way.
Scene files are typically too large and too frequently changed. Even when using Git, they are a challenge to the person who merges.
If an object within a scene links to a ScriptableObject, it will automatically be loaded along with the scene. It doesn't matter if the same ScriptableObject is also linked from other scenes, it's handled automatically. It's also a lot more performant than using the Resources system.
If you need to edit many of them at the same time (still, audio databases is my best example), you can actually create a folder inspector. It's a bit of a hack, but it's truly the thing you want when dealing with a large number of similar ScriptableObjects.
ScriptableObjects supports generics properly, even if they are serialized. This means you can finally start write some truly useful code, using generics.
ScriptableObjects can also be stored in scenes. It happens automatically if it's linked from a scene and not stored elsewhere.
Not convinced? Listen to this guy:
Enable alt-scroll to go through mesh renderers under the mouse cursor.
With a lock free queue, working with threads becomes a piece of cake.
Use one queue for input and one queue for output. Now your threads have an efficient way to fetch and deliver data, no more conflicts or race conditions.