UGUIカーネル大探究(五)ToggleとToggleGroup
2930 ワード
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を閉じます.
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);
}