标记宏
类UCLASS、成员属性UPROPERTY、成员函数UFUNCTION
蓝图和C++的交互
UObject
UE4对于C++进行调整后,靠拢了其他虚拟机语言,为了方便对象内存管理和映射数据操作,UE4对UECPP进行了更加严谨的语法定义,所有UE中使用的对象大部分继承自UObject,这样的系统级的管理更加轻松,不必涉及更多不定性内容,UObject具备如下优点
1.垃圾回收(new出来的对象不用去释放了)
2.引用更新(更新受限于GC回收机制,需要使用UPROPERTY宏标记)(苹果消亡,对象里指向它的指针指向为空)
3.序列化(场景中的Actor被保存时发生)(保存时保存到本地)
4.默认属性变化自动更新(对象在蓝图中暴露了属性,在C++中改了属性,蓝图中会自动修改,蓝图里改c++也会改)
5.源码调整了对象属性时,编译后会自动更新到资源实例上,前提场景实例没有修改过属性值,修改过后将使用场景中的修改内容做填充参考
6.自动属性初始化(不赋值指向默认值)
7.自动编辑器整合(可以将C++属性暴露到蓝图上)
8.运行时类型信息可用
9.运行时使用Cast可以进行类型信息投射检查(指针转换关系,尝试性地将一个指针转换为另一个指针,转换的过程是安全的,失败返回空成功返回真,两个类没有关系的时候就会失败)
10.网络复制
UCLASS宏
用于标记从UObject派生的类,使得UObject处理系统识别到它们
该宏为UObject提供一个对UCLASS的引用,描述是基于虚幻引擎的类型。对于标记UCLASS的类,引擎可进行识别
继承关系中的头文件描述
#include "MyObject.generated.h"
必须是最后一个被引入的头文件,默认由UE模板生成,此头文件需要了解其他类,所以需要放到最后
UCLASS()
UCLASS宏使虚幻引擎4能识别UMyObject
class MYPROJECT_API UMyObject:public UObject
如MyProject希望将UMyObject类公开到其他模板,则需要指定MYPROJECT_API
GENERATED_BODY()
GENERATED_BODY宏不获取参数,但会对类进行设置,以支持引擎要求的基础结构,GENERATED_BODY宏将成员访问等级设为“public”,而非设置“private”的缺省语言
创建UObject类对象指针
动态构建对象的时候使用到这个函数
NewObject()是最为简单的UObject工厂模式,他需要可选的外部对象和类,并会创建拥有自动生成的名称的新实例。
UCLASS宏标记
语法结构
UCLASS(描述指令,描述指令,...)
常用标记
BlueprintType
此类可以作为蓝图中的一种变量类型使用,类默认均可被蓝图访问,一般我们用此标记描述结构体,提供给蓝图访问
Blueprintable或NotBlueprintable
用来标明当前类是否可以被蓝图继承,默认可被继承,标记关系向子类传递,子类可覆盖描述关系
Abstract
Abstract类修饰符将类声明为“抽象基类”,这样会阻止用户在虚幻编辑器中向这个世界中添加这个类的Actor,或者在游戏过程中创建这个类的实例
Const
本类中的所有属性及函数均为常量,并应作为常量导出,该标记由子类继承
Config
将类内的成员变量数据信息保存到本地配置文件中,需要显式调用函数SaveConfig使用,并配合UPROPERTY宏操作
例:UCLASS(Config=Game)
ClassGroup
用来配置组件在添加时分组情况
例:UCLASS(ClassGroup=(ZQSELF)) //分组名字不要写中文
meta
额外操作宏
例:meta=(BlueprintSpawnableComponent) //当前组件可以在蓝图中再被延展
UFUNCTION宏标记
用途:将成员函数暴露到蓝图中去,在蓝图中享有操作权限
语法结构(标注在函数顶端,禁止在尾端加分号)
UFUNCTION(指令,指令...,meta(key=value))
注意:在UFUNCTION修饰的函数中,如果参数类型是引用型参数,则在蓝图中将当作返回参数使用,无法查到输入阵脚。如果参数类型是const修饰的引用型参数,则参数被当作输入阵脚使用
常用标记
BlueprintCallable
表明此函数可在蓝图中被调用(当类被蓝图继承后才有效果)
注意:如果函数参数是引用类型,则在蓝图中调用被当作输入阵脚,如果从传入参数是const修饰的引用类型,则在蓝图中被当作输入针脚
例1:UFUNCTION(BlueprintCallable)
int32 CTime(const int32& num);
例2:UFUNCTION(BlueprintCallable)
int32 CTime(int32& num); //被当作函数输出阵脚使用
Category
标明此函数在蓝图中的分类
用法Category="UE4TEST|MyActor" // |符号用来划分分类级别
BlueprintImplementableEvent
标记的函数只能在C++中调用,在蓝图中无法调用——在CPP中无需定义即可调用,调用的是蓝图中的一个节点
用此标记可以在C++中构建函数声明,但定义由蓝图完成,从而打到C++向蓝图进行调用的目的,在CPP中无需定义
UFUNCTION(BlueprintImplementableEvent,Category="UECPP|ACPPActory")
类似纯虚函数,但是继承关系中的蓝图并不用必须重写此函数
注意:
如果函数没有返回类型,则在蓝图中当作事件Event使用
如果函数存在返回类型,则在蓝图中当作函数使用(需要在函数的overlap中寻找)
如果带有参数
没有返回值,参数是基本数据类型,则当作普通事件输入参数使用
没有返回值,参数是基本数据类型引用,则当作函数看待,在蓝图函数重载表中寻找
没有返回值,参数是自定义数据类型(如FString),编译不过
没有返回式,参数是自定义数据类型引用,则当作普通函数看待,在蓝图函数重载表中寻找
如果有返回值,则当作函数使用
传递引用操作如BlueprintCallable
BlueprintNativeEvent
标记的函数只能在C++中调用,在蓝图中无法调用
此标记可以标注函数可以在蓝图中被重写,并且具备在C++中有另一个标记函数声明格式为:
函数名_Implementation(参数列表) //必须要在C++中声明且定义
达到效果,如果蓝图重写此函数,则函数逻辑实现在蓝图,如果蓝图没有重写此函数,则函数实现在(函数名_Implementation)上
蓝图中实现后,可以右键函数节点,选择add call to parent function可以调用父类的函数逻辑(类似类中的虚函数,在继承关系中子类可以调用父类的虚函数)
注意:
如果函数没有返回类型,则在蓝图中当作事件Event使用
如果函数存在返回类型,则在蓝图中当作函数使用(需要在函数的overlap中寻找)
基本效果同上
传递引用操作如BlueprintCallable
BlueprintPure
特殊标记,构建一个蓝图中的纯函数,用来获取对象数据。所以此标记的函数必须有有效返回值(无返回值编译报错),并且在蓝图中无法加入到执行队列,只能以输出值的操作方式被使用,定义实现均放在CPP中<