본문 바로가기

TOOL/Unity

Coroutine / IEnumerator / IEnumerable

StartCoroutine( )


StartCoroutine의 내부를 까보니

StartCoroutine_Auto로 수행되고

해당함수는 숨겨져있어서 볼수가 없다.

아마 C++로 내부적으로 처리하는거같은데..



IEnumerator


IEnumerator 는 C++의 iterator같은 것이다.

인자값에 ref나 out을 사용할 수 없다.



    
    IEnumerator SomeNumbers()
    {
        Debug.Log("3");
        yield return 3;
        Debug.Log("5");
        yield return 5;
        Debug.Log("8");
        yield return 8;
    }

    IEnumerator enumerator;
    void Start () {
        enumerator = SomeNumbers();
        object cur;
        cur = enumerator.MoveNext(); // true
        Debug.Log(cur);
        cur = enumerator.MoveNext(); // true
        Debug.Log(cur);
        cur = enumerator.MoveNext(); // true
        Debug.Log(cur);
        cur = enumerator.MoveNext(); // 더이상 다음 return값이 없으면 fasle return
        Debug.Log(cur);
    }



yeild


yield는 로직 시퀸스에서 다음에 나올 값이 무엇인지 혹은 값이 더이상 없는지를 가르쳐 주는 키워드이다.

따라서 code진행중 yield return나 yield break를 마주친 지점이 IEnumerator.MoveNext( ) 함수가 중단되는 지점이다.





IEnumerable 


IEnumerable 인터페이스에넌 foreach에서 필요한 IEnumerator객체(이터레이터)를 반환하는

GetEnumerator( ) 함수를 가지고 있다.

대신 사용하려면 

public interface ICollection<T> : IEnumerable, IEnumerable<T>

이런식으로 IEnumerable interface를 구현해야만 한다.


public void AddMaterials(IEnumerable<Material> datas, bool bSetNew)의

datas인자값에 Material을 가진 컨테이너를 넣어준다음

var it = datas.GetEnumerator();

를 수행하면 해당 컨테이너의 Enumerator를 받을 수 있다.



foreach를 보면 이런식으로 구성되어 있다.



    
using (var enumerator in list.GetEnumerator( ) )
{
    while(enumerator.MoveNext( ))
    {
        int current = enumerator.Current;
    }
}




'TOOL > Unity' 카테고리의 다른 글

Frame 고정값 셋팅  (0) 2019.03.11
Scriptable Object  (0) 2019.03.11
Unity CG / Boehm-Demer-Weiser / 점진적 GC  (0) 2019.03.05
Unity Heap Memory 구조  (0) 2019.03.05
Mono / Mono Behaviour  (0) 2019.03.05