(转载)虚幻引擎3--Unrealscript(US)虚幻脚本代理Delegates

https://udn.epicgames.com/Three/UnrealScriptDelegates.html

概述


一个代理是到一个绑定到对象上的函数的引用。它们的主要用途是提供函数调用机制,比如,在用户界面系统中提供事件通知。

声明代理


您需要做的第一件事情是声明一个代理。代理声明看上去和事件声明类似。例如:

    Class Button extends Window;

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

将代理作为函数参数

在虚幻引擎 3 中,代理可以用作为函数参数。您首先需要按照上面的方式声明一个代理。然后,您可以在函数中像这样来使用该声明的代理:

   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 && 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 函数。当 Button 类的 MouseUp 函数调用 OnClick 代理时,作为替换将会调用 MyDialogBox 的 MyClick 函数。如果没有代理,那么您需要创建 Button 类的子类并实现这个功能。

可替换地,您可以在类的 defaultproperties{} 块中分配代理,如下所示:

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

您也可以把一个代理分配为 None ,这将会导致当调用该代理时,它不会做任何事情。

作为函数参数传入的代理反过来也可以用于在这个类中分配代理属性。

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

代理和删除的对象


当您删除了一个代理引用的 Actor,然后再调用代理函数时,该代理将什么也不做,就像把它的值分配为 None 一样。

在非 Actor 对象中,代理引用的作用和一般的对象引用一样,并且它会防止那个对象被垃圾回收。如果您在没有删除到一个非 Actor 对象的其中一个函数的代理引用的情况下删除那个对象,那么对该代理的调用将会导致系统崩溃。

为代理声明代理体


您可以为代理声明代理体,比如:

    Class Button extends Window;

    delegate OnClick( Button B, int MouseX, int MouseY )
    {
        Log("This is the default action");
    }

如果您在 OnClick delegate(代理)指向 None 时调用这个代理,那么它将执行代理的函数体。当没有分配 OnClick 的值时,您可以使用这个机制来提供默认的动作。

时间: 2024-08-25 00:53:10

(转载)虚幻引擎3--Unrealscript(US)虚幻脚本代理Delegates的相关文章

(转载)虚幻引擎3--6掌握虚幻技术UnrealScript 函数

第六章 –函数 6.1概述 指南 6.1环境生物, 第一部分:基类声明 指南 6.2 环境生物, 第二部分:类的变量声明 指南 6.3 环境生物,第三部分:渲染及光照组件 指南 6.4 环境生物, 第四部分:碰撞及物理属性 6.2 函数声明 指南 6.5 环境生物, 第五部分:       SETRANDDEST() 函数 6.3函数修饰符 Static Native Final Singular NoExport Exec Latent Iterator Simulated Server Cl

(转载)虚幻引擎3--11掌握虚幻技术UnrealScript 状态

第 11章 – STATES (状态) 11.1什么是状态编程 11.2虚幻引擎3中的状态 AUTO 关键字 IGNORES 关键字 SUPER        & GLOBAL 关键字 11.3 -基本的状态转换 GOTOSTATE GOTO STATE        EVENTS BEGINSTATE ENDSTATE 指南 11.1 – 状态触发器, 第一部分:函数重载 11.4 -状态继承 扩展状态 指南 11.2 –状态触发器, 第二部分:状态继承 指南11.3 – 状态触发器, 第三部

(转载)虚幻引擎3--9掌握虚幻技术UnrealScript 预处理器

第九章 – UNREALSCRIPT预处理器 9.1概述 9.2 MACRO(宏)的基础知识 指南 9.1 –您的第一个宏 9.3具有参数的宏 指南 9.2 –       MACRO参数 9.4内置宏 DEFINE IF/ELSE/ENDIF 实例:         IF/ELSE/ENDIF的应用 INCLUDE ISDEFINED/NOTDEFINED 示例: 结合使用         IF/ELSE/ENDIF 和 ISDEFINED/NOTDEFINED UNDEFINE LOG/WA

(转载)虚幻引擎3--3掌握虚幻技术UnrealScript 类

第三章–Unreal中的类 3.1概述 3.2 NATIVE       对 非-NATIVE 3.3类声明 EXTENDS 关键字 指南 3.1您的第一个类声明 3.4类的修饰符 NATIVE(PACKAGENAME) NATIVEREPLICATION DEPENDSON(CLASSNAME[,CLASSNAME,...]) ABSTRACT DEPRECATED TRANSIENT NONTRANSIENT CONFIG(ININAME) Engine Editor Game Input

(转载)虚幻引擎3--2掌握虚幻技术UnrealScript初级学习

第二章: UNREALSCRIPT的初级学习 2.1基本语法 标识符和关键字 表达式和操作符 注释 2.2再生MUTATOR(设置方法) 设计类的计划 指南 2.1 –研究再生Mutaor(设置方法) 指南 2.2 –初始化PAWN类设置 指南 2.3 –设置再生计时器 指南 2.4 –mutator(设置方法)的脚本 指南 2.5 -编译脚本 指南 2.6 –发布及测试mutator(设置方法) 附加文件 第二章: UNREALSCRIPT的初级学习 无论您是第一次开始学习编程或者只是简单地学

(转载)虚幻引擎3--第九章 – UNREALSCRIPT预处理器

第九章 – UNREALSCRIPT预处理器 9.1概述 9.2 MACRO(宏)的基础知识 指南 9.1 –您的第一个宏 9.3具有参数的宏 指南 9.2 – MACRO参数 9.4内置宏 DEFINE IF/ELSE/ENDIF 实例: IF/ELSE/ENDIF的应用 INCLUDE ISDEFINED/NOTDEFINED 示例: 结合使用 IF/ELSE/ENDIF 和 ISDEFINED/NOTDEFINED UNDEFINE LOG/WARN LOGD ASSERT 示例:验证条件

(转载)虚幻引擎3--13掌握虚幻技术UnrealScript 接口

第十三章 – 接口 什么是接口? 接口示例 USB 电脑鼠标 电源插座 编程说明 定义接口 声明和定义 接口继承 实现接口 为什么使用接口? 结束语 指南 13.1 – 指南针, 第一部分:指南针接口 指南 13.2 –指南针, 第二部分:指南针类的实现 指南 13.3 –指南针, 第三部分: 测试指南针, 第一部分 指南 13.4 – 小地图, 第一部分:       MU_MINIMAP 类 指南 13.5 – 小地图, 第二部分: MINIMAPGAME 类 指南 13.6 – 小地图,

(转载)虚幻引擎3--12掌握虚幻技术UnrealScript 代理

第十二章- DELEGATES(代理) 12.1 –概述 12.2 - 声明代理(Delegate) 代理参数 默认行为 12.3 - 代理变量 12.4 - 传递Delegate(代理)给函数 12.5 - 代理和内存 12.6 -       UISCENE 和 UIOBJECT       DELEGATES(代理) UISCENE 代理 UIOBJECT 的代理 12.7 – 虚幻引擎3和虚幻竞技场3中的其它代理 AUDIOCOMPONENT GAMEINFO GAMEVIEWPORTC

(转载)虚幻引擎3--第二章: UNREALSCRIPT的初级学习(UNREALSCRIPT BAPTISM BY FIRE )

第二章: UNREALSCRIPT的初级学习 2.1基本语法 标识符和关键字 表达式和操作符 注释 2.2再生MUTATOR(设置方法) 设计类的计划 指南 2.1 –研究再生Mutaor(设置方法) 指南 2.2 –初始化PAWN类设置 指南 2.3 –设置再生计时器 指南 2.4 –mutator(设置方法)的脚本 指南 2.5 -编译脚本 指南 2.6 –发布及测试mutator(设置方法) 附加文件 第二章: UNREALSCRIPT的初级学习 无论您是第一次开始学习编程或者只是简单地学