NGUIの描画順とマウスクリック位置からRayを飛ばしてHitするGameObjectを調査したのでメモ
NGUIが使用するカメラは「Orthographic」となっているので
手前にあっても奥にあって同じ大きさに描画されます。
NGUIの各UIコンポーネントには「Depth」というプロパティがあります。
これが描画の順番を表し
数値が大きければ大きいほど手前に表示されることになります。
UIPanel(Depth100)
│ └UILabel(Depth20)
│ └UISprite(Depth0)
│
UITexture(Depth50)
では、上記配置の場合UILabelとUISpriteとUITextureの前後関係はどうなるでしょうか
描画の順番は
1.UILabel
2.UISprite
3.UIPanel
4.UITexture
となりました。
子は親のDepthを基準に計算されてるっぽいです
また各コンポーネントをもっているGameObjectのInspector上でのZの値をみたとき
UIPanel(Z 100)
│ └UILabel(Z -50)
│ └UISprite(Z -20)
│
UITexture(Z 0)
この状態でスクリプトからNGUIのカメラにて、マウスクリック時にRayを飛ばしてHitしたGameObjectを取得した場合
最初にHitするのはどれでしょうか?
正解はUITextureのGameObjectが取得できます。
DepthはUICameraが描画する前後を指定できるものであり、
Unity3D空間座標はあくまでもObjectの前後関係を指定できるようでした
なぜこれを調べたのかというと
NGUIメニューから配置していくとZは0ばかりになっており
ボタンじゃないけどマウスクリックから処理を実行しようとしたときに
うまく取得できなかったからです
Rayを飛ばしてHit判定を考慮するばら、
ある程度Zの調整もしたほうがいいのかなと思う結果でした。
この記事へのコメント