개발/유니티

유니티 인보크(Invoke)란?

셩잇님 2023. 6. 12. 22:53
반응형

 

 

1. 인보크란?

Unity에서 '인보크(=호출)'이란 특정 함수나 메서드의 실행을 일정 지연 후 또는 지정된 시간 간격으로 예약할 수 있는 메서드를 말합니다. 인보크는 주로 다른 이벤트가 발생할 때까지 지연시키거나 일정한 간격으로 반복적으로 메서드를 실행할 때 자주 사용됩니다. 또한 복잡한 타이머나 수동 추적 없이도 나중에 코드를 실행할 수 있는 편리한 방법을 제공합니다.

 

2. 인보크의 종류
Unity의 인보크 기능은 크게 두 가지 방식으로 사용할 수 있습니다

지연된 실행: 인보크을 사용하여 특정 지연 시간 후에 함수나 메서드를 실행할 수 있습니다. 이 기능은 특정 동작을 수행하기 전에 지연을 도입하려는 경우에 유용합니다. 예를 들어, 몇 초 후에 화면에 메시지를 표시하거나 짧은 지연 후에 게임플레이 이벤트를 트리거할 수 있습니다. 인보크 함수는 실행할 메서드 또는 함수의 이름과 지연 시간(초)을 파라미터로 사용합니다.

반복 실행: Invoke는 지정된 시간 간격으로 함수나 메서드를 반복적으로 실행하는 데에도 사용할 수 있습니다. 이는 일반적으로 주기적 또는 반복 작업을 만드는 데 사용됩니다. 예를 들어 0.5초마다 움직이는 객체의 위치를 업데이트하거나 프레임 업데이트마다 특정 함수를 실행할 수 있습니다. InvokeRepeating 함수는 실행할 메서드 또는 함수의 이름, 초기 지연, 반복 간격을 파라미터로 받습니다.

 

3. 인보크의 장점
단순성: Invoke는 수동 시간 추적이나 복잡한 타이머 없이도 간단하고 직관적으로 코드 실행을 예약할 수 있는 방법을 제공합니다.

유연성: 함수 호출의 지연 시간이나 시간 간격을 쉽게 커스터마이징할 수 있어 코드 실행 시기와 빈도를 제어할 수 있습니다.

Unity와 통합: Invoke는 다른 Unity 기능 및 C#과 같은 스크립팅 언어와 원활하게 통합됩니다. 이를 사용하여 게임 오브젝트를 조작하는 함수를 호출하고, 애니메이션을 트리거하고, UI 요소를 업데이트하거나, 기타 게임 관련 작업을 수행할 수 있습니다.

 

4. 인보크의 예제

인보크를 사용하려면 먼저 호출하려는 메서드를 만들어야 합니다. 이 메서드는 스크립트의 모든 공개 메서드가 될 수 있습니다. 메서드를 생성한 후에는 Invoke를 사용하여 나중에 실행할 수 있습니다.

 

[Invoke의 구문]
Invoke의 구문은 다음과 같습니다.

 

Invoke(methodName, delay);

 

methodName은 호출하려는 메서드의 이름입니다. delay는 메서드를 실행하기 전에 대기할 시간(초)입니다.

 

[Invoke의 간단한 예제]

예를 들어 다음 코드는 2초 후에 myMethod 메서드를 호출합니다.

Invoke("myMethod", 2f);

 

Invoke를 사용하여 일정한 간격으로 메서드를 반복적으로 실행할 수도 있습니다. 이를 위해 InvokeRepeating 메서드를 사용합니다.

 

[InvokeRepeating의 구문]

InvokeRepeating의 구문은 다음과 같습니다.

InvokeRepeating(methodName, delay, interval);


methodName은 반복적으로 호출하려는 메서드의 이름입니다. delay는 메서드를 처음 실행하기 전에 대기할 시간(초)입니다. interval은 메서드의 각 후속 실행 사이에 대기할 시간(초)입니다.

 

[InvokeRepeating의 예제]
예를 들어, 다음 코드는 1초마다 myMethod 메서드를 호출합니다.

 

InvokeRepeating("myMethod", 0f, 1f);

 

[Invoke의 자세한 예제]
마지막으라 보다 자세하게 작성된 사용 예시입니다.

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    private void Start()
    {
        // Invoke a function after a delay of 2 seconds
        Invoke("DelayedFunction", 2f);

        // Invoke a function repeatedly every 1 second, starting after 3 seconds
        InvokeRepeating("RepeatedFunction", 3f, 1f);
    }

    private void DelayedFunction()
    {
        Debug.Log("Delayed function called after 2 seconds");
    }

    private void RepeatedFunction()
    {
        Debug.Log("Repeated function called every 1 second");
    }
}

 

이 예제에서는 Start 메서드가 호출된 후 2초 후에 "DelayedFunction"이 한 번 호출됩니다. "RepeatedFunction"은 Start 메서드가 호출된 3초 후부터 1초마다 호출됩니다.

 

5. 인보크의 활용
다른 이벤트가 발생할 때까지 메서드 실행을 지연시킵니다. 예를 들어, 인보크을 사용하여 플레이어가 특정 영역에 진입할 때까지 적을 스폰하는 메서드의 실행을 지연시킬 수 있습니다.


메서드를 일정한 간격으로 반복적으로 실행합니다. 예를 들어 InvokeRepeating을 사용하여 화면에서 오브젝트의 위치를 반복적으로 업데이트할 수 있습니다.


타이머를 구현합니다. 예를 들어 InvokeRepeating을 사용하여 10초부터 카운트다운하는 타이머를 구현할 수 있습니다. 타이머가 0에 도달하면 객체를 폭발시키는 등의 동작을 수행하는 메서드를 실행할 수 있습니다.

 

6. 인보크와 코루틴의 차이점

Unity의 인보크와 코루틴은 모두 Unity 프로젝트에서 코드의 타이밍과 실행을 제어하는 메커니즘이지만, 사용법과 기능에는 약간의 차이가 있습니다.

 

실행 제어
Invoke: 인보크를 사용하면 지정된 지연 후 또는 지정된 시간 간격에 메서드나 함수를 실행할 수 있습니다. 코드 실행을 예약하는 간단하고 직접적인 방법입니다.
Coroutines: 코루틴은 실행 중에 일시 중지했다가 다시 시작할 수 있는 특수 함수입니다. 코루틴은 코드 실행 타이밍을 보다 세밀하게 제어할 수 있으며 보다 복잡하고 비동기적인 동작을 허용합니다.

동기식 대 비동기식
Invoke: 인보크는 코드를 동기적으로 실행하므로 호출된 메서드가 완료될 때까지 호출 스크립트의 실행을 차단합니다. 간단한 일회성 지연이나 주기적인 동작에 유용할 수 있습니다.
Coroutines: 코루틴은 코드를 비동기적으로 실행하므로 코루틴이 일시 중지되는 동안 스크립트의 다른 부분이 계속 실행될 수 있습니다. 따라서 장기 실행 작업을 처리하거나 복잡한 작업 시퀀스를 구현하는 데 적합합니다.

일시 중지 및 재개
Invoke: 일단 호출되면 코드 실행을 일시 중지하거나 다시 시작할 수 없습니다. 스크립트가 계속되기 전에 완료될 때까지 실행됩니다.
Coroutines: 반환 반환 문을 사용하여 코루틴을 일시 중지하고 다시 시작할 수 있습니다. 이를 통해 코루틴 실행을 계속하기 전에 지연을 도입하거나 특정 조건을 기다릴 수 있습니다.

수익률 및 시간 제어
Invoke: 인보크는 호출된 메서드 내에서 실행 시간을 반환하거나 제어하기 위한 내장 메커니즘을 제공하지 않습니다.
Coroutines: 코루틴은 반환 반환 문을 사용하여 호출 스크립트로 제어권을 반환할 수 있습니다. 이를 통해 시간 기반 지연(yield return new WaitForSeconds(delay)) 또는 특정 조건에 대한 대기(yield return new WaitUntil(condition))가 가능합니다.

유연성과 복잡한 동작:
Invoke: 인보크는 사용하기가 더 간단하고 기본적인 타이밍 요구에 적합합니다. 보다 복잡한 동작이나 비동기 작업을 처리할 때는 제한될 수 있습니다.
Coroutines: 코루틴은 더 큰 유연성을 제공하며 복잡하고 비동기적인 동작을 만들 때 더 강력합니다. 애니메이션, AI 동작, 순차적 동작 등에 사용할 수 있습니다.

 

7. 언제 어떤것을 사용해야 하는가?
Invoke를 사용하는 경우
다음 프레임이 렌더링되기 전에 특정 코드가 실행되도록 해야 하는 경우
메서드의 실행을 지연하거나 반복해야 하는 경우

Coroutines을 사용해야 하는 경우
메인 스레드를 차단하지 않고 장기 실행 작업을 수행해야 하는 경우
메서드 실행을 취소하거나 일시 중지할 수 있어야 하는 경우

 

8. 결론

Unity의 Invoke 함수는 코드 실행을 예약하는 편리한 방법을 제공하여 지연을 도입하고 주기적인 동작을 수행하며 Unity 프로젝트에서 동적이고 인터랙티브한 동작을 생성할 수 있습니다.

 

반응형

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

유니티 치트엔진 방지하는 방법  (0) 2023.06.18
유니티 프로파일러(Profiler)란?  (0) 2023.06.12
유니티 UGUI란?  (1) 2023.06.12
유니티 NGUI란?  (0) 2023.06.12
유니티 순운동학(Forward Kinematics, FK)란?  (0) 2023.06.12