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
댓글
댓글 쓰기