UnityのGUIは動かないというイメージがありますが、実際には毎フレームごとに座標を与えてグリグリ動かすことができます。
今回は戦国無双みたいなゲームとかで、よく敵キャラクターの頭の上にある体力ゲージとか名前をイメージしたスクリプトをやってみました。

以下はデモです。Shiftキーを押しながらドラッグすることで動かせます。
でもなぜか私の環境のmacでは、safariだとライトがおかしいとかchromeだとそもそも動かないです・・・。

デモ

ワールド座標をスクリーン座標に変換する。

まず、ゲームオブジェクトのワールド座標をスクリーン座標にするためには、カメラオブジェクトのメソッド、WorldToScreenPoint(Vector3)を使います。
[javascript]Vector3 ScreenPosition = camera.WorldToScreenPoint(target.position);[/javascript]
これをカメラオブジェクトにつけます。
ちなみにスクリーン座標をワールド座標にするのはScreenToWorldPoint(Vector3)です。

オブジェクトの回りに動的なGUIを配置する。

流れとしては、Update関数でオブジェクトの座標(Vector3)を取得してスクリーン座標に変換し、その変数のXとYの数値をOnGUI関数のRectの引数に渡しています。

[javascript]using UnityEngine;
using System.Collections;

public class LookATGUI_C : MonoBehaviour {

public Transform GUIWatchPoint;

private Vector3 ObjectPoint;// オブジェクトのワールド座標
private Vector3 ObjectPointPlus;// オブジェクトのちょっと上の座標
private Vector3 GUIScreenPoint;// オブジェクトのスクリーン座標

private float ScreenHeight = Screen.height;

void OnGUI () {
GUI.Box(new Rect(GUIScreenPoint.x-60,ScreenHeight – GUIScreenPoint.y + 40,120,40),”Hello!”);
}

void Update () {
// Objectの座標を代入
ObjectPoint = GUIWatchPoint.position;
ObjectPointPlus = new Vector3(0,0,0) + ObjectPoint;

GUIScreenPoint = camera.WorldToScreenPoint(ObjectPointPlus);
}
}[/javascript]
注意点としてオブジェクトのY座標は、上に上がるとプラス、下に下げるとマイナスなのに対して、GUIのRectの引数のY座標は上に上がるとマイナス、下に下げるとプラスになるところです。
あとスクリーン変換した座標をそのままいれればよいというわけではなく、最初にスクリーンの高さを取得してそれにマイナスしてやる・・・もう書いててワケわからないのでスクリプトを参照のこと。
これだけのためにかなり時間かかりました・・・。