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 |