반응형
코루틴의 사전적 의미
코루틴은 "Co" + "Routine"의 합성어이다
Co: '함께', '협력'을 의미하는 접두사
Routine: '일상적인 절차' 또는 '정해진 일련의 작업'을 의미
따라서 코루틴은 "협력하여 실행되는 루틴" 또는 "서로 협력하는 프로시저"라고 해석할 수 있다
유니티의 코루틴
실행을 일시 중지했다가 다시 시작할 수 있는 특별한 종류의 함수
일반적인 함수는 한 번 실행되면 끝까지 실행되어야 하지만,
코루틴은 다른 코루틴이나 메인 프로그램과 협력적으로
실행 시간을 공유하면서 작업을 수행할 수 있다
코루틴 사용법
// 코루틴 선언
IEnumerator MyCoroutine()
{
Debug.Log("시작");
yield return new WaitForSeconds(2f); // 2초 대기
Debug.Log("2초 후 실행");
}
// 코루틴 시작
void Start()
{
StartCoroutine(MyCoroutine());
}
코루틴의 종류
1. WaitForSeconds
yield return new WaitForSeconds(float seconds);
- 지정된 시간(초) 동안 대기
- 실제 시간 기준으로 동작
- 게임이 일시정지되어도 계속 카운트됨
사용상황
- 스킬 쿨타임 구현
- 적 캐릭터의 공격 패턴 간 딜레이
- UI 팝업이 표시되는 시간 제어
- 게임 시작 전 카운트다운
2. WaitForSecondsRealtime
yield return new WaitForSecondsRealtime(float seconds);
- 실제 시간을 기준으로 대기
- Time.timeScale의 영향을 받지 않음
- 게임이 일시정지되어도 계속 카운트됨
사용 상황
- 일시정지 화면에서도 작동해야 하는 타이머
- 게임 속도와 무관하게 동작해야 하는 UI 애니메이션
- 실제 시간 기반 이벤트 처리
3. WaitForFixedUpdate
yield return new WaitForFixedUpdate();
- 다음 물리 업데이트(FixedUpdate)까지 대기
- 물리 연산과 관련된 작업에 주로 사용
사용 상황
- 물리 기반 움직임 구현
- 충돌 감지가 필요한 동작
- 리지드바디를 사용하는 오브젝트 제어
4. WaitForEndOfFrame
yield return new WaitForEndOfFrame();
- 현재 프레임의 렌더링이 모두 완료될 때까지 대기
- 카메라 렌더링과 GUI 렌더링이 모두 완료된 후 실행
사용 상황
- 스크린샷 찍기
- 프레임 단위 렌더링 효과 적용
- 후처리 효과 적용
5. WaitUntil
yield return new WaitUntil(() => condition);
- 지정된 조건이 true가 될 때까지 대기
- 조건을 람다식으로 전달
사용 상황
- 플레이어의 특정 상태 대기
- 애니메이션 완료 대기
- 로딩 완료 체크
- 특정 이벤트 발생 대기
6. WaitWhile
yield return new WaitWhile(() => condition);
- 지정된 조건이 false가 될 때까지 대기
- WaitUntil의 반대 개념
사용 상황
- 로딩 중일 동안 대기
- 특정 상태가 지속되는 동안 대기
- 게임 일시정지 중 대기
7. null 반환
yield return null;
- 다음 프레임까지 대기
- 가장 기본적인 형태의 대기
사용 상황
- 프레임별 점진적인 움직임 구현
- UI 페이드 인/아웃 효과
- 부드러운 카메라 이동
- 최적화가 필요한 무거운 작업 분산 처리
8. Custom YieldInstruction
public class CustomYieldInstruction : YieldInstruction
{
public override bool keepWaiting
{
get { return /* 조건 */; }
}
}
- 사용자 정의 대기 조건을 만들 수 있음
- 복잡한 대기 로직 구현 가능
사용예시
// 1. 먼저 CustomYieldInstruction을 상속받는 사용자 정의 대기 조건을 만든다
public class WaitForScore : CustomYieldInstruction
{
private int targetScore;
private GameManager gameManager;
public WaitForScore(GameManager gameManager, int targetScore)
{
this.gameManager = gameManager;
this.targetScore = targetScore;
}
public override bool keepWaiting
{
get { return gameManager.currentScore < targetScore; }
}
}
// 2. 사용방법
IEnumerator GameSequence()
{
// 우리가 만든 커스텀 대기 조건을 사용
yield return new WaitForScore(gameManager, 1000);
Debug.Log("점수가 1000점을 넘었습니다!");
}
코루틴 제어
- StopCoroutine(): 특정 코루틴 정지
- StopAllCoroutines(): 모든 코루틴 정지
- StopCoroutine(string): 이름으로 코루틴 정지
주의사항
- 게임 오브젝트가 비활성화되면 코루틴도 정지됨
- 코루틴을 너무 많이 사용하면 메모리와 성능에 영향을 줄 수 있음
- MonoBehaviour를 상속받는 클래스에서만 사용 가능
반응형
'유니티 > 문법' 카테고리의 다른 글
| [Unity] 유니티 C#) ObjectPool ( 오브젝트풀링 ) (0) | 2025.01.03 |
|---|---|
| [Unity] 유니티 C#) ScriptableObject ( 스크립터블오브젝트 ) (0) | 2025.01.02 |
| [Unity] 유니티 C#) 네임스페이스 ( namespace ) (0) | 2024.12.26 |
| [Unity] 유니티 C#) 제네릭 (0) | 2024.11.29 |
| [Unity] 유니티 C#) 추상클래스와 가상메서드 (0) | 2024.11.27 |