UE4学习笔记: Functions

函数声明

UE4中有两种函数, 一种是传统的C++函数, 一种是UFunction. UFunction通过加入一些描述符来支持一些特殊功能

UFUNCTION([specifier, specifier, ...], [meta(key=value, key=value, ...)])
ReturnType FunctionName([Parameter, Parameter, ...])

主要有几种应用:

  1. 在Blueprint中调用
  2. 做为delegate, 如与按键消息进行绑定
  3. 网络回调和数据同步
  4. 做为命令行的指令执行, 同UE3的exec关键字

函数说明符

  • Blueprint相关
    • BlueprintAuthorithOnly: 没有网格授权的话不会在blueprint中执行
    • BlueprintCallable: 可以在blueprint中执行
    • BlueprintCosmetic: 表现函数, 不会在服务器执行
    • BlueprintImplementableEvent: 可以在blueprint中重写
    • BlueprintNativeEvent: 设计为被blueprint重写, 但是仍然包含native的实现
    • BlueprintPure: 不会影响自身对象
  • Network相关
    • Client: 只在客户端执行
    • Server: 只在服务端执行
    • NetMulticast: 会在服务器和所有客户端执行
    • Reliable: 函数执行通过网络进行复制, 并且是可靠的
    • Unreliable: 函数在复制执行时可能失败
  • Editor相关
    • Category
  • 其它
    • CustomThunk: 提供自定义的execFoo, 而不是生成的
    • Exec: 可以在命令行中被执行

元数据说明符

  • BlueprintInternalUseOnly
  • BlueprintProtected: 只在blueprint中调用
  • DeprecatedFunction
  • DeprecationMessage
  • UnsafeDuringActorConstruction

函数参数说明符

  • Out: 传引用
  • Optional: 可选, 取默认值

委托(Delegate)

DECLARE_DELEGATE_OneParam( FStringDelegate, FString );
FSharedRef< FLogWriter > LogWriter( new FLogWriter() );

WriteToLogDelegate.BindSP( LogWriter, &FLogWriter::WriteToLog );
WriteToLogDelegate.Execute( TEXT( "Delegates are spiffy!" ) );

建议Delegate传递时使用引用, 避免传值引起内存分配

multi-cast与event的区别只有声明event的类本身可以调用event的Broadcast, IsBound, Clear函数

dynamic delegate是用函数名进行绑定, 所以可以进行序列化, 但速度相对较慢

定时器(Timer)

GetWorldTimerManager().SetTimer(this, &AMatineeActor::CheckPriorityRefresh, 1.0f, true);
GetWorldTimerManager().ClearTimer(this, &AMatineeActor::CheckPriorityRefresh);
GetWorldTimerManager().IsTimerActive(this, &APlayerController::DelayedPrepareMapChange)

Timer不是线程安全的, 只能在游戏线程使用

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Petrichor的专栏

tensorflow: 对variable_scope进行reuse的两种方法

在tensorflow中,为了 节约变量存储空间 ,我们常常需要通过共享 变量作用域(variable_scope) 来实现 共享变量 。

2.9K60
来自专栏Jimoer

Java设计模式学习记录-单例模式

13930
来自专栏运维一切

marathon constraints 的花式用法

这个用法有个坏处,就是你设置应用启动方式的时候要注意,如果你仅仅这样设置,你的应用是无法进行重启的

13230
来自专栏JavaEdge

MyBatis Generator 用法详解 XML配置详解 3. <generatorConfiguration>的子元素MyBatis Generator中文文档

53970
来自专栏马洪彪

Java设计模式(二)抽象工厂模式

一、场景描述 接《Java设计模式(一)工厂模式》 工厂模式有一缺点,就是破坏了类的封闭性原则。例如,如果需要增加Word文件的数据采集,此时按以下步骤操作: ...

420100
来自专栏JAVA后端开发

activiti通过扩展点重写节点行为

在activit项目中,有时需要重写节点的behaviour,但如果将代码反编译,会为后续升级,及项目打包带为不方便。   其实 acitivit已经提供了扩...

39250
来自专栏肖洒的博客

爬虫入门(四):urllib2

主要使用python自带的urllib2进行爬虫实验。 写在前面的蠢事: 本来新建了一个urllib2.py便于好认识这是urllib2的实验,结果始终编译不...

10130
来自专栏LanceToBigData

JavaWeb(一)Servlet中的ServletConfig与ServletContext

前言   前面我介绍了一下什么是servlet,它的生命周期,执行过程和它的原理。这里我们做一个简单的回顾!   什么是Servlet?   servlet 是...

20560
来自专栏草根专栏

使用ASP.NET Core开发GraphQL服务器 -- 预备知识(下)

我想查看viewer下的repositories。注意里面的edges,一旦看到这个词,通常就表示有连接到某个数组的数据。在这里就是一个集合的repositor...

9920
来自专栏维C果糖

史上最简单的 MySQL 教程(十二)「记录长度」

MySQL 中规定:任何一条记录最长不超过 65535 个字节,这意味着varchar永远达不到理论最大值。

37970

扫码关注云+社区

领取腾讯云代金券