反射宏
GENERATED_BODY
放在类的里面
不使用父类的构造函数,需要手动在头文件中声明构造函数,然后在源文件实现该构造函数
该宏之后的成员默认为private
GENERATED_UCLASS_BODY
放在类的里面
使用父类的构造函数,可直接在源文件实现构造函数,而不需要在头文件去声明
会自动生成带有特定参数的构造函数
该宏之后的成员默认为public
UCLASS
放在类的头部
告知该类为虚幻引擎类
该类必须派生自UObject
USTRUCT
放在结构体的头部
声明该结构体在虚幻反射系统中的行为
可在编辑器中编辑此结构体
可在蓝图中编辑此结构体
UENUM
放在枚举的头部
声明该枚举在虚幻反射系统中的行为
可在编辑器中编辑此枚举
可在蓝图中编辑此枚举
UPROPERTY
放在成员属性上面
声明该属性在虚幻反射系统中的行为
可在编辑器中编辑此成员属性
可在蓝图中编辑此成员属性
UFUNCTION
放在成员函数上面
声明该函数在虚幻反射系统中的行为
可在编辑器中调用此成员函数
可在蓝图中调用此成员函数
日志
UE_LOG
在编辑器日志中打印
UE_LOG(LogTemp, Warning, TEXT("Log text."));
UE_LOG(LogTemp, Warning, TEXT("Log text.%d"), 32, ...);
LogTemp
临时日志记录类别名称
Warning
打印级别
Error - 错误(红)
Warning - 警告(黄)
Display - 普通(白)
TEXT("Log text.")
打印的内容
可以为格式化字符串
32…
格式化字符串的值
AddOnScreenDebugMessage
在屏幕右上角打印
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, TEXT("Log text."));
-1
默认值
5.f
打印显示的时间
FColor::Blue
文本显示的颜色
TEXT("Log text.")
打印的内容
字符串
FString
更类似于C++中的
std::string
可以修改,有更多操作
性能低
FName
着重于表示名称
不区分大小写
不可修改
在创建时会根据内容创建哈希值,同一个哈希值的内容只会被创建一次
查找和访问时速度快
使用哈希值比较区分不同的FName
FText
着重于显示和本地化
不可更改
相对臃肿
互相转换
FString -> FName
FString str = TEXT("I am str.");
FName name = FName(*str);
FString -> FText
FString str = TEXT("I am str.");
FText text = FText::FromString(str);
FName -> FString
FName str = TEXT("I am str.");
FString fstr = str.ToString();
FName -> FText
FName str = TEXT("I am str.");
FText text = FText::FromName(str);
FText -> FString
FText str = FText::FromString("I am FString.");
FString fstr = str.ToString();
FString -> std::string
FString Str = "C++";
std::string cstr(TCHAR_TO_UTF8(*Str));
std::string -> FString
std::string cstr = "text";
ClientMessage(FString(cstr.c_str()));
容器
TArray
是U++中的动态数组
速度快,内存消耗小,安全性高
元素均为相同类型,不能进行不同元素类型的混合
TMap
键值对(
key-value
)容器键(
key
)不能重复且唯一
TSet
快速容器类
通常用在元素的排序不重要的情况下
存储唯一元素
使用数据值本身作为键
非键值对存储方式
属性说明符
UPROPERTY
UFUNCTION
UENUM
USTRUCT
元数据
UPROPERTY
UFUNCTION
实例化
UObject
class MHUONETWORK_API UHttpClient : public UObject{}
// 获得此类或子类模板类型
TSubclassOf<UHttpClient> SubHttpClientObject = UHttpClient::StaticClass();
// 实例化该类型
UHttpClient* HttpClient = NewObject<UHttpClient>(GetWorld(), SubHttpClientObject);
静态加载资源
static ConstructorHelpers::FObjectFinder<UStaticMesh> TempStaticMesh(
TEXT("/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_ChamferCube.SM_ChamferCube'"));
UStaticMesh* StaticMesh = TempStaticMesh.Object;
动态加载
// 资源
UStaticMesh* TempStaticMesh = LoadObject<UStaticMesh>(nullptr,
TEXT("/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_ChamferCube.SM_ChamferCube'"));
// 类
UClass* TempClass = LoadClass<AActor>(this,
TEXT("/Script/Engine.Blueprint'/Game/Manager/MyActor.MyActor_C'"));
代理
也叫做委托
是提供一种消息机制,分为触发点(消息发送方)和执行点(消息接收方)
单播代理
宏定义在类上面
DECLARE_DELEGATE(NoParamDelegate); // 无参无返回值
DECLARE_DELEGATE_OneParam(OneParamDelegate, FString); // 1个参数无返回值
DECLARE_DELEGATE_TwoParams(TwoParamsDelegate, FString, int32); // 2个参数无返回值
DECLARE_DELEGATE_RetVal(FString, RetvalDelegate); // 无参有返回值
DECLARE_DELEGATE_RetVal_TwoParams(FString, RetTwoValsDelegate, FString, int32); // 2个参数有返回值
在类中声明
NoParamDelegate NoParamDelegate;
OneParamDelegate OneParamDelegate;
TwoParamsDelegate TwoParamsDelegate;
RetvalDelegate RetvalDelegate;
RetTwoValsDelegate RetTwoValsDelegate;
相应的函数声明
void NoParamFunc();
void OneParamFunc(FString str);
void TwoParamFunc(FString str, int32 value);
FString RetvalFunc();
FString RetTwoValsFunc(FString str, int32 value);
相应函数实现后,绑定到相应的代理
NoParamDelegate.BindUObject(this, &AMyActor::NoParamFunc);
RetvalDelegate.BindUObject(this, &AMyActor::RetvalFunc);
触发代理
bool bExecuteSuccess = NoParamDelegate.ExecuteIfBound();
bool bExecuteIfBound = OneParamDelegate.ExecuteIfBound("123");
FString RetVal = RetvalDelegate.Execute();
多播代理
可以绑定多个函数
没有可以返回值的宏定义
除了宏定义和触发方式,其它与单播代理同理
宏定义
DECLARE_MULTICAST_DELEGATE(NoParamDelegate);
DECLARE_MULTICAST_DELEGATE_OneParam(OneParamDelegate, FString);
DECLARE_MULTICAST_DELEGATE_TwoParams(TwoParamsDelegate, FString, int32);
触发代理
TwoParamsDelegate.Broadcast("abcd", 2333);
动态多播代理
可以暴露给蓝图,在蓝图中绑定事件
没有可以返回值的宏定义
代理名称要以
F
开头除了宏定义,其它与多播代理同理
宏定义
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FNoParamDelegate);
// 代理名称 参数类型 参数名称
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOneParamDelegate, FString, str);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FTwoParamsDelegate, FString, str, int32, value);
引用
软引用
仅存储资源对象的路径
在需要的时候才会加载到内存中
常见软引用类型
FSoftObjectPath
FSoftClassPath
TSoftObjectPtr
TSoftClassPtr
硬引用
直接与资源对象产生耦合
硬引用被加载到内存中,被引用的资源对象也被加载到内存中
智能指针库
智能指针是虚幻实现的一套内存管理系统,即,程序员只管分配堆内存,释放内存交给智能指针
智能指针只针对于派生自UObject的类对象
智能指针库用以解决非UObject对象的内存管理
智能指针库全平台通用
示例原生C++类
class my_class
{
public:
int a,b;
my_class() = default;
my_class(int A, int B)
: a(A),
b(B)
{
}
};
共享指针(TSharedPtr)
默认线程安全
初始化
右值初始化
TSharedPtr<my_class> SharedPtr(new my_class(114, 514));
拷贝构造函数初始化
TSharedPtr<my_class> SharedPtr(new my_class(114, 514));
TSharedPtr SharedPtr2(SharedPtr);
虚幻方法初始化
TSharedPtr<my_class> SharedPtr3 = nullptr;
SharedPtr3 = MakeShareable(new my_class(119, 888));
常用函数
有效对象判断
SharedPtr.IsValid()
唯一指针判断
当前共享指针是否为唯一指向指针里的对象的指针
SharedPtr.IsUnique()
共享引用(TSharedRef)
初始化时必须指向一个有效的对象
初始化
TSharedRef<my_class> SharedRef(new my_class);
弱指针(TWeakPtr)
解决了循环引用,只对弱指针保留引用权但不参与引用计数
不能阻止对象被销毁,如果弱指针指向的对象被销毁,弱指针会自动清空
初始化
TSharedPtr<my_class> SharedPtr(new my_class);
TWeakPtr<my_class> WeakPtr(SharedPtr);