엄청 쉬운 내용인데 조금 헷갈렸다.
먼저 IEnumerator는 반복문에 사용하는 인터페이스이다.
public interface IEnumerator
{
object? Current { get; } // 현재요소 반환
bool MoveNext(); // 다음 요소로 이동
void Reset(); // 리스트 처음부터 반복
}
다음은 IEnumerator 인터페이스를 이용한 코드이다.
internal class Program
{
static void Main(string[] args)
{
IEnumerator getNumberIEnumerator = GetNumberIEnumerator();
getNumberIEnumerator.MoveNext();
Console.WriteLine(getNumberIEnumerator.Current);
getNumberIEnumerator.MoveNext();
Console.WriteLine(getNumberIEnumerator.Current);
getNumberIEnumerator.MoveNext();
Console.WriteLine(getNumberIEnumerator.Current);
getNumberIEnumerator.MoveNext();
Console.WriteLine(getNumberIEnumerator.Current);
getNumberIEnumerator.MoveNext();
Console.WriteLine(getNumberIEnumerator.Current);
getNumberIEnumerator.MoveNext();
Console.WriteLine(getNumberIEnumerator.Current);
}
static IEnumerator GetNumberIEnumerator()
{
Console.WriteLine("IEnumerator : " + 1);
yield return 1;
Console.WriteLine("IEnumerator : " + 2);
yield return 2;
Console.WriteLine("IEnumerator : " + 3);
yield return 3;
}
}
IEnumerator객체를 만들고나면 객체의 메서드를 이용하여 다음 return까지 이동한다.
그래서보면 첫번째 MoveNext();가 호출되면 IENumerator : 1이 써지고 그 다음줄엔 1이 써진다.
다음 MoveNext();가 호추로디면 IEnumeratorr : 2 이 써지고 그 다음줄엔 2가 써진다.
참고로 마지막 return에 도달하면 MoveNext();가 호출되어도 처음으로 돌아가지 않고 마지막 return값만 호출한다.따라서 위 코드의 예상되는 출력값은
IEnumerator : 1
1
IEnumerator : 2
2
IEnumerator : 3
3
3
3
이다.
이제 유니티에서 이를 활용하는 법을 알아보자.
먼저
StartCoroutine(HpAttack());
StartCoroutine("HpAttack");
이런식으로 호출한다.
매개 변수가 있다면
StartCoroutine( 메소드이름( 매개변수1, 매개변수2 ) );
StartCoroutine( "메소드이름", 매개변수 );
이렇게 호출한다.
HpAttack() 내부의 모습은 이렇다.
IEnumerator HpAttack()
{
yield return new WaitForSeconds( 2.0f );
Hp -= 10;
}