UDN
Search public documentation:

UnrealScriptDelegatesJP
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

UnrealScript のデリゲート

ドキュメントの概要: UnrealScriptにおける関数のデリゲート化。

ドキュメントの変更ログ:

  • Richard Nalezynski? と Ron Prestenback? により管理。
  • UE3 用に Michiel Hendriks により調整。
  • Vito Miliano (UdnStaff) により Wiki を整理。
  • 原作者は Jack Porter (EpicGames)。

はじめに

デリゲートは、一対一結合であるオブジェクトのリファレンスです。ここでは、その UnrealScriptにおける活用方法についてご説明します。提供される主な用途は、ユーザ インターフェース システムにおいてイベントの通知をはじめとするコールバックメカニズムです。

概観

デリゲートの宣言

まずはデリゲートを宣言します。デリゲートの宣言はイベントの宣言と類似しています。次の例をご覧下さい。:

      Class Button extends Window;
  
      delegate OnClick( Button B, int MouseX, int MouseY );
  

デリゲートを関数の引数に使う

UnrealEngine3では、デリゲートを関数の引数に利用することもできます。まずはデリゲートを上記のように宣言します。次にこの宣言済みデリゲートを以下のようにして引数にします。:

     function DoStuff(delegate<OnClick> ClickDelegate)
     {
     }
  

宣言済みのデリゲートと同じ様式の関数は、その関数を呼び出す際に引数として渡すことができます。以下の例をご覧下さい。:

     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 &amp;amp;amp;&amp;amp;amp; 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 の最後の二行では、 MyDialogBoxの MyClick 関数に=OnClick= デリゲートを割り当てています。ボタンクラスの MouseUp 関数が OnClick デリゲートを呼出したら、MyDialogBoxの MyClick 関数が変わりに呼び出されることになります。デリゲートを使わずにこの機能性を実現するには、ボタンをサブクラス化する必要があります。

もう 1 つの方法として、クラスの 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("This is the default action");
      }
  

None のポインタである OnClick デリゲートを呼出すと、デリゲートのボディを実行します。このメカニズムを利用して OnClick が割り当てられていないケースのデフォルトの動作に設定できます。