MaskableGraphicのUGUI

MaskableGraphicはグラフィックから継承された、とIClippable、IMaskable、IMaterialModifier 3つのインタフェースを継承しています。それはRawImage、画像や親クラスのテキストです。

 

のグラフィックから継承されたメソッド:

OnEnable:セットm_ShouldRecalculateStencil(テンプレートを再計算する必要が)UpdateClipParent(親オブジェクトの更新カット)を呼び出し、真である、SetMaterialDirty(汚い、グラフィック機能で作られたセット)を呼び出します。マスクコンポーネント場合は、再計算されたマスクをMaskUtilities.NotifyStencilStateChanged静的関数を呼び出します。

OnDisable:m_ShouldRecalculateStencilがtrueに設定され、順番にSetMaterialDirty UpdateClipParentを呼び出します。中StencilMaterialでm_MaskMaterialを取り外し、m_MaskMaterialがnullに設定置きます。マスクコンポーネント場合は、静的関数MaskUtilities.NotifyStencilStateChangedを呼び出します。

OnTransformParentChanged (とき親オブジェクトの変更):設定m_ShouldRecalculateStencilはターンコールUpdateClipParent、SetMaterialDirtyで、真実です。

(親オブジェクトのキャンバスステータス変更)OnCanvasHierarchyChanged:m_ShouldRecalculateStencilがtrueに設定され、UpdateClipParent、SetMaterialDirtyを呼び出し回します。

 

UpdateClipParentコードを見て:

     プライベート ボイドUpdateClipParent()
        { 
            VAR新規の親=(マスカブル&&のisActive())?MaskUtilities.GetRectMaskForClippable():ヌル; 

            // 新しい親が異なるか非アクティブである場合
            ならば(m_ParentMask =!ヌル &&(新規の親= m_ParentMask ||!!newParent.IsActive()))
            { 
                m_ParentMask.RemoveClippable(この); 
                UpdateCull(); 
            } 

            // 新規の親がアクティブでない場合、それを再度追加していない
            場合(新規の親!= nullを&& newParent.IsActive())
                newParent.AddClippable(この)。

            m_ParentMask = 新規の親。
        }

親オブジェクトは、(RectMask2Dコンポーネントは、セクションの範囲を超えてRectTransformの子オブジェクトの子オブジェクトの親RectTransformが遮断されるに応じてカットすることができる)のコンポーネントをRectMask2D見つけるMaskUtilities.GetRectMaskForClippableを呼び出します。

新規の親等しくないm_ParentMaskまたは新規の親が活性化されていない場合、それはRemoveClippable(偽、clippable.SetClipRectにRemoveClippable(新規のRect()と呼ばれる)は、長方形のカットを閉じ、そしてにおけるm_ClipTargetsのRectMask2Dから身を除去する)を呼び出し、その後除去更新します。

新規の親がアクティブにした場合、AddClippableは(中m_ClipTargetsのRectMask2Dに自分自身を追加すること)を呼び出します。

m_ParentMaskに割り当てられた新規の親。

 

のIClippableから継承されたメソッド:

(親オブジェクトの変更の際にIClippable状態と呼ばれる)RecalculateClipping:UpdateClipParentを呼び出します。

カル:validRectのclipRectが偽であるかrootCanvasRectの長方形と一致しない場合は、UpdateCullを呼び出します。UpdateCull、入力canvasRenderer.cullカル、canvasRenderer.cull =カル、に等しくない場合、コールバックm_OnCullStateChanged、グラフィックOnCullingChangedリコール機能。

SetClipRect:validRectが渡された値、開閉選択canvasRendererの長方形のカットを。

 

のIMaskableから継承されたメソッド:

RecalculateMasking:m_MaskMaterialでStencilMaterialを削除し、m_MaskMaterialがnullに設定され、m_ShouldRecalculateStencilは真、コールSetMaterialDirty機能に設定しました。

 

のIMaterialModifierから継承されたメソッド:

     パブリック 仮想材質GetModifiedMaterial(素材基本素材)
        { 
            VAR = toUse 基本素材。

            もし(m_ShouldRecalculateStencil)
            { 
                VARの rootCanvasの=のMaskUtilities.FindRootSortOverrideCanvas(変換)。
                m_StencilValue =マスカブル?MaskUtilities.GetStencilDepth(、rootCanvas変換):0 ; 
                m_ShouldRecalculateStencil = ; 
            } 

            // 我々が有効にマスクコンポーネントを持っている場合、それはなります
             // マスク材料を生成します。これは最適化です
            // これは、しかし:(コンポーネント間のいくつかのカップリングを追加 
            maskComponent = GetComponent <マスク>マスク;()
             であれば(m_StencilValue> 0 &&(maskComponent == NULL!|| maskComponent.IsActive()))
            { 
                VARの maskMat = StencilMaterial.Add( toUse、(1 << m_StencilValue) - 1、StencilOp.Keep、CompareFunction.Equal、ColorWriteMask.All、(1 << m_StencilValue) - 10 ); 
                StencilMaterial.Remove(m_MaskMaterial); 
                m_MaskMaterial =  maskMat。
                toUse= m_MaskMaterial。
            } 
            戻りtoUseと、
        }

GetModifiedMaterialは:m_ShouldRecalculateStencilがtrueの場合、MaskUtilities.FindRootSortOverrideCanvasによってrootCanvasを取得し、マスカブルに従って、ために割り当てられたテンプレートの深さまたは0をm_StencilValue、m_ShouldRecalculateStencilはfalseに設定しました

0より大きく、マスクm_StencilValueコンポーネントが存在しないか、またはアクティブ化されていない場合、m_MaskMaterialにStencilMaterialに基本素材、stencilID、操作およびその他のパラメータを入れて、新しい素材と交換します。

おすすめ

転載: www.cnblogs.com/pj2933/p/11028220.html