UGUIカーネル大探究(五)ToggleとToggleGroup



Toggle(スイッチ)はUGUIのコンポーネントで、Selectableクラスから継承されています。つまり、マウスイベントに応じて状態を変換することができます。UGUIカーネル大探究(四)SelectableとButtonではSelectableとButtonの実現原理を説明した。この文章はToggleの実現原理を探究する。


慣例に従って添付する
UGUIソースダウンロードアドレス
.
ToggleはSelectableから継承され、IPointerClickHandler、ISubmitHandlerの2つのインタフェースも追加的に継承されます.△もう一つのICanvasElementは、Canvasがレンダリングするときに呼び出されるインタフェースです.ここではしばらく話しません.
Toggleには重要なbool変数m_がありますIsOn(対応メンバー属性IsOn)は、チェックされているかどうかを示します.Buttonと同様に、Toggleにも外部リスニング用のonValue Changedイベントがありますm_IsOnが変わったかどうか.
Toggleはスタートメソッドを書き換え、スタート時にPlayEffect(状態に応じて画像の透明度を変更/グラデーション)を呼び出す.
OnEnableとOnDisableも書き換えられている(呼び出しタイミングはUntiy 3 Dコンポーネントのチラシ(一)OnEnabledとOnDisabledを参照)、OnEnable時にToggleGroup(後述)に登録しPlayEffectを呼び出す.OnDisableではToggleGroupから自分を移動します.
また、O n D i d A p l yAnimationPropertiesも書き換え、m_IsOnがアニメーションで変更されたかどうか(画像のAlphaがゼロに近いかどうかを判断).
OnPointerClickとOnSubmitはInternalToggleメソッドを呼び出してToggleの状態isOn=!isOn,isOnはToggleのメンバー属性であり,setアクセサがToggleのSetメンバーメソッドを呼び出す.
Setメソッドはm_を設定するために使用されますIsOnの値を指定し、イベントを送信します.
        void Set(bool value, bool sendCallback)
        {
            if (m_IsOn == value)
                return;

            // if we are in a group and set to true, do group logic
            m_IsOn = value;
            if (m_Group != null && IsActive())
            {
                if (m_IsOn || (!m_Group.AnyTogglesOn() && !m_Group.allowSwitchOff))
                {
                    m_IsOn = true;
                    m_Group.NotifyToggleOn(this);
                }
            }

            // Always send event when toggle is clicked, even if value didn't change
            // due to already active toggle in a toggle group being clicked.
            // Controls like Dropdown rely on this.
            // It's up to the user to ignore a selection being set to the same value it already was, if desired.
            PlayEffect(toggleTransition == ToggleTransition.None);
            if (sendCallback)
                onValueChanged.Invoke(m_IsOn);
        }

また、Setメソッドはm_を呼び出すGroup.NotifyToggleOn(this).
ToggleGroupはUIBehaviourから継承され、複数のToggleを1つのグループに分けて複数のToggle状態をOnに保つことができます.m_がありますTogglesのメンバー変数です.Toggleタイプのリストです.Toggle Groupに登録されているすべてのToggleを保存します.前述したように、ToggleはOnEnableableのときにgroupに登録し、OnDisableのときにgroupを移動し、またgroup属性に値を割り当てることでToggleを指定したToggle Groupに登録することもできます(一般的にエディタが設定してくれます).
登録と削除のコードは簡単です.toggleをm_に追加します.Togglesまたはm_からToggles削除.
NotifyToggleOnこの方法は、入力したToggle以外のすべてのToggleをオフにします(isOn=false).
ToggleGroupのいくつかのメソッドを呼び出すこともできます.たとえば、AnyToggleOnがToggleオープンがあるかどうかを判断し(Toggleのsetメソッドもこのメソッドを呼び出します.つまり、Toggleオープンがなく、groupがすべてのToggleクローズを許可しない場合、強制的にオープンに設定します)、ActiveTogglesはオープンのToggleを取得し、SetAllTogglesOffはすべてのToggleを閉じます.