Имхо достаточно чего-то такого в OnGUI (RTS Generals на Unity3d.com форуме, там же можно найти примеры остальных скриптов):
Используется javascript
var width : int = mouseButton1UpPoint.x - mouseButton1DownPoint.x;
var height : int = (Screen.height - mouseButton1UpPoint.y) - (Screen.height - mouseButton1DownPoint.y);
var rect : Rect = Rect(mouseButton1DownPoint.x, Screen.height - mouseButton1DownPoint.y, width, height);
GUI.DrawTexture (rect, selectionTexture, ScaleMode.StretchToFill, true);
Если RTS на плоскости - рейкасты из камеры в точку GetButtonDown и GetButtonUp, сравнивать что попало между хит.поинтами (на плоскость), не учитывая высоту. Юниты в каком-нибудь менеджере (опять же с того проекта, не моё):
Используется javascript
private var allUnitsList = new Array();
private var selectedUnitsList = new Array();
А если в объёме - имхо при GetButtonDown после проверки на то, что GetButtonDown!=GetButtonUp (исключить случайный клик) переводить видимые камере юнити в Camera.main.WorldToScreenPoint и проверять так же, но в плоскости камеры. По оптимизации не знаю
А если речь идёт о подсветке выбранного юнита масштабируемой рамкой, то тут надо от размеров объекта на экране смотреть и через GUI отрисовывать наверн, не смотрел в эту сторону...