스파르타 게임개발종합반(Unity)/사전캠프 공부 기록

[Unity] 카드 판정 시스템 - Invoke, public, this, 싱글톤

테크러너 2024. 4. 9.

이전편 참고해주세요!

2024.04.08 - [Unity/2D] - [Unity/2D] 카드 뒤집기 - Button

 

 

게임매니저 싱글톤 만들기

GameManager.cs

    public Card firstCard;   // 첫 번째로 선택한 카드
    public Card secondCard;  // 두 번째로 선택한 카드
    
    // 카드 매치 기능
    public void Matched()
    {
        Debug.Log("판단하자.");
    }

우선 게임매니저에 Matched() 함수를 만들어주겠습니다.

 

    public static GameManager Instance;
    
    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
    }

그리고 싱글톤도 만들어주었습니다.

Card.cs에서 게임매니저 인스턴스를 통해 Matched() 기능을 불러와서 첫 번째 카드와 두 번째 카드를 매칭할 것입니다.

 

 

첫 번째로 선택한 카드와 두 번째로 선택한 카드의 정보 넘겨주기

Card.cs

    // 카드가 오픈됐을 때
    public void OpenCard()
    {
        anim.SetBool("isOpen", true);
        front.SetActive(true);
        back.SetActive(false);

        // firstCard가 비었다면,
            // firstCard에 내 정보를 넘겨준다.
        // firstCard가 비어있지 않다면,
            // secondCard에 내 정보를 넘겨준다.
            // Mached 함수를 호출해 준다.
    }

첫 번째로 선택한 카드가 비어있다면 지금 선택할 카드가 첫 번째 카드겠죠?

그리고 첫 번째 카드가 비어있지 않다면(선택된 상태) 지금 선택할 카드가 두 번째 카드일 것입니다.

해당 로직이 주석에 적혀있는데요. 채워보겠습니다.

 

    // 카드가 오픈됐을 때
    public void OpenCard()
    {
    	// 더 이상 다른 카드를 선택할 수 없도록
    	if (GameManager.Instance.secondCard != null) return;
    
        anim.SetBool("isOpen", true);
        front.SetActive(true);
        back.SetActive(false);

        // firstCard가 비었다면,
        if(GameManager.Instance.firstCard == null)
        {
            // firstCard에 내 정보를 넘겨준다.
            GameManager.Instance.firstCard = this;
        }
        // firstCard가 비어있지 않다면,
        else
        {
            // secondCard에 내 정보를 넘겨준다.
            GameManager.Instance.secondCard = this;
            // Mached 함수를 호출해 준다.
            GameManager.Instance.Matched();
        }
    }

현재 선택된 카드를 오픈하는 것이라서 자기 자신이겠죠? 그래서 this를 넘겨주는 것입니다.

 

 

카드 정보가 잘 넘겨지는지 테스트

이제 테스트해볼 건데요, First Card와 Second Card가 비어있는게 정상입니다.

 

첫 번째 카드를 클릭해보니 그 정보가 들어간 것을 확인할 수 있습니다.

 

두 번째 카드의 정보도 잘 들어갔습니다.

 

이제 두 카드가 같은 그림인지 판정을 해야겠죠?

Matched() 함수를 마저 채워봅시다.

 

 

같은 그림인지 판정하고, 카드를 파괴하거나 닫기

Card.cs

    public int idx = 0;
    
    // 1초 후 카드 파괴
    public void DestroyCard()
    {
        Invoke("DestroyCardInvoke", 1.0f);
    }

    // 카드 파괴
    public void DestroyCardInvoke()
    {
        Destroy(gameObject);
    }

    // 1초 후 카드 닫기
    public void CloseCard()
    {
        Invoke("CloseCardInvoke", 1.0f);
    }

    // 카드 닫기
    public void CloseCardInvoke()
    {
        anim.SetBool("isOpen", false); // Idle 상태로 변경
        front.SetActive(false);
        back.SetActive(true);
    }

Matched() 함수를 채워주기 전에 Card.cs에서 카드 파괴카드 닫기 기능을 만들었습니다.

같은 그림이 매치되면 카드가 파괴되고, 다른 그림이면 다시 닫아주어야하기 때문입니다.

첫 번째 카드가 선택되고, 두 번째 카드를 선택하자마자 바로 파괴되거나 닫히기 때문에 1초 딜레이를 주었습니다.

 

그리고 게임매니저에서 idx값을 알아야하기 때문에 public으로 변경해주었습니다.

 

 

GameManager.cs

    // 카드 매치 기능
    public void Matched()
    {
        // 같은 그림
        if(firstCard.idx == secondCard.idx)
        {
            // 파괴해라.
            firstCard.DestroyCard();
            secondCard.DestroyCard();
        } // 다른 그림
        else
        {
            // 닫아라.
            firstCard.CloseCard();
            secondCard.CloseCard();
        }

        // 파괴든, 닫는거든 정보들을 빼주어야 함
        // 그래야 다음 카드 매치때 새로운 정보를 넣음
        firstCard = null;
        secondCard = null;
    }

같은 그림이면 파괴하고, 다른 그림이면 다시 닫아주게 만들었습니다.

 

 

 

결과

반응형

댓글