2012年09月24日

[Unity] 各キャラのHPをNGUIで表示してみる

ゲームでよく見る、キャラクターの上にパワーゲージが表示されるGUIを実現したいなぁと
いうことで試してみました。
今回はシンプルに、数字だけを表示します。

まずはキャラクターを用意します。
適当にカプセルを用意して、Mob_Controller.jsを適用しました↓

20120924powergage001.png
Mob_Controller.js
-------------------------------------------------
var labelPfb : GameObject; // NGUIラベル
var myHP : int; // HP
private var labelNameObj : GameObject; // HP用NGUIラベル(プレファブ)

function Start() {
// ラベル生成
labelNameObj = Instantiate(labelPfb, Vector3.zero, Quaternion.identity);
// HP表示を更新
labelNameObj.GetComponent(Label_Controller).SetMyHP(myHP);
}

function FixedUpdate() {
// 単純移動
transform.localPosition.z += 2 * Mathf.Sin(Time.time);
}

function Update() {
// 本オブジェクトのスクリーン座標をもとにNGUI用の座標を設定
var screenPos : Vector3 = Camera.mainCamera.WorldToScreenPoint(transform.position);
labelNameObj.transform.localPosition.x = screenPos.x - Screen.width / 2;
labelNameObj.transform.localPosition.y = screenPos.y - Screen.height / 2 + 30;
labelNameObj.transform.localPosition.z = 1;
}
-------------------------------------------------
ここで行っていることは、
Start()
・NGUIのLabelを外部から受け取って、適当な場所に生成(後述)
・LabelをキャラクターのHPに書き換える

FixedUpdate()
・キャラクターをz方向に適当に揺らす

Update()
・Start()で生成した「NGUIのLabelオブジェクト」を、キャラクターのスクリーン座標に合わせて移動
※y座標を +30 しているのは、キャラクターの頭上に表示したいため

肝となるのが、Update()の中の「WorldToScreenPoint()」です。
これで3D空間にいるキャラが、スクリーン上ではどの座標になるのかがわかります。

Inspectorウィンドウの設定を確認してみるとこんな感じ↓

20120924powergage002.png

これでキャラクター側の設定は完了です。

次は、キャラのHPを表示する「NGUIのLabel」を用意します。
はじめに、NGUIを表示するための準備をします。

NGUIメニュー > Create a New UI > デフォルト設定のまま[Create your UI]をクリック

こんな階層ができます↓

20120924powergage003.png

この中にある「Panel」階層下にNGUIのLabelオブジェクトを置くとGUIとして表示されるようになります。

NGUI > Create a Widget

として、↓のウィンドウが出るので、適当にサンプルフォントを適用してLabelを生成します
※Label生成の詳しい話はこちら

20120924powergage004.png

Inspectorウィンドウに「Label」ができます↓

20120924powergage005.png

ただ、このままの状態だと問題があります。

【問題1】キャラクターの数だけLabelオブジェクトが必要になる

だったら、Labelオブジェクトをプレファブにして、必要な分だけあとでインスタンスを
生成すればいいじゃん!

【問題2】インスタンスを生成すると、最上位の階層に生成してしまうため、そのままでは表示されない
※NGUIのPanel階層下でしかLabelオブジェクトは表示されないようです(自己確認)

ということで、解決したのはこの形。

【問題1】→ インスタンスを生成する方法(Instantiate())はそのまま採用
【問題2】→ 生成したインスタンスをPanel階層下に移動した

ということで、Labelをプレファブ化しました↓

20120924powergage006.png

「Label_Controller.js」を適用しています。
Label_Controller.js
-------------------------------------------------
private var myHP : int;
private var label : UILabel;

function Start () {
// キャッシュ
label = gameObject.GetComponent(UILabel);
// NGUIのPanel階層下に置く
transform.parent = GameObject.Find("Panel").transform;
// 初期位置
transform.localScale = Vector3(30, 30, 1);
transform.localPosition = Vector3.zero;
}

function Update() {
// ラベル書き換え
label.text = "" + myHP;
}

function SetMyHP(input : int) {
myHP = input;
}
-------------------------------------------------
ここでの肝は、Start()にある

transform.parent = GameObject.Find("Panel").transform;

です。
自分(NGUIのLabelオブジェクト)の親を「NGUI階層の中にあるPanel」にすることで、
↓のように、インスタンスをPanelの直下に移動させることができました。

20120924powergage007.png

これで、GUIでも表示されるようになります。
あとは、Update()内で表示を更新したり、SetMyHP()メソッドを用意してLabelを書き換えられるようにしました。

これで準備が整いました。
いざ、実験です。

流れはこんな感じです。

(1)Mob_Controller.js で NGUIのLabelのインスタンスが生成される
(2)インスタンスが生成されると、インスタンス自身がNGUIのPanel階層下に移動
(3)(2)によって、NGUIに表示されるようになったので、キャラクターの移動に合わせて
 インスタンスの座標も移動

キャラクターを2体用意してみました。

HPが70。
20120924powergage008.png

HPが50。
20120924powergage009.png

これがプレビュー画面です↓

20120924powergage010.png

うまくいきました。
キャラの動きに合わせて、HPの表示も移動します。
よかったよかった。

※HPの動的更新とか、Labelオブジェクトの削除処理とかは実装していません。


これまで、必要な分だけLabelを用意していたので
「プレファブ化&インスタンス生成」という方法は非常に助かります。
まだまだ知らないことは盛りだくさん!
タグ:panel UNITY NGUI Label
posted by be-style at 13:55| Comment(3) | Unity
この記事へのコメント
解説が解り易くて非常に勉強になります。

質問なのですが、こちらの内容通りにやってみたのですが、Label_Controller.jsを書いていたら、

Assets/Script/UI/Label_Controller.js(4,21): BCE0018: The name 'UILabel' does not denote a valid type ('not found').

というエラーログが出ました。NGUIのUILabelスクリプトに問題があるという事でしょうか?

教えて頂けたら幸いです。
Posted by at 2014年09月15日 23:39
コメントありがとうございます。

JavascriptでNGUIのクラス(UILabel、UISpriteとか)を使うには事前準備が必要になります。
詳しくはこちらの記事をご覧ください。

http://blog.be-style.jpn.com/article/54284031.html?1410820274

この記事でコメントを頂いたのですが、以下の操作が必要です。

---------------------------------------
(1)「Plugins/NGUI」のフォルダを作る
(2)「NGUI/Scripts」配下の「Interaction」「Internal」「Tweening」「UI」フォルダを(1)のフォルダに移動
---------------------------------------

お試しください!
Posted by be-style at 2014年09月16日 07:34
返信ありがとうございます!うまく行きました!
Posted by at 2014年09月16日 09:30
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]