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
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] });
|
|
}
|
|
}
|