Unity 본캠프 2일차 - 미니 프로젝트

한예준·2025년 4월 8일

어제 프리팹을 제작한 것에 이어서 다른 기능들을 추가했다.


Card 스크립트 완성

  • 먼저, 카드를 뒤집었을 때 firstCard와 secondCard를 저장하는 코드를 작성하였다.
  • firstCard와 secondCard 변수는 GameManager를 담당하신 팀원분이 GameManager스크립트에서 선언하는 것을 받아온다.
  • 내가 카드 스크립트에서 할 것은 OpenCard() 함수를 통해 firstCard와 secondCard에 각각 해당하는 카드를 저장하는 것.
  • 이후 GameManager.cs에서 isMatched()를 판별한 것을 불러온다.
        if (GameManager.Instance.firstCard == null)
        {
            GameManager.Instance.firstCard = this;
        }
        else
        {
            GameManager.Instance.secondCard = this;
            GameManager.Instance.isMatched();
        }
  • 이후 firstCard와 secondCard가 같을 때 카드를 파괴하는 기능을 추가한다.
  • firstCard와 secondCard가 같은 지 판별하는 것은 GameManager.cs에서 담당
  • 나는 Card 파괴의 딜레이 정도만 설정해준다.
public void DestroyCard()
    {
        Invoke("DestoryCardInvoke", 1.0f);
    }

    void DestoryCardInvoke()
    {
        Destroy(gameObject);
    }
  • 다음은 firstCard와 secondCard가 다를 때 카드를 다시 뒤집어주는 기능을 추가한다.
  • 마찬가지로 GameManager.cs에서 판별한다.
  • 나는 판별한 결과에 따라 다시 뒤집는 애니메이션 정도만 추가한다.
    public void CloseCard()
    {
        Invoke("CloseCardInvoke", 1.0f);
    }

    void CloseCardInvoke()
    {
        anim.SetBool("isOpen", false);
        front.SetActive(false);
        back.SetActive(true);
	}

이 기능들을 주석처리하여 팀원들에게 Push했다.


기능 합치기

  • 팀장의 주도로 GitHub를 이용하여 팀원들이 완성한 기능들을 한 데 합쳤다.
  • 각 팀원이 구현한 기능들을 한 데 합쳐서 필수 기능들이 전부 구현됐다.
  • 구현된 것을 확인한 후 추가 기능을 구상해보았다.
  • 구상한 추가 기능은 다음과 같다.
    • 스테이지 추가 및 스테이지 선택 기능: 스테이지 별로 난이도를 상승시킴.
    • 히든 스테이지: 화면에 오브젝트가 나타나 방해함.
    • 카드 뒤집어지는 효과: 카드를 클릭했을 때, 지금과 같은 효과 말고, 카드가 뒤집어지는 효과를 추가한다. (내가 구현할 예정)

나는 위 논의사항대로 애니메이션을 만들고, 추가적인 애니메이션도 제작해보기로 했다.

  • 먼저 카드의 뒤집어지는 애니메이션을 수정했다.

  • 원래는 단순히 작아졌다가 커지는 효과만 있었지만, y축 기준으로 회전시켜서 실제 뒤집어지는 효과를 내보기로 했다.

    • 먼저, 0.2초일 때, y축 기준으로 180도 돌아가도록 애니메이션을 만들었다.
    • 또한 0.1초일 때 카드의 뒷면을 끄고, 앞면이 활성화되도록 설정했다.
  • 다음으로 카드를 못 맞췄을 때 다시 뒤집는 기능도 추가하였다.

    • 앞면으로 뒤집는 경우와 똑같이 만들었다.
    • 다만, 0.1초일 때 카드의 앞면을 끄고, 뒷면이 활성화되도록 설정했다.
  • 하지만 오류가 발생했다.

    • 씬을 실행했을 때 Flip 애니메이션이 무한 반복되는 현상이 발생했다.
    • 애니메이터를 확인해보니, Idle상태로 돌아가지 않고 Flip에만 머무르고 있었다.
  • 오류의 원인을 생각해보았다.

    • 지금까지 bool값을 기준으로 Flip 애니메이션이 실행되고 있었다.
    • bool이 true일 때는 Flip 애니메이션이, false일 때는 Flip_Back 애니메이션이 실행된다.
    • 따라서 bool값이 true일 때는 Flip 애니메이션이 무한정 반복되는 것이었다.
  • 따라서 나는 bool값이 아닌, trigger 파라미터를 이용하기로 했다.

    • trigger flip, trigger flipback을 각 트랜지션에 적용한다.
    • card.cs의 코드 또한 trigger 값을 사용하도록 수정한다.
      public void OpenCard()
      {
          anim.SetTrigger("flip");
      }
      public void CloseCard()
      {
          Invoke("CloseCardInvoke", 0.5f);
      }
    
      private void CloseCardInvoke()
      {
          anim.SetTrigger("flipback");
      }
    
    • 이를 통해 무한반복 오류를 해결할 수 있었다.
  • 다음으로 나는 카드를 맞췄을 때 카드를 파괴하는 애니메이션을 추가해보기로 했다.

    • 먼저 Card_destroy.anim을 생성하고 작아지면서 회전하고 fade out 하는 효과로 애니메이션을 만들었다.
    • 이를 애니메이터에 추가하고, Any State로부터 트랜지션을 연결했다.
    • 트랜지션의 파라미터는 trigger Destroy로 설정했다.
    • 스크립트로 돌아가서 Destroy trigger를 사용하는 코드를 추가했다.
        private void DestroyCardInvoke()
      {
          anim.SetTrigger("Destroy");
          Destroy(this.gameObject, 0.5f);
      }
    • 이후 실행하여 애니메이션이 정상적으로 작동하는 것을 확인했다.

포스트에는 짧게 작성했지만, 오늘도 오류와의 전쟁이었다. 분명히 내가 볼 때는 잘못된 조건이 없는 것 같은데, 항상 오류가 발생하는 것이 답답하다. 그리고, 그 해결책을 알았을 땐 허무함과 후련함이 같이 찾아온다.
오류가 해결된 이후 완성된 코드와 에디터 상 구조들을 다시 보며 기능에 따른 구조를 이해하려고 항상 노력하고 있다. 물론 정확하게 같은 기능과 그에 따른 코드를 쓸 일은 거의 없지만, 이러한 구조를 익히는 것이 나중에 더 복잡한 구조를 이해하는 데에 큰 도움이 될 거라 믿는다.

0개의 댓글