Coroutine

woollim·2024년 11월 10일
0

Unity개념

목록 보기
7/8

■ 코루틴 개념

○ 코루틴(Coroutine) 설명

  • 비동기적으로 실행되는 함수
  • 특정 조건을 만족할 때까지 실행을 잠시 멈췄다가 다시 이어서 실행할 수 있는 기능
  • 코루틴은 비동기 작업을 처리할 때 매우 유용하며, 게임 내에서 다양한 시간 제어 및 비동기 로직을 구현하는 데 효과적
  • 예를 들어, 시간이 지날 때까지 대기하거나, 특정 조건이 충족될 때까지 기다리는 등의 작업을 수행할 때 유용하게 사용
  • 활용법 : 유니티에서 코루틴을 사용하면 게임 오브젝트의 상태를 관리하거나 애니메이션, 이벤트 처리 등을 효율적으로 할 수 있음

○ 코루틴의 기본 구조

  • 코루틴은 IEnumerator 타입의 반환형을 가지며 yield return 문을 사용해 실행을 중지하거나 재개할 수 있음
using UnityEngine;
using System.Collections;

public class CoroutineExample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(PrintNumbers());
    }

    IEnumerator PrintNumbers()
    {
        for (int i = 1; i <= 5; i++)
        {
            Debug.Log(i);
            yield return new WaitForSeconds(1f); // 1초 대기
        }
    }
}
  • 위 코드에서는 PrintNumbers 코루틴이 1초마다 숫자를 출력하는 예제입니다.
  • yield return new WaitForSeconds(1f); 문으로 인해 1초씩 기다린 후에 다음 숫자를 출력하게 됩니다.

○ yield

  • yield return new WaitForSeconds(seconds) : 지정한 시간 동안 대기합니다.
  • yield return null : 다음 프레임까지 대기합니다.
  • yield return new WaitUntil(predicate) : 특정 조건이 참이 될 때까지 대기합니다.
  • yield return new WaitWhile(predicate) : 특정 조건이 거짓이 될 때까지 대기합니다.
  • yield return new WaitForFixedUpdate() : 유니티의 고정된 업데이트 주기(FixedUpdate) 이후까지 대기하도록 합니다. 다음 코루틴 동작이 다음 FixedUpdate까지 기다리게 됩니다.
  • yield return StartCoroutine(string) : 다른 코루틴을 호출하고 완료될 때까지 기다립니다. 해당 코루틴이 완료되면 다시 이어서 진행됩니다. 이렇게 하면 다른 비동기 작업을 순차적으로 연결할 수 있습니다.
  • yield return new WWW(string) : 웹 요청을 보내고 응답을 받을 때까지 기다리는 기능을 제공합니다. 예를 들어, 서버에서 데이터를 받아오는 등의 작업을 수행할 때 사용됩니다.
    이 구문은 URL을 요청한 후, 요청이 완료되기 전까지 코루틴이 기다리게 하며, 완료되면 데이터를 받아올 수 있습니다.
    WWW는 오래된 방식이고, 현재는 UnityWebRequest로 대체되어 더 선호됩니다.

○ 코루틴 시작 및 중지

  • StartCoroutine() : 코루틴을 시작할 때 사용합니다.
  • StopCoroutine() : 특정 코루틴을 중지할 때 사용합니다.
  • StopAllCoroutines() : 현재 오브젝트에서 실행 중인 모든 코루틴을 중지합니다.


■ 코루틴 예시

○ 애니메이션 효과

  • 특정 오브젝트가 서서히 이동하는 애니메이션을 구현하고, 이동이 완료되면 색깔을 변경하는 예제입니다.
  • 이 예제는 코루틴을 활용해 오브젝트가 이동을 완료할 때까지 기다렸다가 후속 작업(색 변경)을 수행하는 것을 보여줍니다.
using UnityEngine;
using System.Collections;

public class CoroutineExample : MonoBehaviour
{
    public Transform targetPosition;  // 이동할 목표 위치
    public float moveDuration = 2.0f; // 이동에 걸리는 시간

    void Start()
    {
        StartCoroutine(MoveAndChangeColor());
    }

    IEnumerator MoveAndChangeColor()
    {
        // 시작 위치와 목표 위치 사이의 경과 시간을 추적합니다.
        Vector3 startPosition = transform.position;
        float elapsedTime = 0f;

        // 오브젝트가 목표 위치로 이동하도록 이동 애니메이션을 시작합니다.
        while (elapsedTime < moveDuration)
        {
            transform.position = Vector3.Lerp(startPosition, targetPosition.position, elapsedTime / moveDuration);
            elapsedTime += Time.deltaTime; // 경과 시간을 업데이트합니다.
            yield return null; // 다음 프레임까지 대기합니다.
        }

        // 정확히 목표 위치에 도달하도록 위치를 최종 설정합니다.
        transform.position = targetPosition.position;

        // 색깔을 빨간색으로 변경합니다.
        GetComponent<Renderer>().material.color = Color.red;
    }
}
  1. MoveAndChangeColor() 코루틴은 StartCoroutine()을 통해 Start에서 호출됩니다.
  2. while 루프 내부에서는 Vector3.Lerp 함수를 사용하여 시작 위치에서 목표 위치까지 일정 시간 동안 오브젝트가 부드럽게 이동하도록 합니다. Lerp는 선형 보간을 의미하며, elapsedTime / moveDuration을 통해 이동 시간을 비율로 나누어 부드럽게 이동하게 만듭니다.
  3. 이동이 완료되면 Renderer의 material.color를 변경하여 오브젝트의 색깔을 빨간색으로 바꿉니다.

0개의 댓글