How to make a 2D array of buttons?

Hello, i want to make a 5 x 5 grid with an array of buttons, so then i could sum rows and columns independently, i already have a 2d array on code, but i want to know how could i transform this in to a visible UI:

public int Row = 5;
public int Column = 5;

    int sum = 0;

private int[,] numbers = new int [Row,Column];

void start (){
	for (int x=0; x < Row; x++){
		for(int y=0; y < Column; y++){
	/* for example if (y == 1){
             sum +=  grid [x,y]; }    */
            
		}
	}
}

Hi, use Grid Layout Group to design your grid add buttons Ui as childrens.

use a public gameobject type list in your script, use unity inspector to grab all your buttons inside the list.

public List<Button>  ButtonsArrayList;

var num = 1;
for (var x = 0; x < 5; x++)
{
for (var y = 0; y < 5; y++)
{
arrayInts[x, y] = num;
sum += arrayInts[x, y];
Debug.Log(sum);
num++;
}
}

To create an UI from script would be something like this :

private int sum;

    private readonly int[,] arrayInts = new int[5, 5];

    private void Awake()
    {
        CreateUi();
    }

    private void CreateUi()
    {
        var canvas = new GameObject("Canvas");
        canvas.gameObject.AddComponent<RectTransform>();
        canvas.gameObject.AddComponent<Canvas>().renderMode = RenderMode.ScreenSpaceOverlay;
        canvas.gameObject.AddComponent<GraphicRaycaster>();
        canvas.gameObject.AddComponent<CanvasScaler>();

        var panel = new GameObject("Panel");
        panel.gameObject.AddComponent<RectTransform>();
        panel.gameObject.AddComponent<CanvasRenderer>();
        panel.AddComponent<Image>();
        panel.GetComponent<Image>().color = new Color(1, 1, 1, 0.2f);
        panel.GetComponent<RectTransform>().SetParent(canvas.GetComponent<RectTransform>());

        panel.gameObject.GetComponent<RectTransform>().offsetMin = Vector2.zero;
        panel.gameObject.GetComponent<RectTransform>().offsetMax = Vector2.zero;
        panel.gameObject.GetComponent<RectTransform>().pivot = new Vector2(0.5f, 0.5f);
        panel.gameObject.GetComponent<RectTransform>().anchorMin = Vector2.zero;
        panel.gameObject.GetComponent<RectTransform>().anchorMax = Vector2.one;
        panel.gameObject.GetComponent<RectTransform>().sizeDelta = Vector2.zero;

        panel.gameObject.AddComponent<GridLayoutGroup>();
        panel.gameObject.GetComponent<GridLayoutGroup>().constraint = GridLayoutGroup.Constraint.FixedRowCount;
        panel.gameObject.GetComponent<GridLayoutGroup>().constraintCount = 5;
        panel.gameObject.GetComponent<GridLayoutGroup>().childAlignment = TextAnchor.MiddleCenter;

        var button = new GameObject("Button");
        button.gameObject.AddComponent<RectTransform>();
        button.gameObject.AddComponent<CanvasRenderer>();
        button.AddComponent<Image>();
        button.gameObject.AddComponent<Button>();

        var text = new GameObject("Text");
        text.gameObject.AddComponent<RectTransform>();
        text.gameObject.AddComponent<CanvasRenderer>();
        text.gameObject.AddComponent<Text>();
        text.gameObject.GetComponent<Text>().font = Font.CreateDynamicFontFromOSFont("Arial", 14);
        text.gameObject.GetComponent<Text>().color = Color.grey;
        text.gameObject.GetComponent<Text>().alignment = TextAnchor.MiddleCenter;
        text.GetComponent<RectTransform>().SetParent(button.GetComponent<RectTransform>());

        var num = 1;
        for (var x = 0; x < 5; x++)
        {
            for (var y = 0; y < 5; y++)
            {
                var newButton = Instantiate(button);
                newButton.GetComponentInChildren<Text>().text = num.ToString();
                newButton.GetComponent<RectTransform>().SetParent(panel.GetComponent<RectTransform>());
                var x1 = x;
                var y1 = y;
                newButton.GetComponent<Button>().onClick.AddListener(delegate { Sum(arrayInts[x1, y1]); });
                arrayInts[x, y] = num;
                num++;
            }
        }
    }

    private void Sum(int num)
    {
        sum += num;
        Debug.Log(sum);
    }

Of course you can create the UI elements in editor and assign it to the script :slight_smile: