chyam

[unity] - 버튼 순서대로 누르면 성공하는 퍼즐 본문

unity

[unity] - 버튼 순서대로 누르면 성공하는 퍼즐

chyam_eun 2024. 9. 12. 14:18

구현 목표는 저장된 순서대로 버튼을 누르면 성공하는것이다. 

한번눌렀다가 다시 누르면 취소되어야 하고, reset버튼을 통해 모두 초기화도 가능하도록한다.

 

그래서 누를때마다 리스트에 저장되는것을 생각했다. 

버튼의 text는 간단하게 A,B,C,D,E로 해주었다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System.Linq;

UI는 버튼, TMPro는 텍스트에 접근하기위해, Linq는 나중에 Sequence equal을 사용하기위해 추가해줬다.

    public List<string> blank = new List<string> { "P", "P", "P", "P", "P" };
    public int clickCnt = 0;
    public int cnt = 0;
    public Button[] btn;

List를통해서 버튼을 저장하기위해서 먼저 아무글자로 초기화를 해줬다. 

clickCnt는 클릭한 번호라고 볼수있다. 

cnt는 아직 제대로 안해두긴했는데, stack에 여러 경우의 수를 둘거라서 나중에 랜덤값을 가지게 할것이다. stack의 인덱스를 나타내며 현재는 0번째 stack값으로 버튼순서를 정하였다. 

btn은 버튼들을 저장해줬다.

 

    public void BtnClick(Button clickedBtn)
    {
        
        TextMeshProUGUI btnText = clickedBtn.GetComponentInChildren<TextMeshProUGUI>();
        Image btn=clickedBtn.GetComponentInChildren<Image>();
        List<List<string>> stack = new List<List<string>>();
        stack.Add(new List<string> { "E", "A", "C", "D", "B" });
        stack.Add(new List<string> { "C", "A", "D", "E", "B" });
        string text=btnText.text;
        int textIndex = blank.IndexOf(text);
        if (textIndex==-1)
        {
            blank[clickCnt] = text;
            clickCnt++;
            btn.color = new Color(0.5f,1,1,0.5f);
        }
        else
        {
            blank[textIndex] = "P";
            clickCnt--;
            btn.color = new Color(1,1,1, 1);
        }
        int pIndex = blank.IndexOf("P");
        if (clickCnt >= 5)
        {
            if (pIndex == -1)
            {
                if (stack[cnt].SequenceEqual(blank))
                {
                    Debug.Log("Success");
                    return;
                }
            }
            else
            {
                Debug.Log("Reset Plz");
                ResetBtn();
                return;
            }
        }
    }

btnText로 클릭한 버튼을 불러온다. 

 

누른 버튼의 색을 바꾸기 위해서 Image로 저장해준다.

 

stack에 2차원배열로 새로운 리스트를 만든다. 

여러개의 버튼 순서들을 추가해준다.

 

text에 btnText의 text를 저장한다. 

 

textIndex는 text가 blank에 있는지 확인해주는 숫자이다. 

-1인거면 blank에 없는것이므로 clickCnt인덱스에 text를 저장해주고 ++해준다.

그리고 색을 바꿔줘서 누른것이 보이도록한다. 

 

만약에 -1이 아니면 blank에 있는것이므로 textIndex의 값을 초기화시키고 clickCnt--를 해주고 색도 원래대로해준다. 

 

pIndex는 "P"가 있는지를 확인해준다.

 

clickCnt가 5이상인거면 다 한번이상은 누른것이므로 그때부터 비교해준다.

pIndex가 -1이라는것은 blank에 P아닌것들이 하나씩 들어간것이므로 stack과 비교해서 성공했는지를 알려준다.

 

-1이아니라면  다시 초기화해야한다.

    public void ResetBtn()
    {
        blank = new List<string> { "P", "P", "P", "P", "P" };
        clickCnt =0;
        for (int i = 0; i < btn.Length; i++)
        {
            Image btnImage = btn[i].GetComponentInChildren<Image>(); // Image 컴포넌트 가져오기
            if (btnImage != null)
            {
                btnImage.color = new Color(1, 1, 1, 1); // 버튼 색상을 초기 색상으로 변경
            }
        }
    }

ResetBtn은 누르면 초기화되는 버튼이다. 

blank와 clickCnt를 초기화시켜준다.

 

for문을 통해서 버튼색도 초기화시켜준다.