이전편 참고해주세요!
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;
}
같은 그림이면 파괴하고, 다른 그림이면 다시 닫아주게 만들었습니다.
결과
'스파르타 게임개발종합반(Unity) > 사전캠프 공부 기록' 카테고리의 다른 글
[Unity/2D] 여러 이미지가 나오는 애니메이션 만들기 - Animation, Animator (0) | 2024.04.09 |
---|---|
[Unity] 숙제 - 30초가 지나면 게임 끝내기 (0) | 2024.04.09 |
[Unity/2D] 카드 뒤집기 - Button (0) | 2024.04.08 |
[Unity/2D] 코드를 통해 이미지 받아오기 - Resources, Resources.Load, 문자열 보간, $ (0) | 2024.04.08 |
[Unity/2D] 랜덤 정렬한 값을 카드에 넣어주기 - GetComponent (0) | 2024.04.08 |
댓글