게임개발/Unity

24-08-26 [르탄이 카드 뒤집기 게임 下]

몰록 2024. 8. 26. 16:36

이전 시간에 못짚고 넘어간거 이해해보기()

{   

         카드 배치하기 

          

          카드 사이즈가 1.3이고 빈 공간 0.1을위해 1.4만큼, 카드 하나 배치할때마다 1.4씩 늘어난다

         

          

          임의로 좌표를 설정해 줬을땐 이런식으로, 각각의 좌표에 1.4를 곱해주면 된다

          

         그래서 이 좌표를 어떻게 구할거냐인데, 그것을 4로 나눈 몫과 나머지( % )로 구하게 된다. 위에 두 그림을 비교하면            y값(수직)은 0 , 1, 2, 3 은 각각 0 , 4 , 8 , 12 의 몫이고, 반대로 x값 0, 1, 2, 3은 각각 0, 1, 2, 3의 나머지가 된다.

        이 방식으로  몫과 나머지를 구해서 1.4를 곱해주면 모든 좌표를 구할수 있게된다.

          그렇게 완성된 함수

        

}

 

4. 랜덤 이미지 

 

지난 시간에 대충 따라하기만 해봤지만 다시 강의를 보면서 정리 해보고자 한다

랜덤이미지는 이 전략에 따른다, 같은 숫자가 두개씩 반복되는 리스트를 만들고 그걸 섞는것이다.

숫자가 두개씩 반복되는 이유는 이 게임이 두개의 같은 이미지를 맞추는 게임이기 때문에 같은 이미지가 두개씩 있어야한다.

Board Script

 배열을 정의하는 함수. 이렇게 배열을 선언한뒤에 가령 arr[4]; 라고 쓰게되면 이 배열에 4번째의 값을 불러오게 된다는 뜻이다.

이제 이 배열을 섞어줘야한다. 강의에선 먼저 로직을 적어 준 뒤에 설명한다고 하니 따라해봤다.

Board Script

우선 새로운 using 문을 추가하고

 

Board Script

이런 문장을 적어줬다.

 

하나하나 보자면 : 

arr. = 적어준 배열에서 쓸수있는 기능.

OrderBy() = 정렬을 한다, 소괄호 안에 조건이 들어간다. 

x => Random.Range() = 화살표는 순서대로 순회해서 정렬한다는것인데 기준값에서 Random이 실행된다.

ToArray() = 정렬한 값을 배열로 다시 만들어준다.

 

이렇게 되면 랜덤하게 재배열될것이다.

강의 내 Board Script

 

강의에선 이렇게 Debug.Log(arr[i]); 문으로 랜덤값이 잘 출력되는지 확인해줬다. arr[i]를 통해 첫번째부터 16번째까지 순서대로 출력을 해주게 되는 것.

 

강의 내 Unity UI

랜덤하게 잘 출력되고, 다시 플레이해줘도 처음 결과와는 다른 랜덤한 순서가 된다.

 

이제 랜덤하게 나오는 값을 각각의 카드에 넣어줘야한다. 그건 Card 오브젝트에 Script로 구현한다.

 

우선 카드에서 값을 받아줄수 있는 함수를 선언한다.

Card Script

 

그리고 이 값을 외부에서 접근할수 있게 public 함수를 만든다.

Card Script

이제 이 함수를 Board에서 가져올수 있도록 해보자

Board Script

go.GetComponent<Card>().Setting(arr[i]); 가 추가되었다.

 

이 뜻은 Card라는 컴포넌트 내의 Setting이라는 함수를 불러와서 arr[i] , 즉 배열의 i 번째에 있는 데이터를 넘겨준다는 뜻이다.

 

이렇게 board의 arr 배열의 값이 card의 idx 매개변수를 통해 들어가게 되는것이다.

 

idx가 잘 들어갔는지는 플레이해보고 생성된 card 컴포넌트를 debug 설정으로 봐주면 확인 가능하다

 

이제 코드로 이미지를 가져오도록 하는데, unity의 기능인 Resources 폴더를 사용하게 된단다.

기존에 images 폴더에있던 이미지들을 새로 만든 Resources에 옮겨줬다. 

 

코드로 이미지를 가져오는 방법은 다음과 같다. Resources.Load<파일 유형>(좌표); 가 방법이다.

근데 이제 쌍따옴표 뒤에 $를 적어주면 중괄호를 활용해서 문자열로 사용할수 있게된다.

이렇게 되면 rtan0부터 rtan7까지 알아서 가져올수 있게된다

Card Script
Card Script

 

그렇게 가져온 이미지를 card의 자식노드인 front에 넘겨주고 unity에서 설정해주면 된다.

 

Order in layer가 전부 0이라 보일때도 있고 안보일때도 있지만 대충 잘 가져와졌다.

 

 

5. 카드 뒤집기

 

 

 

우선 애니메이션 폴더와 애니메이션을 만들어주고 

 

이렇게 강의를 따라 z값이 시간에따라 조금씩 변하게 해서 까딱까딱하는 idle, 즉 평상시의 애니메이션을 만들고

 

이제 클릭했을때 뒤집히는(사라지는)애니메이션을 만들게 되는데 그건 조금 알아야 하는것이 있다

에니메이터에 bool값 파라미터를 하나 만드는 것이다. 이걸 통해 코드에서 isOpen이라는 bool값을 불러올수 있게된다.

트렌지션을 생성해서 Idle상태와 Flip을 연결해주고 세부설정을 해주면 끝

 

Card Script

anim.SetBool("isOpen", true);를 통해 OpenCard가 실행될때 bool값을 변경시켜 애니메이션을 실행.

그리고 front와 back을 각각 끄고 켜서 카드가 뒤집히도록 한다.

 

그리고 이 OpenCard 함수를 카드 뒷면에 버튼을 만들어서 지정해주면 카드를 눌렀을때 실행된다.

잘 작동한다.

 

 

6. 판정 시스템

 

이제 카드가 같으면 파괴되고, 카드가 같지 않으면 다시 뒤집히도록 해줘야 한다.

각각 카드의 이미지는 같은 숫자 값으로 가져오기 때문에, 숫자가 같은지 아닌지를 판정해주는 함수가 필요하다.

 

GameManager Script

 

우선 GameManager에 두개의 카드 데이터를 가져오기 위해함수를 두개 만들어준다. Card Class에서 가져오게 되기 때문에 자료형이 Card가 되었다.

 

카드들이 GamaManager에있는 이 함수에 접근을 하기 위해선 전 강의처럼 GamaManager를 싱글톤화 해줘야한다.

GameManager Script

이제 Card 스크립트로 넘어가서 어떻게 카드 정보를 넘겨줄지 적어주자

 

Card Script

이렇게 적어주면 카드를 오픈할때(버튼을 누를때) 게임 메니저에 정보를 넘겨주게 되고. 이제 이 정보를 통해서 GamaManager가 판정을 할수 있게 된다.

 

Card Script

그전에 우선 idx를 gamemanager 에서 비교해볼수 있게 함수에 public을 추가해줘야한다.

Card Script

 

GamaManager Script

 

우선 이렇게 card 에서 파괴하거나 카드를 닫아주는 기능의 함수를 만들고 그걸 gamemanager에서 불러오게 해줬다.

이렇게 해주면 카드가 맞았을때 사라지고 틀리면 1초의 딜레이 후에 다시 닫히는 기능이 완성된다.

 

 

7. 게임 끝내기 

 

이제 모든 카드가 사라지면 게임이 끝나는 연출을 해주자

 

이전 강의에서 여러번 해왔듯이 ending ui를 만들어주고, 게임이 끝나는 로직을 만들어주자

 

GameManager Script

우선 카드 카운트 함수를 만들어준다. 이게 카드가 배치된 숫자에 따라 변하고 카드를 없앨때마다 2개씩 줄어들게 해서 0이되면 게임이 끝나도록 하면 된다.

 

Board Script

GamaManager.instance.cardCount = arr.Length; 를 통해서 배열의 길이(16)를 가져와서 적용시킬수 있도록 했다

이제 게임이 실행되면 카운트는 16이된다.

 

GamaManager Script

이제 카드를 맞출때마다 카운트를 2씩 줄어들게 하고, 카드가 0개가 되면 게임이 끝나도록(시간이 멈추고 게임끝 ui가 나오도록) 했다.

 

그리고 추가로 게임 끝 ui를 클릭하면 게임이 다시 시작되도록 해주기도 했다.

RetryButton Script

 

 

 

숙제. 30초가 지나면 게임이 끝나기 

 

이제 30초가 지나면 게임이 끝나도록 하는 기능을 혼자서 만들어야 한다.

 

GamaManager Script

우선 나는 카운트가 0일때 실행되던기능을 GamaOver 함수로 빼주고 기존 자리에 호출해줬다. 

 

GameManager Script

그리고 시간을 흐르게 했던함수에 if문으로 30초가 되면 게임이 끝나게 해보았다.

 

 잘 작동한다!!