코루틴의 반환값은 IEnumerator (열거자) 이다.
[enumerate]는 영어로 수를 세다. 카운팅 하다!!
C#의 모든 Collections 컬렉션은 IEnumerable, IEnumerator를 상속받아서 구현하고 있다.
- 그래서 List, Array 같은 컬렉션 클래스 객체들을 foreach 문과 같이 객체를 순회할 수 있는 것 이다.
단! 열거자를 사용하여 컬렉션의 데이터를 읽을 수는 있지만 내부 컬렉션을 수정할 수는 없다.
- IEnumerator : 데이터를 리턴(Getter) 하는 열거자
- IEnumerable : 열거자를 리턴하는 Getter의 Getter //Getter는 속성을 반환하는 메서드이다.
IEnumerator : 열거자를 구현하는데 필요한 인터페이스
클래스 내부의 컬렉션에 대해서 반복할 수 있도록 도와줌
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
이렇게 되어있다.
처음에 열거자는 컬렉션의 첫 번째 요소 앞에 배치됩니다.
값을 Current 읽기 전에 열거자를 컬렉션의 첫 번째 요소로 진행하려면
메서드를 호출 MoveNext 해야 합니다. 그렇지 않으면 가 Current 정의되지 않습니다.
Current에서는 MoveNext 또는 Reset이 호출될 때까지 동일한 개체를 반환합니다.
MoveNext는 Current를 다음 요소로 설정합니다.
이런식으로 동작을 한다.
속성
Current | 컬렉션에서 열거자의 현재 위치에 있는 요소를 가져옵니다. |
메서드
MoveNext() | 열거자를 컬렉션의 다음 요소로 이동합니다. |
Reset() | 컬렉션의 첫 번째 요소 앞의 초기 위치에 열거자를 설정합니다. |
다시 코루틴으로 돌아가 보겠다.
코루틴은 싱글스레드 비동기 방식의 함수이며 일반 함수와는 조금 다르다.
그러면 Coroutine은 어떻게 동작할까?
*코루틴을 사용하려면 system.Collections가 필요하다.
앞서 말한대로 IEnumerator를 반환값으로 함수를 생성하게 된다.
public IEnumerator CoroutineName(){
}
이렇게 함수를 생성하며 코루틴은 매개변수도 가질 수 있기 때문에 Invoke보다 유용하다.!!
//Invoke에 대해서는 따로 페이지를 만들어서 설명하겠다.
코루틴 함수를 생성하며
StartCorouine( CoroutineName () ) 또는 StartCorouine( "CoroutineName" ) 으로 코루틴을 시작할 수 있다.
또한 StopCoroutine으로 마찬가지로 중지할 수 있다.
- 코루틴은 진입시점이 여러개이다.
예를 들어
public IEnumerator CoroutineName()
{
Yield return new waitForSeconds(float); 라는 코드
Debug.Log("안녕"); //printf() 와 똑같다.
}
이라는 코드를 작성했을 때 코루틴의 동작은
해당 코루틴 함수를 만나서 코루틴이 실행되며 yield return을 만나게 되면 유니티에게 해당 시간만큼 권한을 넘겨주게 된다. 그리고 나서 해당 시간이 지나고 다시 "안녕"이라는 말이 출력될 것이다.
이처럼 열거자를 리턴하는 함수이며 Collection은 IEnumerator를 상속받기에 객체를 순회할 수 있게된다.
그러면 yield는 어떤 것인가? IEnumerator/IEnumerable의 간편 표기법이다.
yield를 통해서 IEnumerator/IEnumerable를 상속받는 객체를 간단하게 구현할 수 있는 것이나 마찬가지이다.
( yield를 사용하면 컴파일러가 자동으로 만들어준다,)
마치 일시정지와 같은 기능이다.
1. 함수의 상태를 저장/복원하는게 가능
2. 리턴은 우리가 원하는 타입으로 가능
이렇게 코루틴을 알아보았다.
(yield break, yield return null 등 은 구글링해서 더 자세하게 알아보면 좋다!!)
코루틴은 게임개발 즉 유니티에서는 시간에 따른 작업을 수행할 때 많이 사용되며, 한번에 모든 데이터를 처리하는게 느리거나 할때도 많이 사용된다.
마지막으로 하나만 예시로 들자면 몬스터에게 공격을 받았는데 데미지 처리 이후에도 몇초뒤에 어떠한 행동이 필요하다라고 하면 일반 함수로도 구현 할 수 있지만
public IEnumerator TakeDamage(Player player){
player.TakeDamage((int)Damage):
yield return new waitForSeconds(1f);
player.KnockBack((int)Distance);
}
이런식으로 플레이어에게 데미지를 입히고 1초 뒤에 넉백을 하게 만드는 코드처럼 시간에 따른 행동을 하게 만들어 줄 수 도 있다. 자 이제 사용을 해보러 가보자!!
'C#' 카테고리의 다른 글
using 문법 +(UnityWebRequest) (2) | 2025.04.18 |
---|---|
C# - 2 (0) | 2024.05.19 |
C# - Custom Type2 (2) | 2024.04.11 |
Virtual Table (0) | 2024.04.11 |
Class (0) | 2024.04.09 |