unity - Coroutine Method of Use & Stop 코루틴 사용 방법 및 정지 방법


while로 코루틴 실행하기.
StartCoroutine과 같음.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CoroutineTest : MonoBehaviour {
 
     void Func()    {
        // 변수 설정
        IEnumerator enumerator = TestCor();
        while (enumerator.MoveNext()) // return 전까지 실행
        {
            object result = enumerator.Current; // 리턴 실행
            Debug.Log("Number: " + result); 
        }
    }
    
    IEnumerator TestCor()
    {
        yield return 1// 리턴 1
        yield return 2// 리턴 2 
        yield return 3// 리턴 3
    }
}
cs

결과
1
2
3

코루틴 여러개 실행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CoroutineTest : MonoBehaviour {
 
 
    IEnumerator[] cor5 = new IEnumerator[2];
    int count = 0;
 
    // Use this for initialization
    void Start () {
        // 변수 설정
        IEnumerator cor1 = TestCor();
        IEnumerator cor2 = TestCor();
        IEnumerator cor3 = TestCor();
 
        cor5[0= TestCor();
 
        // 코루틴 실행
        StartCoroutine(cor1);
        StartCoroutine(cor2);
        StartCoroutine(cor3);
 
        StartCoroutine((cor5[0]));
 
        // 변수 설정과 실행
        StartCoroutine((cor5[1= TestCor()));
    }
    
    // 여러개 호출
    IEnumerator TestCor()
    {
        Debug.Log(count);
        count++;
 
        yield return null;
    }
}
cs
결과
0
1
2
3
4


StartCoroutine(Func()) 을 이용한 호출

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CoroutineTest : MonoBehaviour {
 
    void Start() {        
        StartCoroutine(TestCor(2.0F));
    }
 
    IEnumerator TestCor(float waitTime)
    {
        yield return new WaitForSeconds(waitTime);
        Debug.Log("Done. " + Time.time);
    }
}
cs

결과
Done. 2.0000xxx


Return StartCoroutine
코루틴에서 작동, 코루틴이 끝날때까지 함수 동작 중지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CoroutineTest : MonoBehaviour {
 
    IEnumerator Start()    {
        yield return StartCoroutine(WaitAndPrint(2.0F));
        Debug.Log("Done " + Time.time);
    }
 
    IEnumerator WaitAndPrint(float waitTime)
    {
        yield return new WaitForSeconds(waitTime);
        Debug.Log("WaitAndPrint " + Time.time);
    }
 
}
cs

결과
WaitAndPrint 2.01391
Done 2.01391

디버그 중 WaitAndPrint가 Done 보다 먼저 호출함.


StartCoroutine(string) 호출
문자열을 이용한 호출
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CoroutineTest : MonoBehaviour {
 
    // 문자열 호출    
    IEnumerator Start()
    {
        StartCoroutine("DoSomething"2.0F);
        yield return new WaitForSeconds(1);
        StopCoroutine("DoSomething");
    }
    IEnumerator DoSomething(float someParameter)
    {
        while (true)
        {
            Debug.Log("Loop");
            yield return null;
        }
    }
}
cs
결과

Loop       ------------- 0 second
Loop
....
Something------------- 1 second
Loop
Loop
...
Loop       ------------- 2 second 


yield return new WaitUntil(System.Func<Bool> predicate);

특정 조건식이 성공할때까지 기다리는 코루틴
실행하고자 하는 식을 정의해 두면 매번 Update() 와 LateUpdate() 이벤트 사이에 호출해 보고 결과값이 true면 이후로 재진행을 하게 됨.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CoroutineTest : MonoBehaviour {
 
     public int frame = 0;
 
    void Start()
    {
        StartCoroutine(Example());
    }
 
    IEnumerator Example()
    {
        Debug.Log("Wait");
        yield return new WaitUntil(() => frame >= 10);
        Debug.Log("Done");
    }
 
    void Update()
    {
        if (frame <= 10)
        {
            Debug.Log("Frame: " + frame);
            frame++;
        }
    }
}
cs
결과

Wait
Frame : 0
Frame : 1
Frame : 2
...
Done
Frame : 10

yield return new WaitWhile(System.Func<Bool> predicate);
   
WaitWhile은 결과가 true인 동안 계속 기다리게 됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CoroutineTest : MonoBehaviour {
 
    public int frame = 0;
 
    void Start()
    {
        StartCoroutine(Example());
    }
 
    IEnumerator Example()
    {
        Debug.Log("Wait");
        yield return new WaitWhile(() => frame < 10);
        Debug.Log("Done");
    }
 
    void Update()
    {
        if (frame <= 10)
        {
            Debug.Log("Frame: " + frame);
            frame++;
        }
    }
}
cs
결과

Wait
Frame : 0
Frame : 1
Frame : 2
...
Done
Frame : 10

yield return StartCoroutine(IEnumerator coroutine);

코루틴 내부에서 또다른 코루틴을 호출
그 코루틴이 완료될 때까지 기다리게 됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CoroutineTest : MonoBehaviour {
 
    void Start()
    {
        StartCoroutine(TestRoutine());
    }
 
    IEnumerator TestRoutine()
    {
        Debug.Log("T_1 Start");
        yield return StartCoroutine(OtherRoutine());
        Debug.Log("T_1 End");
    }
 
    IEnumerator OtherRoutine()
    {
        Debug.Log("T_2 1");
        yield return new WaitForSeconds(1.0f);
        Debug.Log("T_2 2");
        yield return new WaitForSeconds(1.0f);
        Debug.Log("T_2 3");
        yield return new WaitForSeconds(1.0f);
        Debug.Log("T_2 4");
    }
}
cs
결과 

T_1 Start
T_2 1
T_2 2
T_2 3
T_2 4
T_1 End


코루틴 정지 방법1
StartCoroutine(string), 문자열시작 호출에서 문자열 정지호출
위의 StartCoroutine(string) 예시에서 Stop을 살펴보면됨.

코루틴 정지 방법2
변수 설정 후 변수를 통한 호출 정지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CoroutineTest : MonoBehaviour {
 
    IEnumerator Start()
    {
        IEnumerator corTest = DoSomething(2f);
 
        StartCoroutine(corTest);
        yield return new WaitForSeconds(1);
        StopCoroutine(corTest);
    }
    IEnumerator DoSomething(float someParameter)
    {
        while (true)
        {
            Debug.Log("Loop");
            yield return null;
        }
    }
}
cs

코루틴 정지 방법3
모든 코루틴을 정지 함.
StopAllCoroutines() 함수를 이용


출처 및 참조 : http://theeye.pe.kr/archives/2725

댓글