●카드 애니메이션과 뒤집기
-게임이 시작되면 카드가 흔들리는 애니메이션을 만들기


-뒤집기 애니메이션 만들기

-애니메이션 transition 생성
@Has Exit Time
Has Exit Time은 Animator의 설정 중 하나로, 애니메이션 전환이 끝나기 전에 트랜지션을 할지 여부를 결정하는 옵션입니다.
이 옵션을 사용하면 특정 애니메이션 클립이 플레이어에 의해 완전히 재생된 후에만 트랜지션을 수행할 수 있습니다.
Has Exit Time이 true로 설정된 경우 애니메이션은 지정된 시간 동안 실행된 후 자동으로 종료됩니다.
Has Exit Time이 false로 설정된 경우 애니메이션은 플레이어의 입력이나 다른 이벤트에 의해 종료될 때까지 계속 실행됩니다.
@Transition Duration(전환 지속 시간)
현재 애니메이션 클립과 다음 애니메이션 클립을 섞어(블렌딩) 부드럽게 이어주는 역할을 한다.
Ex) 0.2초로 설정하면 0.2초 동안 뛰는 애니메이션 클립과 점프하는 애니메이션 클립을 섞어서 부드럽게 이어준다.
하지만 2D 스프라이트를 사용한 애니메이션에서는 블렌딩이 정상 동작하지 않으므로 전환 지속 시간을 0으로 변경하여야 한다.
-조건 생성
→ CardIdle ⇒ CardFlip : bool이 true 가 되면 발동 // 카드를 맞췄을 경우
→ CardFlip ⇒ CardIdle : bool이 false 가 되면 발동 // 틀렸을 경우 카드 되돌리기
<Card.cs>
public GameObject front;
public GameObject back;
public void OpenCard()
{
front.SetActive(true); // Animations 폴더의 Card Animator의 Parmeters에서 설정했던 카드를 맞췄을 때 뒤집는다는 설정
back.SetActive(false); // 틀리면 카드를 뒤집지 않는다.
}
Card 프리팹의 <Card.cs>에 front와 back에 맞게 드래그해 준다.
클릭 시 뒤집어지는 버튼은 전에 했으므로 알아서 만든다.
●판정 시스템
<Card.cs>
public void OpenCard() // 카드 오픈
{
anim.SetBool("isOpen", true);
front.SetActive(true); // Animations 폴더의 Card Animator의 Parmeters에서 설정했던 카드를 맞췄을 때 뒤집는다는 설정
back.SetActive(false); // 틀리면 카드를 뒤집지 않는다.
if (GameManager.Instance.firstCard == null) // firstCard가 비었다면,
{
GameManager.Instance.firstCard = this; // firstCard에 내 정보를 넘겨준다. / Card 클래스에 있기 때문에 나 자신을 넘겨줌
}
else
{
GameManager.Instance.secondCard = this; // secondCard에 내 정보를 넘겨준다.
GameManager.Instance.Matched(); // Matched 함수를 호출해 준다.
}
}
public void DestroyCard() // 카드 파괴
{
Invoke("DestroyCardInvoke", 0.5f); // 0.5초 뒤에 DestroyCardInvoke 실행 (카드 파괴) / 카드가 일치하는지 확인하기 위함
}
void DestroyCardInvoke()
{
Destroy(gameObject); // 게임 오브젝트(card) 파괴
}
public void CloseCard() // 카드 덮기
{
Invoke("CloseCardInvoke", 0.5f); // 0.5초 뒤에 CloseCardInvoke 실행 (카드 다시 뒤집기) / 카드가 일치하는지 확인하기 위함
}
void CloseCardInvoke()
{
anim.SetBool("isOpen", false); // isOpen가 false일 때 Idle로 이동 -> transition 세팅한 값
front.SetActive(false); // front를 다시 끔
back.SetActive(true); // back을 다시 켬 -> 다시 카드를 뒤집음
}
<GameManager.cs>
public Card firstCard; // 첫번째 카드
public Card secondCard; // 두번째 카드
private void Awake()
{
if(Instance == null)
{
Instance = this;
}
}
public void Matched() // 카드가 똑같은지
{
if(firstCard.idx == secondCard.idx) // 첫번째와 두번째 카드의 그림이 같을 때
{
firstCard.DestroyCard(); // 파괴
secondCard.DestroyCard(); // 파괴
cardCount -= 2; // 전체 카드 개수 2개씩 감소 (맞춘거 만큼 제거)
if (cardCount == 0) // 남은 카드가 0개일 때
{
Time.timeScale = 0.0f; // 게임 종료
endTxt.SetActive(true); // endTxt 출력
}
}
else
{
firstCard.CloseCard(); // 닫음
secondCard.CloseCard(); // 닫음
}
firstCard = null; // GameObject에서 firstCard 초기화
secondCard = null; // GameObject에서 secondCard 초기화
}