본문 바로가기
유니티 Unity/유니티 기능 구현

[유니티] Invoke(인보크) 메소드의 사용법 총정리

by TODAYCODE 2021. 9. 8.
반응형

유니티에서 스크립트를 작성하다보면, 몇초 뒤에 무언가가 실행되게 만들어야할 때가 있다.

이런 상황에서 사용할 수 있는 대표적인 방법 2가지가 Invoke와 코루틴이다.

Invoke가 사용하기가 훨씬 간단하기 때문에 초보자도 쉽게 사용하는 효과적인 함수이다.

 

 

먼저 유니티 공식 사이트의 문서를 확인해보자.

 

Unity - Scripting API: MonoBehaviour.Invoke

If time is set to 0, the method is invoked at the next Update cycle. In this case, it's better to call the function directly. For better performance and maintability, use Coroutines instead.

docs.unity3d.com

Invoke 함수는 일단 모노비헤이비어에 속해있다... (모노비헤이비어 그는 대체...)

위 문서를 토대로 기본 사항부터 정리해보자.

 

 


  • 사용법
Invoke(string methodName, float time);

 

Invoke를 적은 뒤에 실행할 함수의 이름을 적고 바로 뒤에는 몇 초 뒤에 실행할 것인지를 적어준다.

여기서 주의할 점은 실행할 함수의 이름을 string으로 입력해야하기 때문에 " " 안에 이름을 입력해야한다.

사용법이 굉장히 직관적이고 쉽다.

 

 

 

  • 주의점

공식문서상에 적혀있는 내용들을 이야기해보자면,

만약 시간 값에 0을 입력할 경우 곧장 실행되는 것은 아니고 다음번 Update 함수 사이클에 실행된다.

아마 우리 입장에서는 체감이 안되서 곧장 실행하는 것으로 보일텐데, 아무튼 호출된 다음번에 실행된다.

공식문서 상에서도 더 나은 성능과 관리를 원한다면 Invoke 대신에 코루틴을 사용하라고 쓰여있다.

 

링크한 문서에서는 언급되어있지는 않지만 또 한가지 주의할 점이 존재한다.

보통 게임 오브젝트가 비활성화될 경우 오브젝트가 가지고 있는 스크립트의 Update 함수가 동작을 멈춘다.

그런데, 인보크를 사용한 경우 해당 게임오브젝트가 비활성화되더라도 인보크는 계속해서 동작한다.

게임 오브젝트가 비활성화되었음에도 인보크가 존재한다면 컴퓨터 사양을 좀먹게 되는 것이다.

따라서 인보크를 멈추기 위해서는 반드시 비활성화가 아니라 게임오브젝트 자체를 파괴해서 없애거나

인보크를 멈추는 CancelInvoke 함수를 사용해서 인보크를 멈춰주어야한다.

 

 

 

  • 추가 사용 방법

인보크와 관련된 더 다양한 메소드들이 존재한다.

 

 

1. InvokeRepeating

 

InvokeRepeating(string methodName, float time, float repeatRate);

해당 메소드는 인보크와 동일하게 지연된 시간 후에 함수를 호출하는데 이것을 반복적으로 수행하게 해준다.

기존의 Invoke와 동일하게 매개변수들을 입력한 후에 반복될 시간을 추가로 입력해주면 된다.

ex) InvokeRepeating("1번함수", 2f, 5f)

라고 입력을 한다면 1번 함수를 2초후에 실행한 다음에 5초마다 다시 반복적으로 실행시켜준다.

주의할 점은 3번째 매개변수에 0을 입력할 경우, 아예 InvokeRepeating이 동작하지 않는다.

 

 

 

2. CancelInvoke

 

CancelInvoke();

해당 메소드를 매개변수 없이 입력하면 현재 존재하는 모든 인보크를 멈추게 만든다.

만약 매개변수에 함수 이름을 적으면, 해당 인보크만 멈추게 할 수도 있다.

InvokeRepeating() 을 사용했다면, 일정 조건 후에 CancelInvoke() 를 써서 멈추게 만드는 것이 좋다.

 

 

 

3. IsInvoking()

 

IsInvoking(string methodName);

인보크가 동작하고 있는지를 bool 값으로 알려준다.

매개변수 값을 넣으면 해당 메소드가 동작 중인지를 알 수 있고, 매개변수를 입력하지 않으면 현재 동작 중인 인보크가 있는지 알 수 있다.

bool 값으로 결과를 리턴하기 때문에 조건문에 작성해서 인보크가 동작 중일때 혹은 동작중이 아닐때에만 무엇을 해라 라는 식의 소스코드 작성이 가능하다.

 

 

 

  • 단점

유니티 공식문서에서 인보크보다는 코루틴의 사용을 권장하는 이유는 성능 때문이다.

인보크는 문자열로 함수명을 입력하고 이 문자열을 통해서 함수를 실행하는데, 이 과정에서 C#의 리플렉션 기능이 사용된다. 이렇게 문자열로 리플렉션을 하는 속도가 직접 함수를 호출하는 것보다 훨씬 더 매우 느리다.

PC의 경우 컴퓨터 사양이 상향평준화가 되어서 크게 상관은 없을지 몰라도, 사양을 민감하게 다뤄야하고 최적화가 중요한 개발을 하고 있다면 인보크는 최대한 피하는 것이 좋다.


 

 

이상으로 인보크에 대해서 정리해봤다.

Invoke는 사용하기도 편하면서 강력한 기능을 제공하기 때문에 자주 사용하게 될 수도 있다.

그치만 나는 코루틴을 자주 쓰고 인보크는 거의 사용하지 않는 편이다.

다음 번은 코루틴에 대해서 포스팅을 해보도록 하겠다.

 

반응형

댓글