UDN
Search public documentation:

UnrealScriptDelegatesKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 언리얼스크립트 > 언리얼스크립트 델리게이트

언리얼스크립트 델리게이트


문서 변경내역: Jack Porter 원저. Michiel Hendriks UE3화. Vito Miliano 위키작업. Ron Prestenback, Richard Nalezynski 관리. 홍성진 번역.

개요


델리게이트(delegate, 대리자)는 오브젝트에 묶인 함수로의 참조입니다. 이 문서는 언리얼스크립트에서의 델리게이트 사용 설명서입니다. 주요 용도는 역호출(callback) 메카니즘을 제공하기 위함인데, 유저 인터페이스 시스템에 이벤트 노티파이(notification, 통지)를 줄 때 정도를 예로 들 수 있습니다.

델리게이트 선언하기


먼저 해야 할 것은 델리게이트 선언입니다. 델리게이트 선언은 이벤트 선언과 비슷합니다. 예로:

    Class Button extends Window;

    delegate OnClick( Button B, int MouseX, int MouseY );

함수 인자(argument)로써의 델리게이트

언리얼 엔진 3에서 델리게이트는 함수 인자로 사용되기도 합니다. 먼저 위와 같이 델리게이트를 선언해 줘야 합니다. 그리고 선언된 델리게이트를 함수에서 이런 식으로 사용하면 됩니다:

   function DoStuff(delegate<OnClick> ClickDelegate)
   {
   }

이 함수를 호출할 때 선언된 델리게이트와 풋프린트(footprint)가 같은 함수를 인자로써 전달할 수 있습니다. 예를 들어:

   function MyOnClick( Button B, int MouseX, int MouseY )
   {
   }

   function CallFunction()
   {
       DoStuff(MyOnClick);
   }

델리게이트 호출하기


델리게이트 호출은 일반 함수 호출과 똑같습니다:

    Class Button extends Window;

    var int MouseDownX, MouseDownY;

    delegate OnClick( Button B, int MouseX, int MouseY );

    function MouseDown( int MouseX, int MouseY )
    {
        MouseDownX = MouseX;
        MouseDownY = MouseY;
    }

    function MouseUp( int MouseX, int MouseY )
    {
        if( MouseX == MouseDownX && MouseY == MouseDownY )
            OnClick( Self, MouseX, MouseY );
    }

함수 인자의 경우:

   function DoStuff(delegate<OnClick> ClickDelegate)
   {
       ClickDelegate(Self, MouseX, MouseY);
   }

델리게이트가 함수를 가리키도록 할당하기


델리게이트로 뭔가 하기 위해서는 함수를 할당해 줘야 합니다. 보통 그 함수는 다른 오브젝트에 있습니다. 함수 참조를 델리게이트에 할당하려면 함수 선언과 델리게이트 선언이 완전 똑같은 파라미터형 및 (있다면) 반환형을 갖고 있어야 합니다. 예제는 이렇습니다:

    Class MyDialogBox extends Window;

    var Button OKButton, CancelButton;

    function MyClick( Button B, int MouseX, int MouseY )
    {
        if( B == OKButton )
            SaveDetails();
        CloseWindow();
    }

    event Initialized()
    {
        OKButton = CreateWindow(class'Button', 40, 100, 64, 32 );
        CancelButton = CreateWindow(class'Button', 120, 100, 64, 32 );

        OKButton.Caption = "OK";
        CancelButton.Caption = "Cancel";

        OKButton.OnClick = MyClick;
        CancelButton.OnClick = MyClick;
    }

Create 의 마지막 두 줄은 양쪽 버튼에 대한 OnClick 델리게이트를 MyDialogBox의 MyClick* 함수로 할당합니다. Button 클래스의 =MouseUp 함수가 OnClick 델리게이트를 호출하면, MyDialogBox의 MyClick 함수가 대신 호출됩니다. 델리게이트 없이 이런 함수성을 구현하려면 Button의 서브클래스를 만들어야 할 겁니다.

대안으로 클래스의 defaultproperties{} 블록에 델리게이트를 할당할 수도 있는데, 다음과 같습니다:

    DefaultProperties
    {
        OKButton.OnClick=MyClick
        CancelButton.OnClick=MyClick
    }

델리게이트를 None 으로 할당할 수도 있는데, 호출되었을 때 아무것도 하지 않게 합니다.

함수 인자로 전달된 델리게이트는 차례로 클래스에서 델리게이트 속성을 할당하는 데 사용할 수 있습니다.

   function DoStuff(delegate<OnClick> ClickDelegate)
   {
       OKButton.OnClick = ClickDelegate;
   }

델리게이트와 삭제된 오브젝트


델리게이트가 참조하는 액터를 지우고서 델리게이트가 호출되면, 마치 None 값이 할당된 것처럼 아무것도 하지 않게 됩니다.

액터가 아닌 오브젝트의 경우, 델리게이트 참조는 단지 일반 오브젝트 참조처럼 작동하며, 오브젝트가 쓰레기 수집당하지 않게 합니다. 액터가 아닌 오브젝트를 그 함수중 하나로의 델리게이트 참조 제거 없이 수동으로 지워버린 상태로 해당 델리게이트가 호출되면 크래시가 유발됩니다.

델리게이트에 본문 선언하기


델리게이트에 본문을 선언할 수도 있는데, 예를 들어:

    Class Button extends Window;

    delegate OnClick( Button B, int MouseX, int MouseY )
    {
        Log("기본 동작입니다.");
    }

OnClick 델리게이트가 None 을 가리킬 때 호출하는 경우, 델리게이트의 본문이 실행됩니다. 이런 방법을 통해 OnClick 이 할당되지 않았을 경우의 기본 동작을 지정할 수 있습니다.