目录
一,基本数据类型
UE对C++基本数据类型进行了深度重定义,并禁止使用原生的C++基本数据类型,以保证引擎的跨平台特性;
布尔类型(bool),代表布尔值,即true或false;
字符类型(TCHAR),代表字符型,用于支持宽字符(如Unicode字符集),以保证跨平台兼容性;
短整形(short),2个字节;
无符号和有符号整数类型
- int,标准整形,根据系统架构(32位或64位)的不同,其大小可能有所不同(32位4字节、64位8字节);
- uint8(1字节)、uint16(2字节)、uint32(4字节)、uint64(8字节)
- int8(1字节)、int16(2字节)、int32(4字节)、int64(8字节)
长整形(long),4个字节;
长长整形(long long),8个字节;
浮点类型
- float(单精度浮点型,4字节),在值后加f以提升效率和精度,如3.14f;
- double(双精度浮点型,8字节);
二,字符串类型
FString,动态字符数组;
- 用于存储可变的字符串,必须用TEXT宏包裹字符串;
- 开销大于其他类字符串类型,是处理字符串的主要类型;
- 适用于存储临时数据,如文件路径、日志信息、调试文本、配置文件内容等;
FName,资源命名字符串;
- 存储不可变的字符串,必须用TEXT宏包裹字符串;
- 相对轻量级的字符串类型,散列存储,速度快;
- 大小通常为8byte,只进行一次字符串哈希映射,在比较字符串时不区分大小写且只读;
- 主要用于表示引擎中的名称,如对象名、资源名、类名等,以提高性能;
FText,支持本地化的文本字符串;
- 不可变,不提供修改函数,无法进行内容修改;
- 处理用户的显式文本,提供了对字符串进行格式化、本地化等操作的功能;
- 提供了对文本的多语言支持,可以根据不同的语言和文化设置提供不同的显示内容;
- 大小为40bytes,核心实质是一个TSharedRef<ITextData>,即实际文本数据的智能引用;拷贝成本非常低,只需拷贝指针而不是整个字符串数据;
- 主要用于用户界面(UI)上显示的文本,如对话框、按钮文字、任务提示等需要翻译的文本;
//FString类
//构造与赋值
FString str1; // 创建一个空的FString对象
FString str2(TEXT("Hello")); // 使用TEXT宏创建一个包含"Hello"的FString对象
FString str3 = str2; // 通过拷贝构造函数赋值
FString str4 = TEXT("World"); // 直接使用TEXT宏进行赋值
//追加
FString str = TEXT("Hello, ");
str.Append(TEXT("World!")); // 使用Append函数追加字符串,结果str为"Hello, World!"
str += TEXT(" Again!"); // 使用+=运算符追加字符串,结果str为"Hello, World! Again!"
//插入
FString str = TEXT("Hello");
str.InsertAt(5, TEXT(" World")); // 在索引5的位置插入字符串" World",结果str为"Hello World"
//替换
FString str = TEXT("Hello World");
str = str.Replace(TEXT("World"), TEXT("UE")); // 将"World"替换为"UE",结果str为"Hello UE"
//查询
FString str = TEXT("Hello World");
bool containsHello = str.Contains(TEXT("Hello")); // 判断是否包含子字符串"Hello",结果为true
int32 index = str.Find(TEXT("World")); // 查找子字符串"World"的索引,结果为6
bool startsWithHello = str.StartsWith(TEXT("Hello")); // 判断是否以"Hello"开头,结果为true
bool endsWithWorld = str.EndsWith(TEXT("World")); // 判断是否以"World"结尾,结果为true
//格式化
FString playerName = TEXT("John");
FString greeting = FString::Printf(TEXT("Hello, %s!"), *playerName); // 使用Printf函数格式化字符串,结果greeting为"Hello, John!"
//路径拼接
FString basePath = TEXT("C:/Users/Documents/");
FString fileName = TEXT("example.txt");
FString fullPath = basePath / fileName; // 使用/运算符进行路径拼接,结果fullPath为"C:/Users/Documents/example.txt"
FString fullPath;
fullPath.PathAppend(fileName, TEXT("example.txt").Length()); // 将文件名追加到基路径上,注意需要传递文件名的长度
//FName
//创建
FName myFName(TEXT("MyObjectName"));
//比较
if (myFName == FName(TEXT("MyObjectName")));
//FText
FText myText = TEXT("Hello, World!");
FText formattedText = FText::Format(TEXT("Hello, {0}!"), TEXT("World"));
三,容器类型
TArray<T>,UE定义的增强数组容器;
- 是一个同质容器,即其所有元素均完全为相同类型;
- 与std::vector类似,可动态扩充内存;当容量满了,会额外分配一个更大的内存,并将数据拷到新内存上,之后再释放旧的内存;
- 提供了比标准C++数组更丰富的功能,如动态扩展、排序、查找等;
- 具有速度快、内存消耗小、安全性高等特点;
TSet<T>,存储值本身的松散的集合;
- 默认不允许元素重复,存储唯一元素;
- 基于哈希表实现,提供了快速的查找、插入和删除操作;
- UE使用两个数组HashArray和ElementArray来实现TSet(HashArray中存放着ElementArray的Index,而ElementArray中存放着具体的值),使用拉链法解决冲突;
TMap<k, T>,key-value类型容器;
- 允许通过键来快速查找对应的值,适用于需要快速访问数据的场景;
- 基于哈希表实现,提供了高效的查找性能;
- 键必须是唯一的,而值可以是任何类型;
//TArray
#include "Containers/Array.h"
TArray<int32> IntArray; //初始化一个空的TArray
//添加元素
IntArray.Add(10);
IntArray.Add(20);
IntArray.Add(30);
IntArray.AddUnique(30);
//使用索引访问元素
UE_LOG(LogTemp, Warning, TEXT("Element at index 1: %d"), IntArray[1]); //输出: Element at index 1: 20
//使用范围for循环迭代元素
for (int32 i : IntArray)
{
UE_LOG(LogTemp, Warning, TEXT("Element: %d"), i);
}
IntArray.RemoveAt(1); //移除索引为1的元素,即20
IntArray.Empty(); //清空数组
//TSet
#include "Containers/Set.h"
TSet<int32> IntSet; //声明一个存储int32的TSet
TSet<FString> StringSet = { TEXT("Hello"), TEXT("World") }; //使用初始化列表
IntSet.Add(10);
IntSet.Add(20);
IntSet.Add(10); //这个不会被添加,因为10已经存在
IntSet.Contains(20); //检查TSet中是否包含某个元素
IntSet.Remove(10);
IntSet.Empty();
//TMap
#include "Containers/Map.h"
TMap<FString, int32> StringToIntMap; // 声明一个存储FString到int32映射的TMap
// 初始化通常是通过Add方法
StringToIntMap.Add(TEXT("One"), 1);
StringToIntMap.Add(TEXT("Two"), 2);
StringToIntMap.Add(TEXT("Three"), 3);
StringToIntMap.Add(TEXT("One"), 10); // 这会覆盖键为"One"的值,新的值为10
//查找元素
if (StringToIntMap.Contains(TEXT("Two")))
{
int32 value = StringToIntMap[TEXT("Two")]; // 更常见的查找方式,但如果键不存在会触发断言(在开发构建中)
// 或者使用Find来避免断言
int32* valuePtr = StringToIntMap.Find(TEXT("Two"));
if (valuePtr)
{
int32 value = *valuePtr;
}
}
StringToIntMap.Remove(TEXT("One"));
StringToIntMap.Empty();
四,向量及变换类型
FVector,表示3D空间点、向量等的三维向量类型,包含三个浮点数分量:X、Y和Z;
- 常用于表示对象的位置、方向、速度等;
- 支持向量的基本运算,如加法、减法、点积、叉积等;
- 可以方便地转换为其他数学类型,如四元数(FQuat)和矩阵(FMatrix);
FRotator,表示3D旋转的三维向量类型,包含三个浮点数Pitch、Yaw、Roll(以角度为单位存储);
- Pitch表示绕右轴(Y轴)旋转的角度,上下(0=正前方,+向上,-向下)的旋转;
- Yaw表示绕上轴(Z轴)旋转的角度,绕圈(0=东,+北,-南)
- Roll表示绕前向轴(X轴)旋转的角度,歪着头(0=正直,+顺时针旋转,-逆时针旋转);
- 可以转换为四元数(FQuat)以进行更高效的旋转计算;
FTransform,更高级别的矩阵类型,包含三个矩阵:Rotation(旋转)、Translation(平移)和Scale3D(缩放);
- 广泛用于表示对象在3D空间中的位置和变换;
- 支持矩阵的基本运算,如乘法、逆运算等;
- 可以方便地转换为其他数学类型,如四元数(FQuat)和向量(FVector);
FVector Location(10.0f, 20.0f, 30.0f);
FRotator Rotation(0.0f, 45.0f, 0.0f);
FTransform Transform(FVector(10.0f, 20.0f, 30.0f), FRotator(0.0f, 45.0f, 0.0f), FVector(1.0f, 1.0f, 1.0f));
五,枚举类型
enum,使用 enum
关键字定义枚举类型;
enum class EMyEnum
{
Value1,
Value2,
Value3
};
EMyEnum MyEnumValue = EMyEnum::Value1;
六,类类型
UObject
,UE 中大多数对象的基类,提供了反射、序列化和垃圾回收等功能;
AActor
,表示游戏中的角色或对象,可放置在游戏世界中;
UActorComponent
,可附加到AActor
上的组件,用于扩展AActor
的功能;
七,其他类型
FDateTime
,用于表示日期和时间;
FTimespan
,表示时间间隔;