[UNITY]/TIL: UNITY

히든스테이지 로직 만들기

네,가능합니다 2024. 9. 10. 16:21

금일은 첫주차 협업프로젝트(카드 뒤집기 게임)에서 히든스테이지를 만들어 보았다.

 

히든스테이지와 관련된 로직을 보고 주석을 달아가며 복습해보자.

 

아래는 첫 출발인 스테이지 확인 로직이다.

 

    public static int stageLevel = 0; // 스테이지 확인 변수선언
    public void NomalBtn() //노말버튼 클릭시
    {
        SceneManager.LoadScene("MainScene");// 메인씬 이동 후
        stageLevel = 1; // 1 == 노말
    }

    public void HardBtn() // 하드
    {
        SceneManager.LoadScene("MainScene");// Check ex)HardScene
        stageLevel = 2; // 2 == 하드
    }

    public void HiddenBtn() // 히든
    {
        SceneManager.LoadScene("MainScene");// Check ex)HiddenScene
        stageLevel = 3; // 3 == 히든
    }

 

위 코드를 통해 버튼클릭을 하면 메인씬으로 이동 후 stageLevel 변수에 숫자를 넣어 노말 하드 히든을 구분할 수 있게 해뒀다.

 

다음 순서의 코드는 아래와 같다.

아래의 코드는 카드 생성 및 카드 배치에 관련된 코드이다.

 

int difficulty = StageButton.stageLevel; // 아까 다른 스크립트에서 생성해둔 stageLevel변수를 difficulty변수에 넣어주고
int cardNum = 0;    // 카드생성을 위한 변수 초기화
// 아래는 스테이지 레벨에 따른 카드수 결정
switch(difficulty) {
    case 1 : // Normal
        cardNum = 12; // 노말12장
        break;
    case 2 : // Hard
        cardNum = 20; // 하드20장
        break;
    case 3: // hidden
        cardNum = 10; // 히든10장
        break;
}
// 아래는 카드 생성 및 랜덤 배치 로직
List<int> arr = new List<int>();
for (int i = 0; i < cardNum; i++) {
    arr.Add(i/2);
}
arr = arr.OrderBy(x => Random.Range(0f, cardNum/2-1)).ToList(); 

for (int i = 0; i < cardNum; i++) {
    GameObject go = Instantiate(card, this.transform);

    go.transform.SetParent(cards);
    go.GetComponent<Card>().Setting(arr[i]); // 카드 기본 설정

    GameManager.Instance.cardCount = arr.Count;
}// 위는 카드 생성 및 랜덤 배치 로직

 

위 코드를 통해 노말 하드 히든 모드를 구분하여 카드의 수를 다르게 생성해주고

 

우리가 원했던것은 히든모드에서는 매니저님 4분의 사진과 폭탄한장을 넣어서

폭탄 두개를 먼저 맞출경우 바로 게임이 끝나게 만들고싶었다.

그리고 위의 로직을 그대로 사용하면서 히든모드에서만 사진을 다르게 넣어줘야해서

히든모드에 들어갈 사진의 이름은 ex)이미지20~24 로 해놓고

아래와같은 코드를 넣었다.  20 == 폭탄 , 21~24 == 매니저님들

 

    public void isMatched() {
        Debug.Log("[CardManager.cs] isMatched"); //코딩용 디버그로그

        int boom = StageButton.stageLevel; // 스테이지 레벨을 boom변수에 넣어주고
        if (boom == 3) // 스테이지가 히든일경우
        {
            if (firstCard.idx == secondCard.idx) // 두개가 동일한 카드이면
            {
                if (firstCard.idx == 0) // 폭탄인지 체크 > 폭탄이라면 {0이 폭탄인 이유 = 다음 코드묶음 참조}
                {
                    Invoke(nameof(EndGame), 1.5f); // 게임끝
                }
            }
        }
        // 아래는 동일카드 체크 및 게임종료 로직
        if(firstCard.idx == secondCard.idx) { 
            audioSource.PlayOneShot(audioClip);

            firstCard.HideCard();
            secondCard.HideCard();

            GameManager.Instance.cardCount -= 2;

            if (GameManager.Instance.cardCount == 0) {
                //GameManager.Instance.isPlay = false; // 게임이 종료됐음을 명시
                Invoke(nameof(EndGame), 1.5f);
            }
        }
        else {
            firstCard.CloseCard();
            secondCard.CloseCard();
        }
        CardReset();
    }

 

위 코드는 카드를 체크하는 로직이고 스테이지 모드에 따라 카드 이미지를 넣는 로직은 아래와 같다.

 

        int check = StageButton.stageLevel; // check 변수에 스테이지레벨을 넣어주고
        idx = number; // number = 생성된 카드 1/2

        if (check <= 2) // 노말이나 하드일시
        {
            frontImage.sprite = Resources.Load<Sprite>($"CardImage{idx}"); // 팀원 이미지 = 0~9
        }
        else if (check <= 3) // 히든모드일시
        {
            int hidden = idx + 20; // 이코드를 넣어서 간단하게 성공~
            frontImage.sprite = Resources.Load<Sprite>($"CardImage{hidden}"); // 폭탄 및 매니저님들 이미지 = 20~24
        }

 

 

사실 만들고나서 여기저기 코드가 좀 최적화 되지 않았다라고 느꼈다.

뭐든 원하는 기능을 구현할 줄 아는것이 개발자의 중요한 덕목이라고 생각한다.

하지만 단순히 구현만 하는 것이 아닌 최적화된 코드를 구현하는것이 중요하다고 생각하는데,오늘 몇가지 단순한 로직이지만 코딩을 해보고 느낀건 역시 깔끔한 코드를 짜는건 정말 쉽지않다고 생각이 드는 하루였다.