Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
42
Help us understand the problem. What is going on with this article?

More than 5 years have passed since last update.

@Ijoru

【Unity】uGUIでCanvasのRender Modeによってローカル座標への変換方法が異なる件

Unity4.6から導入されたuGUIはなかなかベンリなもので、さくっとGUIが作れる。
今回は、そのuGUIのRender Modeによる座標系への影響に関するお話。

Render Modeについて

CanvasのRender Modeは、デフォルトで「Screen Space - Overlay」となっている。
これはCanvasをオーバーレイ表示するモードで、普通に使う分にはこの状態で全然問題なっしんぐ。

しかし、uGUIとパーティクルを併用しようとすると、オーバーレイではパーティクルに被せてGUIを描画してしまうので、パーティクルが表示されない。

そういうときはRender Modeを「Screen Space - Camera」に変えて、CanvasのRender Cameraにメインカメラを紐付ければOK。
オーバーレイ表示とは違って、メインカメラに写して描画させるイメージですな。

Render Modeに応じたローカル座標系への変換方法

で、本題。

「Screen Space - Camera」に変えてもほとんどの機能は問題無く使える。
ただし、IDragHandler等でクリック位置の座標を得て、ローカル座標に変換しようとする場合には注意が必要。

例えば、下記のような形でドラッグ可能なGUI要素を作るとする。
この際、Render Modeに応じてローカル座標への変換方法が異なる。

C#
public class Hoge : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    ...略...

    public void OnDrag(PointerEventData ped)
    {
        // TODO ここでped.positionをthisのローカル座標に変換して使いたい
    }

    ...略...
}

1.「Screen Space - Overlay」の場合
「Screen Space - Overlay」だと、PointerEventDataのローカル座標変換は下記の形でOK。

C#
var localPos = transform.InverseTransformPoint(ped.position);

2.「Screen Space - Camera」の場合
「Screen Space - Camera」では下記の方法でローカル座標に変換する。

C#
Vector2 localPos = Vector2.zero;
RectTransformUtility.ScreenPointToLocalPointInRectangle(GetComponent<RectTransform>(), ped.position, Camera.main, out localPos);

「World Space」は試してないけど、RectTransformUtilityにそれっぽいメソッドがあったので、そのへん使えば出来るかも。

覚える事は結構あるけども、uGUIホント使えますなぁ。

42
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
42
Help us understand the problem. What is going on with this article?