ちょっと見てみた感じでは、どうやら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}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。