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

writer : uxicカテゴリー unityタグ

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

コメントする

meta