【Unity Tips】 スクリーン座標とワールド座標の切り替えと使用例
オブジェクトの「スクリーン座標」/「ワールド座標」の変換は、
・マウスクリックした位置を3D座標に落とし込む
・タップした位置に移動したり、何かを表示する
等にも使うかと思いますが、
今回は様々な位置にあるオブジェクトに対して固定サイズのUIを表示する場合
の例になります。
具体的には、下記図①のようなイメージになります。
※白黒の物がUIだと思って下さい。
まず、オブジェクトの位置にUI(NGUIのUISprite)をそのまま出してカメラに写した場合、
UIの位置は正しいのですが、
図②のように、近距離では大きく、遠距離では小さく表示されてしまいます。
次に、「Perspectiveカメラ」と同位置に「Orthographicカメラ」を置いて、
「Orthographicカメラ」側でUIを写した場合、
図③のようにUIのサイズは均等になりますが、
UIが画面端に行けば行くほど、パースの分の位置のズレが発生してしまっています。
※作成中のゲームではこの処理になってました
(見下し気味の視点だったので目立たなかっただけです・・・)
ではどうするか、ですが、
Perspectiveカメラを元に
オブジェクトの位置をスクリーン座標として取得し、
そのスクリーン座標をOrthographicカメラに渡して、
その位置にダメージの値のUIを発生させる事で、
図①のように表示する事ができます。
具体的には以下な感じです。
------------------------------------------------------------------------------
//文字を発生させる座標(Base_UIPos)をPerspectiveカメラのワールド座標からスクリーン座標に変換
Vector3 UIPos = GameCamera.WorldToScreenPoint(Base_UIPos);
//Z(奥行き)の位置は固定
UIPos.z = 1.0f;
//文字の座標をスクリーン座標からOrthographicカメラのワールド座標に反映
UISpriteObject.transform.position = DamageCamera.ScreenToWorldPoint(DamagePos);
------------------------------------------------------------------------------
自分はダメージ表記、取得経験値表記が主ですが、
敵キャラの位置にHPバーを表示する場合等にも有効ですね。
« 【Unity Action】バトル中のスコア取得、実装・・・の前に | トップページ | 【Unity Action】 基本的なバトル中のスコア処理実装完了 »
「 Unity Tips」カテゴリの記事
- 【Unity Action】 今週の進捗(9月2週目)(2017.09.12)
- 【Unity Tips】簡単な汎用UIシェーダー例(色相/彩度/明度)(2017.06.05)
- 【Unity Tips】 いくつかアセットを紹介(2016.01.12)
- 【Unity Tips】 地形テクスチャの作り方について考察(2015.04.23)
- 【Unity Tips】 CharacterControllerでコリジョンを滑り落ちよう(2015.03.01)
コメント
« 【Unity Action】バトル中のスコア取得、実装・・・の前に | トップページ | 【Unity Action】 基本的なバトル中のスコア処理実装完了 »
Karasuさん、はじめまして。
いつも、拝読させていただいております。
ちょうどこの記事にあるやり方を調べていて、この投稿にたどり着きました。
いつも貴重な情報ありがとうございます。
投稿: マルソ | 2013年9月25日 (水) 22時22分
>マルソさん
初めまして。
ちょうどいい内容があったようで何よりです。
最近開発記事更新遅めですが、これからもよろしくお願いします(;´Д`)
投稿: Karasu | 2013年9月29日 (日) 23時45分