using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ButtonGroup : MonoBehaviour { struct ButtonElement { public int idx; public Button button; } [SerializeField] ButtonIV[] buttons; [SerializeField] int selectableCount = 1; List selectedButtons = new List(); public event Action OnChangedButtonState; private void Awake() { for(int i = 0; i < buttons.Length; i++) { ButtonElement buttonElement = new ButtonElement(); buttonElement.idx = i; buttonElement.button = buttons[i]; buttonElement.button.onClick.AddListener(() => OnClickButton(buttonElement)); } } private void OnClickButton(ButtonElement elm) { int removedCount = selectedButtons.RemoveAll((element) => element.idx == elm.idx); if (removedCount > 0) { elm.button.interactable = true; OnChangedButtonState?.Invoke(elm.idx, elm.button, false); } else if (selectedButtons.Count >= selectableCount) { var removedElm = selectedButtons[0]; removedElm.button.interactable = true; selectedButtons.RemoveAt(0); OnChangedButtonState?.Invoke(removedElm.idx, removedElm.button, false); } elm.button.interactable = false; selectedButtons.Add(elm); OnChangedButtonState?.Invoke(elm.idx, elm.button, true); } public void SelectButton(int idx) { if (idx < 0 || idx >= buttons.Length) return; OnClickButton(new ButtonElement { idx = idx, button = buttons[idx] }); } }