UGUI—单选按钮

作者:追风剑情 发布于:2020-7-23 18:10 分类:Unity3d

RadioButton.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
/// <summary>
/// 单选按钮
/// </summary>
public class RadioButton : MonoBehaviour, IPointerClickHandler
{
    public int id;
    [SerializeField]
    private Image m_Image;
    [SerializeField]
    private Sprite m_SelectSprite;
    [SerializeField]
    private Sprite m_UnSelectSprite;
    [SerializeField]
    private bool m_Check = false;
    [NonSerialized]
    public RadioButtonGroup group;

    public void OnPointerClick(PointerEventData eventData)
    {
        if (m_Check)
            return;
        Check = true;
    }

    public bool Check
    {
        get { return m_Check; }
        set
        {
            if (value == m_Check)
                return;
            m_Check = value;
            m_Image.sprite = m_Check ? m_SelectSprite : m_UnSelectSprite;

            if (m_Check && group != null)
                group.Check(this);
        }
    }

    void Start()
    {
        m_Image.sprite = m_Check ? m_SelectSprite : m_UnSelectSprite;
    }
}

RadioButtonGroup.cs

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.Events;
using UnityEngine.EventSystems;
/// <summary>
/// 单选按钮组
/// </summary>
public class RadioButtonGroup : MonoBehaviour
{
    [SerializeField]
    private List<RadioButton> list = new List<RadioButton>();

    [Serializable]
    // 定义按钮OnRadioCheck事件类
    public class OnRadioCheckEvent : UnityEvent { }

    // 防止序列化变量重命名后丢失引用
    [FormerlySerializedAs("onCheck")]
    [SerializeField]
    private OnRadioCheckEvent m_OnCheck = new OnRadioCheckEvent();

    void Start()
    {
        for (int i=0; i<list.Count; i++)
        {
            if (list[i] == null)
                continue;
            list[i].group = this;
        }
    }

    public void Check(RadioButton radio)
    {
        for (int i = 0; i < list.Count; i++)
        {
            if (list[i] == null || list[i] == radio)
                continue;
            list[i].Check = false;
        }
        m_OnCheck.Invoke();
    }
}

标签: Unity3d

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号