UE4学习笔记: Gameplay Classes

增加类

编辑器中有一个类向导, 可以生成类所需要的文件和基础宏

头文件

由于UE4对C++做了扩展, 实现了如序列化反射等特性, 跟Qt的做法类似: 在代码中加入一些宏关键字, 在编译期间生成相应的C++代码. 因此, 对于每个类来说, 都有会生成一个ClassName.generated.h的文件

类声明

UCLASS([specifier, specifier, ...], [meta(key=value, key=value, ...)])
class ClassName : ParentName
{
    GENERATED_UCLASS_BODY()
}

UCLASS可以指定一说明符, 用于描述类的行为, 类似C#

  • 功能相关
    • Abstract: 抽象基类, 无法实例化
    • Config: 指定配置文件, 跟UE3一样
    • Const
    • ConvertsionRoot: 子类只能cast到这一级
    • CustomConstructor: 不生成默认的构造函数
    • DefaultToInstanced
    • DependsOn
    • Deprecated: 不会被序列化或保存
    • MinimalAPI/RequiredAPI: 只暴露指定函数给其它模块, 减少编译时间
    • NonTransient
    • PerObjectConfig
    • Within: 只能用在指定类里
  • Property Window相关
    • AutoExpandCategories/AutoCollapseCategories
    • AdvancedClassDisplay
    • CollapseCategories/DontCollapseCategories
    • EditInlineNew: 可以在属性窗口中创建
    • HideCategories/HideDropdown
    • HideFunctions/ShowFunctions
  • Blueprint相关
    • Blueprintable/NotBlueprintable
    • BlueprintType
  • Editor相关
    • ClassGroup: ActorBrowser里的分组
    • NotPlaceable
    • Placeable

类实现

需要在cpp中加入IMPLEMENT_CLASS宏

构造函数

AMyClass::AMyClass(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{
}

ObjectInitializer用于从archetype或CDO中初始化属性. 

ATimelineTestActor::ATimelineTestActor(const class FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{
    // Structure to hold one-time initialization
    struct FConstructorStatics
    {
        ConstructorHelpers::FObjectFinder<UStaticMesh> Object0;
        FConstructorStatics()
            : Object0(TEXT("StaticMesh'/Game/UT3/Pickups/Pickups/Health_Large/Mesh/S_Pickups_Base_Health_Large.S_Pickups_Base_Health_Large'"))
        {
        }
    };
    static FConstructorStatics ConstructorStatics;

    // Property initialization

    StaticMesh = ConstructorStatics.Object0.Object;
}

ConstructorStatics用于初始化复杂类型, 避免每次构造产生额外性能开销. 常用于Asset引用, Class引用, Name类型等

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【专业技术第十三讲】指针和内存泄露

存在问题: 指针是大家最为头痛的问题,也是程序bug中较难解决的错误,什么情况下会导致内存泄露? 解决方案: 引言 对于任何使用C语言的人,如果问他们C语言...

3638
来自专栏Java学习网

Java 实现线程死锁

Java 实现线程死锁 概述 春节的时候去面试了一家公司,笔试题里面有一道是使用简单的代码实现线程的‘死锁’,当时没有想到这道题考的是Synchronized关...

2546
来自专栏java架构师

Unit断言学习

[TestMethod]—用于把一个方法标记为一个测试方法。当你运行你的测试时,仅标记有这个属性的方法才能够运行。 [TestClass]—用于把一个类标记为...

27511
来自专栏李鹏的专栏

Java 虚拟机的内存结构

我们都知道虚拟机的内存划分了多个区域,并不是一张大饼。那么为什么要划分为多块区域呢,直接搞一块区域,所有用到内存的地方都往这块区域里扔不就行了,岂不痛快。

2531
来自专栏技术墨客

JVM与字节码——类的方法区模型 原

这是一段平凡得不能再平凡的Java代码,稍微有点编程语言入门知识的人都能理解它表达的意思:

722
来自专栏Java学习网

Java内存模型深度解读

Java内存模型深度解读 Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一...

2637
来自专栏JavaEE

Java常用设计模式

工厂是干嘛的,就是用来生产的嘛,这里说的工厂也是用来生产的,它是用来生产对象的。也就是说,有些对象我们可以在工厂里面生产,需要用时直接从工厂里面拿出来即可,而不...

1891
来自专栏Ryan Miao

java中byte, iso-8859-1, UTF-8,乱码的根源

Post@https://ryan-miao.github.io 测试代码https://github.com/Ryan-Miao/someTest/comm...

6497
来自专栏Java职业技术分享

可能是把Java内存区域讲的最清楚的一篇文章

对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不...

1330
来自专栏喔家ArchiSelf

全栈必备 Java基础

那一年,从北邮毕业,同一年,在大洋的彼岸诞生了一门对软件业将产生重大影响的编程语言,它就是——Java。1998年的时候,开始学习Java1.2,并在Java ...

1184

扫码关注云+社区

领取腾讯云代金券