Garbage Collection! Any good advice, resources or things-to-keep-in-mind about it?
Frequent GC's cause problems, notably music skipping, making the UI feel rough (mouse jumping around when GC happens mid-motion, etc). Really frequent GC's tank your framerate.
Frequent GC's come from a ton of transient heap allocation, meaning stuff that doesn't go on the stack (generally speaking, anything in a function's parameter list is on the stack, though params[] stuff may get put on the heap sometimes, not sure) that is allocated via new and then goes out of scope quickly after that allocation.
Obviously, the solution isn't simply to hold onto everything you ever allocate, or you'll run out of RAM.
Nor is the solution to put everything on the stack, which is technically difficult to accomplish and leads to lots of bugs because the copy-by-value behavior of structs can be non-intuitive with complex stuff (it's also impossible with recursive data structures).
But it does sometimes mean holding onto allocated space longer than you might otherwise, and sometimes putting stuff on the stack you wouldn't otherwise.
The first things to check for if you're seeing frequent GC's, though, are things like List<T>.Contains() where T is a value type (int, enum, struct, etc), if that happens in a section that's hit a lot it leads to a ton of boxing that thrashes the heap with transient allocation.
That doesn't mean doing a find-all on Contains and just hitting whatever you find, though, but rather running the unity profiler with judicious use of Profiler.BeginSample() and Profiler.EndSample() (we use wrappers around those), and looking at the memory column of the profiler to see what sections are causing the most allocation during your normal frames. Then narrow down the sections with more begin-sample and end-sample (best not to nest them too much, though, to keep overhead down). Generally speaking allocation for idle-state can be kept to zero bytes, or close enough for government work.