You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

59 lines
1.7 KiB

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<ButtonElement> selectedButtons = new List<ButtonElement>();
public event Action<int, Button, bool> 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] });
}
}