質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

3828閲覧

UnityでOrderInLayerを設定したTextをマスクしたい

yrema

総合スコア287

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/03/16 09:13

以下のような状態から
イメージ説明

以下のようにNew Textをマスクしたいです。
イメージ説明

しかしTextにはCanvasコンポーネントのOrderInLayerが設定されており、これがあるとマスクが効きません。
OrderInLayerは描画順の制御で必要なため削除はできません。OrderInLayerが設定されている状態でもマスクする方法はないでしょうか?

各Inspectorは以下の通りです。
イメージ説明
イメージ説明
イメージ説明

◆環境
Unity2019.2.17f1
Windows10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ちょっと見てみた感じでは、どうやらUIを構成する際にオブジェクトがどのマスクから影響を受けるかはMaskUtilities.GetRectMaskForClippableが返す結果に基づいているようです。
このメソッドは今回のようなケース...つまり階層上でRectMask2Dオブジェクトとマスキング対象オブジェクト(Text)の間にOverride SortingがオンのCanvasがある場合(Textオブジェクト自身にCanvasがアタッチされている場合もこの状況に該当するみたいです)、マスキング対象オブジェクトに対してそのRectMask2Dを作用させる必要はないと判定しているようでした。

なにかOverride Sortingを使わない方法で描画順制御ができそうなら、そちらのやり方に切り替えた方がいいかもしれませんね。
Override Sortingを使うしかないなら、ちょっと不格好ですが下図のように...

図

Text自身にCanvasをアタッチするのはやめて独立したキャンバスオブジェクトにし、その子として画面上の位置・サイズが本来のマスクと同じになるように配置したマスクをもう一つ置き、さらにその子としてTextを配置することになるんじゃないかと思います。

階層構造を変えずに何とかしたい場合、RectMask2D.AddClippableを使ってTextオブジェクトをRectMask2Dオブジェクトに追加してやれば、Override SortingがオンのCanvasをまたぐ階層構造であってもマスキングできるようです。
ですがゲーム開始時などに1回だけAddClippableを行うのだと、ゲーム実行中にUIの再構成が発生するとまた元に戻されてしまうようですから、必要に応じて再びAddClippableを実行する必要があるでしょう。
多少の負荷を気にしなくてもいいなら、Updateなどで常時AddClippableを行ってしまってもいいと思います。一例として、下記のようなスクリプトをTextオブジェクトにアタッチしてみてはどうでしょうか。

C#

1using UnityEngine; 2using UnityEngine.UI; 3 4[RequireComponent(typeof(MaskableGraphic))] 5[ExecuteAlways] 6public class RectMask2DForceEnabler : MonoBehaviour 7{ 8 private MaskableGraphic graphic; 9 10 private MaskableGraphic Graphic 11 { 12 get 13 { 14 if (this.graphic == null) 15 { 16 this.graphic = this.GetComponent<MaskableGraphic>(); 17 } 18 19 return this.graphic; 20 } 21 } 22 23 private void Update() 24 { 25 var parent = this.transform.parent; 26 if (parent == null) 27 { 28 return; 29 } 30 31 var mask = parent.GetComponentInParent<RectMask2D>(); 32 if (mask == null) 33 { 34 return; 35 } 36 37 mask.AddClippable(this.Graphic); 38 } 39}

投稿2020/03/21 23:08

Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問