From many years of Flash development, I came to appreciate Flash's event system. Unity's method of object communication using SendMessage works well in many cases, but starts to become problematic when trying to refractor a large project with countless gameObject's referencing other gameObjects.
One of the first things I wrote in Unity, after switching to C#, was an event managment system to handle class abstraction. At its core, the EventManager does use SendMessage and does have direct references to gameObjects, but seperates the need for classes to know anything about each other as long as they use an event object to know how to talk to each other when an event happens.
So, try it out. If you have any suggestions or fixes, let me know.