게임 개발이 처음이어도 쉽게 배우는 모바일 게임 개발 4주차 03/31

정광훈(단기심화_9기)·2025년 3월 31일

TIL (Today I Learned)

목록 보기
8/127

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

  1. CardIdle 애니메이션을 생성하고 Loop Time을 체크해준다.
  2. 1번(CardIdle)을 2번(Card) 안에 넣어주고 3번(녹화)을 누른다.
  3. 4번에서 내가 설정할 시간을 입력하고 5번을 조정해준다.
  4. 다시 4번을 40으로 설정하고 5번을 0으로 설정해준다. -> 시간이 지날 때마다 카드가 흔들리는 것처럼 보인다.

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

  1. CardIdle 애니메이션에서 Creat New Clip을 눌러 Animations폴더에 CardFilp 애니메이션을 생성한다.
  2. 1번(녹화)를 누르고 2번(시간)을 설정한 뒤 3번(Scale)을 설정하고 다시 1번을 누르면 끝
    -> 카드를 누르면 작아진다.
  3. 한 번만 실행되기 때문에 Loop Time은 해제해 준다.

-애니메이션 transition 생성

  1. 1번(Animator)에서 2번(Parameters)클릭
  2. CardIdle과 CardFilp을 각자 우클릭하면 Make Transition이 나온다.
  3. Transition(화살표)를 CardIdle과 CardFilp 서로에게 연결시킨다.
  4. 1번(transition)을 클릭 후 2번(Has Exit Time) 해제와 3번(Transition Duration)을 0으로 설정해준다.
  5. CardFilp에서 CardIdle로 가는 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 가 되면 발동 // 틀렸을 경우 카드 되돌리기

  1. 1번을 눌러 Bool형식을 추가해 isOpen이라고 이름을 지어준다.
  2. 4번(왼쪽 transition)을 눌러 5번처럼 설정해준다.
  3. 오른쪽 transition도 위와 똑같은 방법으로 true가 아닌 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 초기화
}

profile
내배캠 Unity_9기 / 게임 서버 단기 심화_9기

0개의 댓글