상세 컨텐츠

본문 제목

[C#] 코루틴

유니티

by simstealer 2022. 7. 21. 10:11

본문

코루틴

- 대기 시간을 가질 수 있는 메서드다.

- IEnumerator 타입을 반환한다.

- 처리가 일시 대기 할 곳에 yield 키워드를 명시해야한다.

- 코루틴 메서드는 StartCoroutine()으로 실행한다.

    StartCoroutine(A());

    StartCoroutine(A(100)); // 매개변수가 있다면 입력 값도 넣어 줄 수 있다.

    StartCoroutine("A")

- 코루틴의 대기 시간 동안 다른 코드가 실행 될 수 있다.

- yield return : 반환값과 함께 중단

- yield return : 반환값 없이 중단

- MoveNext()가 호출될 때 마다 이전에 중단되었던 지점부터 재실행되며 yield문을 만날 때 까지 실행한다.

 

IEnumerator A()

{

    yield return new WaitForSeconds(10f); // 10초 동안 쉬기

    yield return new WaitForSeconds(20f); // 20초 동안 쉬기

    yield return null; // 한 프레임만 쉬기

}

 

using System;
using System.Collections.Generic;

IEnumerator<int> TestIteratorMethod()
{
    yield return 1;
    yield return 2; 
    yield return 3; 
    yield return 4; 
    yield return 5; 
    yield return 6; 
    yield return 7; 
    yield return 8; 
    yield return 9; 
    yield return 10;
}

IEnumerator<int> enumerator = TestIteratorMethod();

while (enumerator.MoveNext())
{
    Console.WriteLine(enumerator.Current);
}


// yield를 사용하면 함수 중간에 빠져나갈 수 있는데
// 일반적인 if문으로 함수 중간에 빠져나가게 되면 그 빠져나간 위치로 다시 돌아 올 순 없지만 
// yield를 사용하면 다시 빠져나갈 위치로 돌아와 다음 코드를 실행할 수 있게 된다
void Update()
{	
	elapsedTime += Time.deltaTime;
	if (elapsedTime > = 0.5f)
	{
		elapsedTime = 0f;
		
		GameObject bullet = Instantiate(BulletPrefab, transform);
		bullet.transform.LookAt(Player);
	}
}

// 위 코드를 아래 코드로 변경 할 수 있음

IEnumerator Shot()
{
	while (true)
	{
		GameObject bullet = Instantiate(BulletPrefab, transform);
		bullet.transform.LookAt(Player);
		
		yield return new WaitForSeconds(0.5f);
	}
	
}

'유니티' 카테고리의 다른 글

[C#] 레이캐스트  (0) 2022.07.21
[C#] 위치, 크기, 회전  (0) 2022.07.21
[C#] Interface  (0) 2022.07.20
[Unity] PlayerPrefs 저장 위치  (0) 2022.07.13
[Unity] Font Asset 만들기  (0) 2022.07.13

관련글 더보기

댓글 영역