UE_C++ —— 数据类型

目录

一,基本数据类型

二,字符串类型

三,容器类型

四,向量及变换类型

五,枚举类型

六,类类型

七,其他类型


一,基本数据类型

        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,表示时间间隔;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值