동기 / 비동기
코루틴을 사용하기 전에 동기 비동기 개념에 대해서 알고가면 좋다. 동기 방식은 작업이 순차적으로 진행되는 방식이다. 현재 작업이 끝나지 않으면 다음 작업은 시작되지 않으며 반드시 이전 작업이 완료된 후에 수행된다. 비동기 방식은 병렬적으로 작업을 진행하는 것 처럼 보이는 방식이다. 하지만 실제로는 작업의 시작과 종료 시점을 독립적으로 관리하는 방식으로 병렬방식과는 차이가 있다. 하나의 작업이 끝나지 않더라도 새로운 작업 요청이 들어오게 되면 그 작업을 시작한다. 각각의 작업은 완료되는 대로 개별적으로 결과를 처리하므로, 동시에 여러 작업이 진행될 수 있다.
코루틴은 그럼 비동기??
코루틴은 비동기로 위장한 동기 방식이다. 코루틴은 실제로는 비동기적 처리가 아니라, 특정 작업을 나누어 순차적으로 진행하도록 만들어진 동기 방식이다. 실제로 유니티에서는 코루틴은 싱글 스레드로 작동한다고 한다. 하지만, 코루틴을 사용하면 작업을 지연시키거나 잠시 중단 함으로써 비동기처럼 보이게 할 수 있다.
코루틴 사용의 장점
- 유니티 자체가 싱글 스레드 환경으로 구성 돼있기 때문에 비동기(멀티스레드)로 작업을 수행하게 되면 스레드 간 동기화 문제가 발생할 수 있는데 코루틴을 사용한다면 동기화 문제나 예외 처리에 신경 쓸 필요 없이 비동기 효과를 안전하게 구현 할 수 있게 된다 .
- 코루틴을 사용하면 시간 지연이나 특정 조건을 기다리는 작업을 간단하게 구현할 수 있다. 예를 들어, 특정 효과를 5초 후에 나타나게하는 로직을 Update문에서 구현 한다고 가정해보자. Update문은 매 프레임마다 실행이 되기때문에 5초라는 시간이 지났는지에 대한 조건을 프레임마다 체크하게 될 것이다. 하지만 코루틴의 yield return을 사용하면 일정 시간만큼 대기했다가 대기가 끝나면 로직이 실행되도록 할 수 있다. 결과적으로 코루틴을 통해 비동기 방식처럼 보이는 효과를 얻을 수 있다.
코루틴을 사용해보자
코루틴은 실제로 다양한 환경에서 유용하게 활용할 수 있다. 특히 반복적인 작업을 일정 간격으로 수행 하거나 특정 작업을 일정 시간 후에 실행 하고자 할 때 사용하기 좋다.
아래는 코루틴을 사용하여 일정 시간 동안 체력을 회복시키는 효과를 구현한 코드이다.
using System.Collections;
using UnityEngine;
public class HealingOverTimePotion : MonoBehaviour
{
private float value = 10f; // 1회 회복 값
private float delayTime = 1f; // 회복 지연 시간
private float duration = 5f; // 총 지속 시간
public void UsePotion()
{
StartCoroutine(HealingOverTime());
}
private IEnumerator HealingOverTime()
{
float startTime = Time.time;
while (Time.time < startTime + duration) // 지속 시간이 끝날 때까지 반복
{
Debug.Log($"플레이어의 체력이 {value}만큼 증가했습니다.");
yield return new WaitForSeconds(delayTime); // delayTime만큼 대기 후 다음 회복
}
}
}
코루틴을 사용하여 일정 시간 동안 체력을 회복 시키는 효과른 구현한 코드이다. 코루틴 HealingOverTime을 사용하여 일정 간격으로 플레이어의 체력을 회복시키고, 지속 시간(특정 시간)이 지나면 코루틴을 종료 해주는 코드이다. yield return new WaitForSeconds(delayTime) 구문을 사용해 delayTime 간격으로 체력이 회복되며, 이 대기 시간을 통해 Update 없이도 효율적으로 반복 작업을 구현이 가능하며 마치 비동기처럼 작업을 실행해준다.
마무리
이처럼 Coroutine(코루틴)을 사용하면 시간 지연이나 특정 조건을 기다리는 작업을 간단하게 구현할 수 있다. Update나 InvokeRepeating을 사용하지 않고도 동일한 기능을 더 효율적으로 구현할 수 있다. 다만, 코루틴을 과도하게 사용하면 성능에 영향을 줄 수 있으므로 적절한 양의 코루틴을 사용하는 것이 좋다. 코루틴의 비동기적 동기 방식을 이해하고 잘 활용한다면, 게임 개발에 큰 도움이 될 것이다.
'내일배움캠프' 카테고리의 다른 글
내일배움캠프: 이벤트 버스 패턴 (Event Bus Pattern) (0) | 2024.11.02 |
---|---|
내일배움캠프: 유니티 JsonUtility을 활용한 데이터 저장 및 불러오기 (0) | 2024.11.01 |
내일배움캠프: 유니티 3D에서 Ray와 Raycast로 충돌 감지하기 (0) | 2024.10.30 |
내일배움캠프: InputSystem Rebinding (인풋시스템을 활용한 키 리바인딩) (0) | 2024.10.25 |
내일배움캠프: AnimationCurve (2) | 2024.10.24 |