2022. 6. 23. 21:54ㆍUnity3D/경험 기록
Coroutine
실행을 일시 중지하고 Unity에 제어 권한을 반환한 후
다음 프레임 업데이트 때 중단했던 위치에서 계속할 수 있는 함수이다.
IEnumerator 반환 타입과 yield 반환문으로 선언된 함수이다.
기본적으로 yield return null로 인해 프레임이 생성된 후 다시 시작되지만
WaitForSeconds를 사용하여 시간 지연을 도입할 수도 있다.
어떤 작업을 주기적으로 해야 하며 자주 반복해야할 작업이 아니라면,
Coroutine에 포함시킬 수 있다.
위와 같은 작업을 Update로 한다면
원하든 원하지 않든 매 프레임마다 반복 실행되면서 오버헤드를 발생할 수 있지만,
Coroutine을 사용한다면 필요한 순간에만 반복 실행하고 그 외의 순간에는 전혀 실행하지 않음으로써 자원 관리를 효과적으로 할 수 있다.
따라서 Update문을 사용하는 것보다 성능 향상의 효과가 있다.
Coroutine문 내부에 for문이나 while문 같은 반복문을 넣어줌으로써
Update문과는 별개로 동작하면서 매 프레임마다 반복되는 서브 루틴을 만들 수도 있다.
만약 Update문에서 이런 반복문을 사용하면
반복문 아래에 있는 코드들은 전혀 실행이 되지 않아 그 밑의 처리를 할 수 없게 된다.
Invoke
설정된 시간 뒤에 함수를 호출하는 메서드.
모노비헤비어에 포함되있다.
Invoke에 세팅된 시간 값이 0이 될 경우,
Invoke가 그 프레임에 실행이 되고,
Invoke에 포함된 함수는 그 다음 프레임 업데이트 때 호출된다.
Invoke를 사용한 경우,
해당 게임 오브젝트가 비활성화되더라도 인보크는 계속해서 동작한다.
따라서 Invoke를 멈추려면 비활성화가 아닌 게임 오브젝트 자체를
파괴하거나 CancelInvoke 함수를 사용해야 한다.
InvokeRepeating(string methodName, float time, float repeatRate)
Invoke와 동일하게 지연된 시간 후에 함수를 호출하는데,
이것을 반복적으로 수행하게 해준다.만약 repeatRate 값에 0을 입력할 경우, 아예 InvokeRepeating이 동작하지 않는다.
CancelInvoke()
해당 메서드를 매개변수 없이 입력하면 현재 존재하는 모든 인보크를 멈추게 한다.만약 매개변수에 함수 이름을 넣으면, 해당 인보크만 멈추게 할 수도 있다.
IsInvoking(string methodName)
해당 함수의 Invoke가 동작하고 있는지 bool 값으로 알려준다.매개변수에 값을 넣지 않으면 현재 동작 중인 Invoke가 있는 지 알려준다.
Coroutine과 Invoke의 차이
Coroutine은 매개변수를 넘길 수 있다는 장점이 있다.
Coroutine은 타입만 IEnumerator인 일반 메서드와 다를 게 없기 때문에
매개변수를 사용할 수 있다.
따라서 자유로운 사용이 가능하다.
Coroutine에 매개변수를 넣기 위해선1) StartCoroutine(메서드 이름(매개변수1, 매개변수2))2) StartCoroutine("메서드 이름", 매개변수)
첫번 째 경우는 여러 개의 매개변수를 전달할 수 있지만,두번 째 경우는 한 개의 매개변수 밖에 전달하지 못한다.
또한 Invoke 항목에서 나온 단점과 같은 이유인지성능도 첫번 째 방법으로 쓰는 게 더 좋다.
만약 호출하는 함수에 매개변수값을 전달해야할 때는
Coroutine을 대신 사용하자.
성능 또한 Coroutine이 더 좋다
'Unity3D > 경험 기록' 카테고리의 다른 글
[Unity] 파티클 시스템의 다양한 렌더 모드 (0) | 2022.07.03 |
---|---|
[Unity] Mesh, 메시란? (0) | 2022.07.03 |
[Unity] using문이란? (0) | 2022.06.20 |
[Unity] 최적화 팁 (0) | 2022.06.20 |
[Unity] Fillrate란? (0) | 2022.06.20 |