내일배움캠프/TIL

[내배캠][Unity6기][TIL] 4. 카드 뒤집기(5~7)

binary는 호남선 2024. 9. 10. 20:29

카드 뒤집기 게임의 매칭 로직 흐름 파악하기

1. Card 게임오브젝트 Button 컴포넌트의 On Click 이벤트 발생하면(사용자가 카드를 클릭하면) Card.cs의 OpenCard() 호출

public void OpenCard()
{
    // 카드를 앞면으로 뒤집기
    anim.SetBool("isOpen", true);
    front.SetActive(true);
    back.SetActive(false);

    // 첫번째 카드 오브젝트가 없으면 자기 자신을 첫번째 카드로 설정
    if (GameManager.Instance.firstCard == null)
    {
        GameManager.Instance.firstCard = this;
    }
    // 첫번째 카드 오브젝트가 있으면 자기 자신을 두번째 카드로 설정
    else
    {
        GameManager.Instance.secondCard = this;
        // 두 카드를 비교하는 함수 호출
        GameManager.Instance.checkMatched();
    }
}

2. GameManager.cs 의 checkMatched() 에서 두 카드의 인덱스가 일치하는 지 확인

이때 Card.cs의 index 변수가 public으로 설정해야 GameManager.cs에서 접근 가능

public void checkMatched()
{
    // 첫번째 카드와 두번째 카드의 인덱스가 같으면
    if (firstCard.index == secondCard.index)
    {
        // 두 카드를 없애기
        firstCard.DestroyCard();
        secondCard.DestroyCard();
    }
    // 첫번째 카드와 두번째 카드의 인덱스가 다르면
    else
    {
        // 두 카드를 닫기(뒷면이 보이게 뒤집기)
        firstCard.CloseCard();
        secondCard.CloseCard();
    }
    // 비교가 끝나면 다음 비교를 위해 오브젝트 비우기
    firstCard = null;
    secondCard = null;
}

3. Card.cs의 DestroyCard()와 CloseCard() 호출되면 InvokeXX()로 지연 호출하기

public void DestroyCard()
{
    // 자기 자신을 삭제하는 함수 1초 뒤에 호출
    Invoke("DestroyCardInvoke", 1.0f);
}
void DestroyCardInvoke()
{
    // 자기 자신을 삭제
    Destroy(this.gameObject);
}
public void CloseCard()
{
    // 카드 닫는 함수 1초 뒤에 호출
    Invoke("CloseCardInvoke", 1.0f);
}
void CloseCardInvoke()
{
    // 카드를 뒷면으로 뒤집기
    anim.SetBool("isOpen", false);
    front.SetActive(false);
    back.SetActive(true);
}

호출 흐름