Invoke

woollim·2024년 11월 10일
0

Unity개념

목록 보기
8/8

■ Invoke 개념

○ Invoke

  • Invoke("메서드이름", 딜레이시간);

    • 메서드이름 : 호출할 메서드의 이름을 문자열로 입력합니다.
    • 딜레이시간 : 호출할 메서드가 몇 초 후에 실행될지를 설정합니다.
  • 유니티의 Invoke 메서드는 특정 메서드를 일정 시간 후에 호출하도록 예약하는 기능을 제공합니다. 주로 MonoBehaviour 클래스에서 사용할 수 있으며, 딜레이를 적용하여 메서드를 실행할 때 유용합니다.

  • 예제코드

    • 아래는 Invoke를 사용하여 PrintMessage 메서드를 2초 후에 실행하는 예제입니다.
using UnityEngine;

public class InvokeExample : MonoBehaviour
{
    void Start()
    {
        Invoke("PrintMessage", 2f); // 2초 후에 PrintMessage를 호출
    }

    void PrintMessage()
    {
        Debug.Log("Invoke 호출됨!");
    }
}
// 이 코드에서는 유니티가 Start 메서드를 호출한 후 2초가 지나면 PrintMessage 메서드가 실행됩니다.

○ InvokeRepeating - 반복 호출

  • InvokeRepeating("메서드이름", 초기딜레이시간, 반복주기);
  • InvokeRepeating 메서드를 사용하면 일정 시간 간격으로 반복하여 메서드를 호출할 수 있습니다.
  • 예제코드
using UnityEngine;

public class InvokeRepeatingExample : MonoBehaviour
{
    void Start()
    {
        InvokeRepeating("PrintMessage", 1f, 2f); // 1초 후부터 시작, 2초 간격으로 호출
    }

    void PrintMessage()
    {
        Debug.Log("반복 호출 중!");
    }
}
// 이 코드에서는 PrintMessage 메서드가 1초 후에 시작하고, 이후 2초 간격으로 계속 호출됩니다.

○ Invoke 중지

  • Invoke 또는 InvokeRepeating으로 예약된 메서드를 취소하려면 CancelInvoke 메서드를 사용합니다.
  • 특정 메서드의 호출을 취소 : CancelInvoke("메서드이름");
  • 모든 Invoke 호출을 취소 : CancelInvoke();
  • 주의사항
    • Invoke는 문자열로 메서드를 호출하므로, 오타가 나면 실행되지 않고 오류가 발생할 수 있습니다.
    • 성능에 민감한 경우 Invoke보다는 Coroutine을 사용하는 것이 더 효율적일 수 있습니다.


■ .Invoke()

○ .Invoke() 개념

  • C#에서 델리게이트(delegate)나 이벤트(event)를 호출하는 메서드입니다. 주로 델리게이트나 이벤트에 연결된 메서드들을 실행할 때 사용합니다.

  • 델리게이트와 이벤트
    델리게이트는 특정 메서드의 참조를 저장할 수 있는 타입이며, 이벤트는 델리게이트의 일종으로 주로 사용자 상호작용이나 특정 조건이 발생할 때 이를 다른 메서드들이 처리할 수 있도록 합니다.
    .Invoke()는 이러한 델리게이트나 이벤트를 호출해, 연결된 메서드를 실행합니다.

  • 델리게이트와 이벤트의 실제 사용에서 .Invoke()는 상황에 따라 여러 메서드를 실행할 수 있도록 하여, 코드의 유연성과 재사용성을 높입니다.

  • 예제코드

public delegate void MyDelegate(); // 델리게이트 정의
public MyDelegate myDelegate;     // 델리게이트 인스턴스 생성

void Start()
{
    myDelegate = MyMethod;       // 델리게이트에 메서드 연결
    myDelegate.Invoke();         // 연결된 메서드 호출 (MyMethod가 실행됨)
}

void MyMethod()
{
    Debug.Log("MyMethod 호출됨!");
}
- myDelegate 델리게이트에 MyMethod 메서드를 연결했습니다.
- myDelegate.Invoke()를 호출하면 MyMethod가 실행됩니다. 

○ .Invoke() 없이 호출하기

  • .Invoke() 없이도 델리게이트를 호출할 수 있습니다.
    델리게이트 이름 뒤에 ()를 붙이면 연결된 메서드가 호출됩니다. 위 예제에서는 myDelegate()와 같이 호출할 수도 있습니다.
  • 그럼에도 .Invoke()를 쓰는이유
    • 델리게이트를 호출하는 방법을 명확하게 나타내기 때문에, 코드 읽는 사람이 델리게이트 호출이라는 의도를 쉽게 파악할 수 있습니다.
    • myDelegate()와 같이 델리게이트를 호출하는 방식도 가능합니다. 하지만 이 경우, 델리게이트 호출이 단순한 메서드 호출처럼 보일 수 있어 코드의 의도를 명확히 이해하기 어려울 수 있습니다.
    • 예외처리 가능. ?.Invoke()와 같이 사용하면 안전하게 예외를 피할 수 있습니다.

○ null 조건부 연산자와의 조합

  • ?.Invoke()를 사용하면 델리게이트나 이벤트가 null인지 확인하고 호출할 수 있어, NullReferenceException 예외를 방지할 수 있습니다.

사용 예



■ .Invoke()와 Invoke()

.Invoke()와 Invoke("메서드이름", 딜레이시간)는 비슷한 이름을 가지고 있지만, 서로 다른 용도로 사용됩니다.

○ .Invoke()

  • 사용처 : C#의 델리게이트(delegate)나 이벤트(event)를 호출할 때 사용합니다.
  • 용도 : 델리게이트나 이벤트에 연결된 메서드를 실행합니다.
  • 동작 방식 : 델리게이트나 이벤트가 null이 아니면 바로 메서드를 호출하며, 호출 즉시 메서드가 실행됩니다.
public delegate void MyDelegate();
public MyDelegate myDelegate;

void Start()
{
    myDelegate = MyMethod;
    myDelegate.Invoke();  // MyMethod가 바로 실행됩니다.
}

void MyMethod()
{
    Debug.Log("MyMethod가 호출됨!");
}

○ Invoke("메서드이름", 딜레이시간)

  • 사용처 : 유니티(Unity) 엔진에서 MonoBehaviour 클래스에서 제공하는 기능으로, 특정 메서드를 일정 시간 뒤에 호출하고 싶을 때 사용합니다.
  • 용도 : 일정 시간 후에 특정 메서드를 호출하는 데 유용합니다.
  • 동작 방식 : 첫 번째 매개변수로 메서드의 이름을 문자열로 지정하고, 두 번째 매개변수로 지연 시간을 초 단위로 입력합니다. 지정된 시간이 지난 후에 해당 메서드가 호출됩니다.
using UnityEngine;

public class InvokeExample : MonoBehaviour
{
    void Start()
    {
        Invoke("DelayedMethod", 2f);  // 2초 후에 DelayedMethod가 호출됩니다.
    }

    void DelayedMethod()
    {
        Debug.Log("DelayedMethod가 호출됨!");
    }
}

○ 차이점 요약

0개의 댓글