본문 바로가기

개발자_뉴비일지

내일배움캠프 Unity 4일차 TIL - 신박함

string keyword="신박함"

 

4주차 강의 시작! 오늘은 카드뒤집기 게임이다.

 

요약

카드 배치부터 매치까지

신박한 로직

 

1. 카드배치

 

일단 card prefabs를 하나 만들어두고 카드를 오와 열에 맞춰 복제할 방법을 생각해본다.

카드를 일렬로 생성하되 4개마다 아래칸으로 배치가 되어야 한다.

 

*반복함수 for

 

for(int i=0;i<16; i++)

{
    GameObject newCard=Instantiate(card);
    newCard.transform.parent = GameObject.Find("cards").transform;

>>카드의 복제는 mainScene의 cards로 복제하게끔 설정. 어제 배운 find함수를 사용한다.

    float x = (i / 4) * 1.4f - 2.1f;

>>카드가 생성되는 x값은 4로 나누었을 때, 몫이 각 0,1,2,3일때 다른 위치
    float y = (i % 4) * 1.4f - 3.0f;

>>카드가 생성되는 y값은 4로 나누었을 때, 나머지가 각 0,1,2,3일 때 다른위치
    newCard.transform.position = new Vector3(x, y, 0);
}

 

사실 처음 혼자 떠올리려고 했을 땐 아예 아이디어가 생각이 나지 않았다.

신박한걸..

 

이제 카드를 랜던하게 섞고 이미지를 적용시켜줘야하는데,

이것도 한 복잡함 한다

 

int[] rtans = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };

>>숫자들을 짝에 맞추어주고
rtans = rtans.OrderBy(item => Random.Range(-1.0f, 1.0f)).ToArray();

>>랜덤하게 섞어준다.

 

랜덤한 카드에 이미지를 넣어주기 전에 할 일이 있다.

>>resource폴더를 만들어서 이미지들을 옮겨주기!

 

for함수에 추가!

string rtanName = "rtan" + rtans[i].ToString();
newCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>(rtanName);

>>resource폴더에서 이미지를 불러 카드마다 변경해준다.

 

사실 카드를 랜덤하게 섞고 각 카드에 이미지를 넣어주는 이 과정이 이해가 100%되지는 않는다.

그만큼 더 복습해야겠다.

 

2. 카드 애니메이션

 

카드의 앞뒷면 애니메니션을 설정한다.

그 중 card_flip일 땐 loop time체크를 해제해 줘야 함.

기본값 : card_idle 라는 의미

 

컨트롤러로 각 애니메이션들을 연결해주고 Has Exit Time 체크해제, durationg 값은 0으로 맞춰준다.

파라미터에 bool값을 붙여준 다음

true일 땐 idle->flip, false일 땐 flip->idle

 

이제 카드에 버튼까지 달아주고 클릭하면 애니메이션이과 함께 카드가 바뀌어야 한다.

카드 스크립트에 카드가 오픈되는 세가지 조건을 만족시키도록 한다.

 

public void openCard()
{
    anim.SetBool("isOpen", true);

>>bool값을 true로
    transform.Find("front").gameObject.SetActive(true);

>>카드의 앞면이 활성화
    transform.Find("back").gameObject.SetActive(false);

>>카드의 뒷면을 비활성화
}

 

 

3.카드매칭

 

public void isMatched()
{
    string firstCardImage = firstCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
    string secondCardImage = secondCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
>>첫번째, 두번째 카드 이미지를 이름으로 찾아서 가져오기
    if (firstCardImage == secondCardImage)

>>두 카드의 이미지가 같으면
    {
        firstCard.GetComponent<card>().destroyCard();
        secondCard.GetComponent<card>().destroyCard();
    }

>>둘다 없애고
    else
    {
        firstCard.GetComponent<card>().closeCard();
        secondCard.GetComponent<card>().closeCard();
    }

>>그렇지 않으면 덮기.

    firstCard = null;
    secondCard = null;

>>초기화
}

 

destroyCard함수와  closeCar함수는 card스크립트에 만들어준다.

 

4.게임끝!

 

게임매니저스크립트에서 카드를 매치해주는 함수 안에 넣어준다.

 

int cardsLeft = GameObject.Find("cards").transform.childCount;
if (cardsLeft == 2)

>>카드가 두장 남았을 때
{
    Time.timeScale = 0.0f;
    endTxt.SetActive(true);
    Invoke("gameEnd", 1f);
}

>>게임종료

 

오늘의 마무리

드디어 4주차 게임인 카드게임을 만들었고 과제 제출까지 했다.

가장 기억에 남는 카드배치 로직..정말 너무 신박했다.

나중에 내가 나만의 코드를 만들 때 과연 저러한 방식을 생각해 낼 수 있을까..?

 

.

.

.

with 요비