Какие есть best practices для unity3d?
1. Не используйте множественного наследования от MonoBehavior:class SomeBaseBehavior : MonoBehavior
{...}
class SomeConcreatBehavior : SomeBaseBehavior
{...}
Я вижу как минимум одну причину (если не ошибаюсь): методы Start, Update и прочие, судя по всему, не виртуальные.
2. Не называйте скрипты поведения в честь объектов (префабов и прочего). Скрипты поведения не должны быть привязаны к какому-то конкретному префабу
3. Для получения информации от "соседних скриптов" используйте SendMessage на своем gameObject или у родительского (gameObject.transform.parent).
4. Ну и наверно держите баланс между связностью скриптов между собой и производительностью. Т.е. кэшируйте вызовы GetComponent<...>(); 
SendMessage(Wrap<T> valueRequest)
которых много. Кэширование самих объектов скрипта для меня пока под вопросом (кажется стоит этого избегать).
ЗЫ: возможно я в чем-то неправ, сам только начал активно знакомиться.
devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/
Разрабатывать компонентами код, чтобы легче было поддерживать. 
Ввести интерфейсы и общаться через них(не привязываемся в реализации, только к функционалу).
ЗЫ Нет единственного правильного решения, все зависит от специфики проекта.