目录 - Table of contents
UEC++的基础变量类型
// 布尔类型变量声明
bool varBool;
// 整型32位的变量声明
int32 varInt32;
// 整型64位的变量声明
int64 varInt64;
// 字节类型的变量声明
BYTE varByte;
// String类型的变量声明字符串的类型
FString varString;
// Name名称类型的变量声明
FName varName;
// FText文本类型的变量声明
FText varText;
// FVector;向量类型的变量声明
FVector varVector;// 这个就是x轴,Y轴,Z轴的坐标
// FRotator旋转类型的变量声明
FRotator varRotator;// 这个就是x轴的旋转Ro1L,Y轴的旋转Pitch,Z轴的旋转Yam
// FTransform类型的变量声明
FTransform varTransform;// 这个就是既有FVector也有FRotator,还有缩放Scale三者的集合类型(一个齐次矩阵)
FString、FName、FText的区别
FString用于表示动态字符串。FString是一个标准的可变字符串类型,用于在运行时处理文本。它可以包含任意字符,并且可以修改和动态改变内容。
- 内存动态分配,适合在程序中频繁修改或拼接字符串。
- 支持Unicode字符,可以包含所有字符集。
- 适用于一般的文本处理,比如文件路径、用户输入等。
FName用于表示轻量级、不可变的字符串,通常用于标识符(如资源名称、对象标签、蓝图类名等)。FName是一种轻量的、高效的字符串表示方式,用于需要进行频繁比较的场景。
- FName在内存中是以唯一的索引形式存储,这使得它比FString更加高效。
- 它不可变,创建后不能修改。
- 用于存储需要快速比较的固定文本值,如物体的类型名称或命名空间。
FText用于表示本地化文本。FText是专门为支持多语言本地化而设计的字符串类型。它通常用于用户界面、错误消息等文本显示。
- 支持本地化和格式化,能够根据用户的语言设置显示不同的内容。
- 与FString不同,它不适合进行字符串拼接或处理,而是用于固定的、本地化的文本。
- 它会存储更多的信息来支持语言的切换,比如翻译和文本格式化。
相互转化
// 创建一个FString,TEXT()宏处理后的字符串可以方便地用于初始化FString对象或者与FString进行其他操作。
FString MyString = TEXT("I am string");
// FString转化成FName
FName MyName = FName(*MyString);
// FString转化成FText
FText MyText = FText::FromString(MyString);
// FName转化成FString
MyString = MyName.ToString();
// FName转化成FText
FText text1 = FText::FromName (MyName);
// FText转化成String
FString strFromText = text1.ToString();
// 注意这里FTEXT不能直按转化成FName,要转化成FString,然后再转化成FName
FName name1 = FName(*text1.ToString());
UEC++的容器TArray
TArray是UEC++中的动态数组。TArray特点:速度快,内存消耗小,安全性高。并且TArray所有元素均完全为相同类型,不能进行不同元素类型的混合。
// 声明
TArray<int32>MyArray;
// 增
MyArray.Add(1O);// 将元素添加到数组末尾
MyArray.Add(20);
MyArray.Add(30);
MyArray.AddUnique(20);// 数组中不存在的元素才会添加到我们的数组中这里就不会添加到数组中
MyArray.AddUnique(40);
// 遍历
void PrintArray()
{
for(auto It = MyArray.CreateConstIterator(); It; It++)
{
UE_LOG(LogTemp,Warning,TEXT("%d"),*It);
GEngine->AddScreenDebugMessage(-1, 5.0f, FColor::Blue, Fstring::Printf(TEXT("%d"), *It));
}
}
PrintArray();
// 删
MyArray.Remove(20);// 移除数组中所有等值的元素
MyArray.RemoveAt(0);// 移除数组中索引为0的元素
MyArray.RemoveSingle(10);// 移除首个匹配的元素
MyArray.Empty();// 清空数组中的所有元素,并将数组的大小设置为 0,同时释放底层的内存
MyArray.Reset();// 清空数组中的所有元素,并将数组的大小重置为 0,但保留分配的内存(不释放内存)
// 改
MyArray.Insert(60,0)// 在0号索引的位置插入值60
int32 &temp = MyArray[0];
temp = 50;// 利用引用修改0号索引的值
// 查
MyArray.Contains(10);// 查找数组中是否包含某元素
MyArray.Find(10);// 正向查找第一个匹配的元素的索引,返回该索引或-1
MyArray.FindLast(10);// 反向查找第一个匹配的元素的索引,返回该索引或-1
UEC++的容器TMap
TMap是一种键值对容器,里面的数据都是成对出现的(Key,Value),Value通过Key值来获取,且Key值不能重复,Key值唯一。
// 声明
TMap<int32, int32>MyMap;
// 增
MyMap.Emplace(0, 1);// 原地构造,不会额外创建临时变量进行复制
MyMap.Emplace(1, 2);
MyMap.Emplace(2, 3);
// 遍历
void PrintMap()
{
for(auto& TestMap : MyMap)
{
UE_LOG(LogTemp,Warning,TEXT("Key: %d" "Value: %d"), TestMap.Key, TestMap.Value);
GEngine->AddScreenDebugMessage(-1, 5.0f, FColor::Blue, Fstring::Printf(TEXT("Key: %d Value: %d"), TestMap.Key, TestMap.Value));
}
}
PrintMap();
// 删
MyArray.Remove(0);// 移除Key值为0的元素
MyArray.Empty();// 清空所有元素,同时释放底层的内存
// 查
MyMap.Contains(1);// 查找匹配的Key值是否存在,返回true或false
int32* isFind = MyMap.Find(6);// 返回一个指向值的指针,不存在返回nullptr
const int32* isFindKey = MyMap.FindKey(2);// 反向查找,其他和find一样
// 分别获取Keys和Values
TArray<int32> TestKeys;
TArray<int32> TestValues;
MyMap.GenerateKeyArray(TestKeys);
MyMap.GenerateValueArray(TestValues);
UEC++的容器TSet
TSet是一种快速容器类,(通常)用于在排序不重要的情况下存储唯一元素。TSet类似于TMap和TMultiMap,但有一个重要区别:TSet是通过对元素求值的可覆盖函数,使用数据值本身作为键,而不是将数据值与独立的键相关联。TSet可以非常快速地添加、查找和删除元素(恒定时间),TSt也是值类型,支持常规复制、赋值和析构函数操作,以及其元素较强的所有权。
// 声明
TSet<FString>MySet;
// 增
MySet.Add(TXET("Banana"));
MySet.Add(TXET("Grapefruit"));
MySet.Add(TXET("Pine"));
MySet.Emplace(TXET("Orange"));
// 遍历
void PrintSet()
{
for(auto& TestSet : MySet)
{
UE_LOG(LogTemp,Warning,TEXT("%s"), *TestSet);
// FString::Printf按照指定的格式化字符串以及后面提供的参数来格式化生成一个新的 FString 对象
GEngine->AddScreenDebugMessage(-1, 5.0f, FColor::Blue, Fstring::Printf(TEXT("%s"), *TestSet));
}
}
PrintSet();
// 合并元素
TSet<FString>NewMySet;
NewMySet.Add(TEXT("zhangsan"))
NewMySet.Add(TEXT("lisi"))
NewMySet.Add(TEXT("wangwu"))
MySet.Append(NewMySet);// 将NewMySet的值合并到MySet里面
// 移除元素
MySet.Remove(TEXT("banana"));// 会返回已删除元素的数量,如果未包含给定的删除值返回0
MySet.Empty();// 清空容器,删除内存
MySet.Reset();// 清空容器,保留内存
// 查找元素
int32 cnt = MySet.Num();// 查询集合中保存的元素数量,返回一个整型值
bool isFind1 = MySet.Contains(TEXT("Banana"));// 查询是否包含特定元素,有返回真,否则为假
FString* isFind2 = MySet.Find(TEXT("Banana"));// 返回指向元素数值的指针,不包含返回nullptr
// Array函数
TArray<FString> FruitArray = MySet.Array();// 函数会返回一个TArray,其中填充了TSet中每个元素的副本
// 排序
TSet<FString>TestSet = {TEXT("a"), TEXT("aa"), TEXT("aaa"), TEXT("aaaa")};
TestSet.Sort([](FString A, FString B){return A.Len() > B.Len();});
// 运算符 =
TSet<FString>NewSet;
NewSet = MySet;// 将MySet里面的值赋值给NewSet
NewSet.Add(TEXT("OneOne"))
// 运算符[]
FSetElementId Index = NewSet.Add(TEXT("Twotwo"));// 根据FSetElementId访问集合对应的元素
TestSet[Index] = TEXT("One")
// Reserve
TSet<FString>NewSet1;
NewSet1.Reserve(10);// 预先分配内存,若分配内存多会产生闲置内存(Slack)
// Shrink
for(int32 i = 0; i < 8; ++i)
{
NewSet1.Add(FString::Printf(TEXT("NewSet%d"),i));// 添加元素
}
for(int32 i = 0; i < 10; i += 2)
{
NewSet1.Remove(FSetElementId::FromInteger(i));// 删除元素产生闲置内存
}
NewSet1.Shrink();// 删除末端的空元素
// Compact将容器中的空白元素集合到一起放到末尾
NewSet1.Compact();// 注意Compact可能会改变元素之间的顺序,如果不想改变,可以使用CompactStable()
NewSet1.Shrink();
UEC++基础数据类型输出打印
int32 MyInt = 10;
float MyFloat = 5.0f;
bool MyBool = true;
char MyChar = 'A';
FString MyString = TEXT("MyString");
FVector MyVector = FVector(0, 0, 0);
UE_LOG(LogTemp, Warning, TEXT("%d"), MyInt);
UE_LOG(LogTemp, Warning, TEXT("%f"), MyFloat);
UE_LOG(LogTemp, Warning, TEXT("%c"), MyChar);
UE_LOG(LogTemp, Warning, TEXT("%s"), *MyString);
UE_LOG(LogTemp, Warning, TEXT("%s"), *MyVector.ToString());