天天看點

RectMask2D裁剪Canvas無效問題

類似下面這樣的層級結構,白色區域為ScrollView可見區域,RectMask2D添加在ScrollView上。

可以看到Canvas下的Image1沒被裁剪掉,不在Canvas下的Image2裁剪掉了。

RectMask2D裁剪Canvas無效問題

 【原因分析】

RectMask2D内部有一個裁剪對象清單,隻有在這個清單中的對象才會被裁剪,這邊就是Image1沒被添加到這個清單中造成的。

ugui的實作邏輯就是,如果MaskableGraphic對象和RectMask2D層級間,如果出現了Canvas,那這個對象就不會添加進去。

具體的實作可以檢視:MaskableGraphic.UpdateClipParent,在這個函數中确定被哪個RectMask2D裁剪(添加到它的裁剪對象清單中)

【解決思路】

添加一個代理類,這個類對象會被添加到RectMask2D的裁剪對象清單中,然後在收到裁剪調用的時候,我們把調用轉發到Image1去。

最終效果:

RectMask2D裁剪Canvas無效問題

ScrollView嵌套ScrollView的情況也沒有問題:

RectMask2D裁剪Canvas無效問題

【關于IClippable接口】

void Cull(Rect clipRect, bool validRect)

void SetClipRect(Rect value, bool validRect)

這兩個函數的參數類似,可能容易産生混淆。

Cull用于檢測是否要把自己從渲染中剔除的,比如:可以在這邊判斷是否不在ScrollView的可見區域内,不在時可以從渲染中剔除,一定程度上提高渲染性能。

SetClipRect用于設定自己的裁剪區域,比如裁剪區域變大時,重新調整裁剪區域。或者裁剪區域沒了,關掉裁剪區域。

繼續閱讀