-
유니티C# - 지연 처리 / 병렬 처리 코루틴(Coroutine)유니티 메모장 2023. 2. 7. 22:12반응형
사용처
유니티에서 특정 코드가 반복적으로 실행되기 위해서는 Update문에 코드를 작성하면 되는데,
간혹 Update가 아닌 곳에서도 반복적으로 코드가 실행되어야할 필요가 있을 때가 있다.
이럴 때 코루틴을 사용하는 것이 매우 효과적이다.
또한, 업데이트문을 사용하면 원하든 원하지 않든 업데이트문이 매 프레임마다 계속 반복적으로 실행되지만,
코루틴을 사용한다면 자신이 필요한 순간에만 반복하고 필요하지 않을 때에는 전혀 사용하지 않음으로써 자원관리를 매우 효과적으로 할 수 있다.
**병렬 처리로 같이 작업을 실행해야 할 때 유리하다
코루틴 사용법
2개의 필수조건이 있음
1. 코루틴은 IEnumerator라는 반환형으로 시작해야한다.
2. yield retrun이 반드시 함수 내부에 존재해야한다.
EX)
IEnumerator 함수이름()
{
yield return // + 조건 (이 조건에 따라 코루틴의 동작을 다양하게 조정가능)
// 함수 내용
}
조건EX)
yield return 의 종류
1. yield return null; : 다음 프레임에 실행 됨.
2. yield return new WaitForSeconds( float ); : 매개변수로 입력한 숫자에 해당하는 초만 큼 기다렸다가 실행됨.
3. yield return new WaitForSecondsRealtime( flaot ); : 매개변수로 입력한 숫자에 해당하는 초만큼 기다렸다가 실행됨.
4. 그외 : yield return + new WaitForFixedUpdate / WaitForEndOfFrame 등...
5. yield break;
((주로 1번과 2번을 자주사용))
((yield break; 는 코루틴을 끝내는 코드로
일정 조건을 만족했을 경우 코루틴을 끝내고 싶다면 해당 구문을 넣어 코루틴을 끝내면 됨))
EX 실전
IEnumerator HpAttack()
{
yield return new WaitForSeconds( 2.0f );
Hp -= 10;
}
2초뒤에 Hp라는 함수를 10 깎아버리는 코루틴이다
ㅡㅡㅡㅡㅡ
만약 해당 코루틴 내부에 for문이나 while문을 사용해준다면 마치 업데이트문 처럼 매 프레임마다 반복되게 할 수 있다.
Update문은 따로 동작하면서도 말이다.
만약, 업데이트문에 이런 반복문을 쓰게 되면 해당 반복이 끝날 때까지, 반복문 아래에 있는 코드들은 전혀 실행이 되지 않는다.
그러나 코루틴에서 반복문을 사용하면 Update와는 별도로 동작하기 때문에 모든 스크립트가 정상적으로 동작하게 된다.
ㅡㅡㅡ
**코루틴 함수 사용법**
그냥 일반 메소드들 처럼 단순하게 이름을 사용해서 쓸 수는 없다. 코루틴은 특별하기 때문에.
StartCoroutine( ); 을 사용해서 쓸 수 있다. ( ) 안에다가 매개변수를 넣는 것처럼 생성한 코루틴 이름을 적어주면 된다.
예시로 HpAttack( ) 코루틴을 사용하려면 다음과 같이 작성하면 된다.
StartCoroutine(HpAttack());
StartCoroutine("HpAttack");
이렇게 2가지 방법으로 사용할 수 있다.
ㅡㅡㅡ
지연 시켰다가 코드 동작을 하게하는(거의 동일한)
Invoke와의 차이점
루틴을 통해서 Update문과는 별개로 동작하는 또다른 서브루틴을 만들 수 있기도 하지만,
그것 말고도 매개변수를 넘길 수 있다는 장점이 있다.
코루틴은 앞에 IEnumerator를 작성한다는 것 말고는 일반적인 메소드와 동일하기 때문에 매개변수를 사용할 수 있다.
따라서 굉장히 자유롭게 코루틴을 쓸 수 있다.
EX
우선 StartCoroutine으로 호출하는 것을 동일하고, 마찬가지로 2가지 방식으로 매개변수를 전달 할 수 있다.
StartCoroutine( 메소드이름( 매개변수1, 매개변수2 ) );
StartCoroutine( "메소드이름", 매개변수 );
문자열로 메소드 이름을 적어서 코루틴을 동작시킬 경우 ,를 찍어서 매개변수를 전달할 수 있다.
다만 이 경우에는 매개변수가 1개까지만 전달할 수 있다.
반면, 일반적인 메소드를 호출하는 것처럼 적어준다면 여러개의 매개변수를 전달 할 수 있다.
따라서 되도록이면 첫번째 방식으로 코루틴을 호출하여 사용하도록 하자.
성능적인 면에서도 첫번째 방법이 더 좋다.반응형'유니티 메모장' 카테고리의 다른 글
유니티C# - 주변 콜라이더 정보 수집 Physics.OverlapSphere (0) 2023.02.14 유니티C# - 배열 읽어주기 (foreach) (0) 2023.02.07 유니티C# - 리지드바디에 힘을 주는 방식들 (0) 2023.02.07 유니티C# 레이로 시선을 따라오는 객체 만들기 Raycast&point (0) 2023.01.20 유니티C# NavMeshAgent와 함께 알아야 할 코드들 (0) 2023.01.20