2012-01-13
オブジェクトの回りに動的なGUIを配置する。
UnityのGUIは動かないというイメージがありますが、実際には毎フレームごとに座標を与えてグリグリ動かすことができます。
今回は戦国無双みたいなゲームとかで、よく敵キャラクターの頭の上にある体力ゲージとか名前をイメージしたスクリプトをやってみました。
以下はデモです。Shiftキーを押しながらドラッグすることで動かせます。
でもなぜか私の環境のmacでは、safariだとライトがおかしいとかchromeだとそもそも動かないです・・・。
ワールド座標をスクリーン座標に変換する。
まず、ゲームオブジェクトのワールド座標をスクリーン座標にするためには、カメラオブジェクトのメソッド、WorldToScreenPoint(Vector3)を使います。
Vector3 ScreenPosition = camera.WorldToScreenPoint(target.position);
これをカメラオブジェクトにつけます。
ちなみにスクリーン座標をワールド座標にするのはScreenToWorldPoint(Vector3)です。
オブジェクトの回りに動的なGUIを配置する。
流れとしては、Update関数でオブジェクトの座標(Vector3)を取得してスクリーン座標に変換し、その変数のXとYの数値をOnGUI関数のRectの引数に渡しています。
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);
}
}
注意点としてオブジェクトのY座標は、上に上がるとプラス、下に下げるとマイナスなのに対して、GUIのRectの引数のY座標は上に上がるとマイナス、下に下げるとプラスになるところです。
あとスクリーン変換した座標をそのままいれればよいというわけではなく、最初にスクリーンの高さを取得してそれにマイナスしてやる・・・もう書いててワケわからないのでスクリプトを参照のこと。
これだけのためにかなり時間かかりました・・・。
コメントはまだありません »
コメントはまだありません。
この投稿へのコメントの RSS フィード。 TrackBack URL
