학습 개요

오늘은 유니티 부트캠프의 첫 날로, 새로운 팀원들과의 만남 및 오리엔테이션, 아이스 브레이킹 시간을 가졌다. 그 후, 곧바로 역할 분담을 한 뒤 프로젝트 작업에 들어갔다.

이번 프로젝트는 카드 뒤집기 게임에 여러 기능을 추가하는 것으로, 나는 카드 뒤집기 연출, 배치 연출 및 사운드 추가를 맡았다.

게임의 연출 관련 작업을 하다 보니 정확한 타이밍에 애니메이션이나 사운드를 재생하는 것이 매우 중요했던 것 같다.

코루틴 없이 딜레이 처리하는 방법들

  • AudioSource.PlayDelayed(float seconds) -> clip을 지정한 후 일정 시간 뒤 자동 재생
 audioSource = GetComponent<AudioSource>();
 audioSource.PlayDelayed(1.0f); //1초 뒤 재생
  • Invoke(string meethodName, float delay) -> 특정 메서드를 일정 시간 뒤에 호출하고 싶을 떄 사용 가능
Invoke(nameof(MyMethod), 1.5f);

코루틴 없이 오브젝트를 부드럽게 이동

  • Vecor3.Lerp(Vector3 a, Vector3 b, float t)
    • a : 시작 위치
    • b : 목표 위치
    • t : 보간 계수(0~1 사이 값) -> t가 증가함에 따라 a -> b 방향으로 부드럽게 이동
IEnumerator MoveRoutine(Transform transform, Vector2 target)
{
    Vector2 start = transform.position;
    Vector2 row = new Vector2(start.x, target.y);
    float elapsed = 0f;
    while (elapsed < 1.0f)  //카드를 세로로 펼치기
    {
        transform.position = Vector3.Lerp(start, row, elapsed / 1.0f);
        elapsed += Time.deltaTime;
        yield return null;
    }
    elapsed = 0f;
    while (elapsed < 1.0f)  //카드를 가로로 펼치기
    {
        transform.position = Vector3.Lerp(row, target, elapsed / 1.0f);
        elapsed += Time.deltaTime;
        yield return null;
    }
    transform.position = target; // 최종 위치 보정
}
  • Update()에서 Vector3.MoveTowards()를 사용해 프레임마다 조금씩 이동.
transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);

애니메이션 도중 기다렸다가 처리 이어가기

  • IEnumerator 코루틴으로 yield return new WaitForSeconds() 사용
  • 코루틴을 내부에서 분리하여 호출하는 방식도 가능
public void CardClick()
 {
     StartCoroutine(FlipCard());
 }

 IEnumerator FlipCard()
 {
     audioSource.PlayOneShot(clip);
     anim.SetBool("isOpen", true);
     yield return new WaitForSeconds(0.5f);
     //카드 뒤집기 애니메이션 재생 동안 기다리기
     front.SetActive(true);
     back.SetActive(false);
     if (GameManager.Instance.firstCard == null)
     {
         GameManager.Instance.firstCard = card;
     }
     else
     {
         GameManager.Instance.secondCard = card;
         GameManager.Instance.Matched();
     }
}

오늘 배운 핵심 정리

  • 유니티에서는 프레임 기반 처리(Update)와 시간 기반 처리(Coroutine, Invoke, PlayDelayed) 를 상황에 맞게 조합하는 것이 중요하다
  • 비동기적 흐름은 코루틴으로 명확하게 처리하되, 간단한 딜레이는 InvokePlayOnDelayed 로도 충분하다.

댓글남기기