【Unity】ToggleGroup内のToggleでSelectアニメーションを維持できるToggle拡張クラスを作成する

はじめに

ToggleGroup内で上記のような設定にした場合UI外部分の画面をクリックするとSelected状態が解除されてしまいます

なのでUI外部分の画面をクリックしてもSelected状態が解除されないようにしていきます

環境はUnity 2021.3.25f1です

Universal Render Pipeline を使用しています。

スクリプト作成

下記スクリプトを作成してアタッチされているToggleをこのクラスに置き換えてください。

using UnityEngine.UI;
using UnityEngine.EventSystems;
/// <summary>
/// ToogleGroupでSelectアニメーションを維持できるToggle拡張クラス
///  最初からSelectアニメーション再生させるために
///  ToogleGroupのStart後にSelect()で選択状態にする必要がある
/// </summary>

public class TestToggle : Toggle
{
    void Awake()
    {
        onValueChanged.AddListener((a) => OnValueChange(a));
    }
    public override void OnDeselect(BaseEventData eventData)
    {
        base.OnDeselect(eventData);

        if (isOn)
        {
            DoStateTransition(SelectionState.Selected, false);
        }
        else
        {
            InstantClearState();
        }
    }
    public override void OnPointerEnter(PointerEventData eventData)
    {
        if (isOn)
        {
            return;
        }
        base.OnPointerEnter(eventData);

    }
    public override void OnPointerClick(PointerEventData eventData)
    {
        if (isOn)
        {
            return;
        }
        base.OnPointerClick(eventData);

    }
    public override void OnPointerUp(PointerEventData eventData)
    {
        if (isOn)
        {
            return;
        }

        base.OnPointerUp(eventData);

        if (!isOn)
        {
            InstantClearState();
        }
    }
    public override void OnPointerExit(PointerEventData eventData)
    {
        if (isOn)
        {
            return;
        }
        base.OnPointerExit(eventData);

    }
    public override void OnPointerDown(PointerEventData eventData)
    {
        if (isOn)
        {
            return;
        }
        base.OnPointerDown(eventData);
    }
    public void OnValueChange(bool flg)
    {
        if (isOn)
        {
            DoStateTransition(SelectionState.Selected, flg);
        }
        else
        {
            InstantClearState();
        }
    }
}

完成

UI外部分の画面をクリックしてもSelected状態が解除されないようになりました