[TIL] 애니메이션 및 오디오 타이밍 제어
학습 개요
오늘은 유니티 부트캠프의 첫 날로, 새로운 팀원들과의 만남 및 오리엔테이션, 아이스 브레이킹 시간을 가졌다. 그 후, 곧바로 역할 분담을 한 뒤 프로젝트 작업에 들어갔다.
이번 프로젝트는 카드 뒤집기 게임에 여러 기능을 추가하는 것으로, 나는 카드 뒤집기 연출, 배치 연출 및 사운드 추가를 맡았다.
게임의 연출 관련 작업을 하다 보니 정확한 타이밍에 애니메이션이나 사운드를 재생하는 것이 매우 중요했던 것 같다.
코루틴 없이 딜레이 처리하는 방법들
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) 를 상황에 맞게 조합하는 것이 중요하다
- 비동기적 흐름은 코루틴으로 명확하게 처리하되, 간단한 딜레이는
Invoke나PlayOnDelayed로도 충분하다.
댓글남기기