原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】(小ネタ)Hierarchy 内の順番をスクリプトで動的に変える

Home画面

Youtubeでつい魔が差して兵庫県知事選に関する動画を二,三個見たら以後のHome画面が政治系のまとめ動画で埋め尽くされてウンザリな皆さんこんにちは。Youtubeさん、お勧めだろうがショートだろうが至る所に立○孝○の顔を出すのは止めてください。私、NHKの受信料はちゃんと払うタイプなんで。

 

UIの表示順

3Dオブジェクトを扱う場合、Hierarchy内の順序をあまり気にすることはありませんが、Canvasなどに設置するUIオブジェクトの場合、Hierarchy内の順序がオブジェクトの表示順を決定するので、その順序をきちんと考慮して設定する必要があります。
例えば、下図のように幾つかのImageを重ねて表示する場合、最前面に配置したいImageはHierarchy内の(子オブジェクトの中で)一番下に設置し、最背面に配置する場合は一番上に設定する必要があります。

Image4が最前面になる場合のHierarchy内の順序は

Image4が一番下に位置する

基本的にUIの表示順を変えるケースは少ないと思いますがUnityではTransformコンポーネントにオブジェクトの階層や順序を変更するメソッドが用意されています。

 

SetSibling 系メソッド

TransformのSetSibling 系メソッドは、シーン内のオブジェクトの(子オブジェクトの中で)の順序をプログラム上から変更することを可能にします。
Canvas上に設定されるImageなどのUI系オブジェクトの場合、InspectorではRectTransformがアタッチされておりTransformは見えませんがUI系オブジェクトもGameObjectの一つなので、そこからtransformを指定してSetSibling系のメソッドを使用してオブジェクトの順序を変更する事ができます。
具体的には、SetAsFirstSibling、SetAsLastSibling、SetSiblingIndexの3つのメソッドがこれに該当します。

 

■SetAsFirstSibling

SetAsFirstSiblingメソッドは、ローカルのTransformリストで一番最初の順番に移動します。つまり子オブジェクトの中で一番上に設定される為、画面上は最背面にオブジェクトが表示されます。(ここら辺ちょっとややこしい…)

 

// GameObjectを階層内の最初の位置に移動
gameObject.transform.SetAsFirstSibling();

 

先程の例ではgameObjectにImage4を指定し、上記メソッドを実行するとImage4はHierarchy内でCanvasの子オブジェクトの中で最背面に設定されます。

 

■SetAsLastSibling

こちらは先程と逆にローカルのTransformリストで一番最後の順番に移動します。これによってオブジェクトが(子オブジェクトの中で)最前面に表示されます

 

// GameObject を階層内の最後の位置に移動
gameObject.transform.SetAsLastSibling();

gameObjectにImage1を指定し、上記メソッドを実行するとImage1はHierarchy内でCanvasの子オブジェクトの中で最前面に設定されます。

 

■SetSiblingIndex

特定の位置を指定したい場合はSetSiblingIndexメソッドを使用します。インデックスは0から始まった順番を指定しますが、例によって0がHierarchyで一番上=最背面に表示される事を考慮する必要があります

 

// GameObject を階層内の特定の位置(インデックス1)に移動
gameObject.transform.SetSiblingIndex(1);

先程の例ではgameObjectにImage3をIndex1の位置に移動させるとImage3はImage2の下に表示されます。

 

おわりに

今回はUIオブジェクトに対してHierarchy内の順番を変更していますが、もちろん普通の3Dオブジェクトに対しても同様の操作を行う事は可能です。
ただ、3Dオブジェクトの場合は表示順でなくZ位置やシェーダーの設定に依存する為、Hierarchy内の順番を変更する意味は余りありません。
GetChildで取得される子オブジェクトの順番(インデックス)ぐらいでしょうか。

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。