TArray
官方文档:Array Containers in Unreal Engine | 虚幻引擎 5.4 文档 | Epic Developer Community (epicgames.com)
TArray是虚幻引擎中最简单的容器类,其底层是动态数组。
TArray、TMap、TSet三者都被称为同质容器(其所有元素均完全为相同类型)
注意:勿使用 新建(new) 和 删除(delete) 创建或销毁 TArray 实例
TArray文件位于core->Public->Containers->Array.h(动态数组模板)
1.1创建和填充数组
1.1.1填充TArray的方法——Init函数
使用 Init
函数,将大量元素副本填入数组。
先创建Actor类(具体步骤省略)
Actor类头文件增添代码:
public:
UFUNCTION(BlueprintCallable)//暴露给蓝图
void InitIntArray();
UFUNCTION(BlueprintCallable)//暴露给蓝图
void AddStrIntArray();
源文件函数代码:
void Actor::InitIntArray()
{
TArray<int32> IntArray1;//创建数组将以此定义
TArray<int32> IntArray2;
//声明int32接收数组元素以及其所占据的大小
int32 ArrayNum=IntArray1.Num();
int32 ArraySize=InteArray1.GatAllocatedSize();
//对数组简单初始化
IntArray1.Init(10, 5);//IntArray1 == [10,10,10,10,10]
IntArray2={1,2,3,4,5,6};
//再次获取
ArrayNum=IntArray1.Num();
ArraySize=InteArray1.GatAllocatedSize();
}
void Actor::AddStrIntArray()//创建新函数在数组增加元素
{
TArray<FString> StrArr;//声明String类型的Arr
StrArr.Add (TEXT("Hello"));
StrArr.Emplace(TEXT("World"));
}
int32是占4个字节整形数值
Add
和 Emplace
函数的多数效果相同,细微区别在于:
Add
(或Push
)将元素类型的实例复制(或移动)到数组中。Emplace
使用给定参数构建元素类型的新实例。
在 TArray<FString>
中,Add
将用字符串文字创建临时 FString
,然后将该临时 FString
的内容移至容器内的新 FString
中;而 Emplace
将用字符串文字直接新建 FString
。最终结果相同,但 Emplace
可避免创建临时文件。对于 FString
等非浅显数值类型而言,临时文件通常有害无益(增加性能损耗)。
总而言之Emplace
的效率始终高于 Add
,但 Add
的可读性可能更好。
注意:在VS编辑器中用DebugGame Editor方式启动测试,不要用Development启动则变量会被优化无法查看。
1.1.2填充TArray的方法——Add和Emplace函数
Add
和 Emplace
函数用于在数组末尾新建对象
接着上面的头文件:
//先创建一个结构体
USTRUCT()
STRUCT NameAddStructInfo
{
GENERATED_BODY()
public:
NameAddStructInfo()
{
UE_LOG(LogTemp,Warning,TEXT("被初始化了1"));//打印日志用于测试
}
NameAddStructInfo(int32 InHealth):Healty(InHealth)
{
UE_LOG(LogTemp,Warning,TEXT("被初始化了2"));//打印日志用于测试
}
~NameAddStructInfo()
{
UE_LOG(LogTemp,Warning,TEXT("被释放了"));//打印日志用于测试
}
int32 Healty=100;
};
Actor类头文件增添代码:
public:
UFUNCTION(BlueprintCallable)//暴露给蓝图
void AddStructArray();
UFUNCTION(BlueprintCallable)//暴露给蓝图
void EmplaceStructArray();
TArray<NameAddStructInfo> StructArray;//把数组声明到对象里面
源文件函数代码:
void Actor::AddStructArray()
{
StructArray.Add(150);
}
void Actor::EmplaceStructArray()
{
StructArray.Emplace(200);
}
由日志结果可知Add函数构建了临时对象,在前一步过程完成后移动或拷贝到StructArray里面,然后临时对象被释放了。而Emplace函数是直接构建对象到StructArray里面,直到游戏结束时才被释放。
1.1.3填充TArray的方法——Append
利用 Append
可一次性添加其他 TArray
中的多个元素,或者指向常规C数组的指针及该数组的大小(一般用来字符串的拼接)
Actor类头文件增添代码:
public:
UFUNCTION(BlueprintCallable)//暴露给蓝图
TArray<FString> AppendStrArray()
源文件函数代码:
TArray<FString> Actor::AppendStrArray()
{
FString Arr[] = { TEXT("of"), TEXT("Tomorrow") };
TArray<FString>StrArr;
StrArr.Append(Arr, UE_ARRAY_COUNT(Arr));
//注意输出先后顺序
StrArr.Add (TEXT("Hello"));
StrArr.Emplace(TEXT("World"));
// StrArr == ["Hello","World","of","Tomorrow"]
return StrArr;
}
1.1.4填充TArray的方法——AddUnique
仅在尚不存在等值元素时,AddUnique
才会向容器添加新元素。(一般用在重复性情况下)
Actor类头文件增添代码:
public:
UFUNCTION(BlueprintCallable)//暴露给蓝图
void AddUniqueString();
源文件函数代码:
void Actor::AddUniqueString()
{
TArray<FString>StrArr=AppendStrArray();//此做法会产生耦合
StrArr.AddUnique(TEXT("!"));
// StrArr == ["Hello","World","of","Tomorrow","!"]
StrArr.AddUnique(TEXT("!"));
// StrArr is unchanged as "!" is already an element
}
1.1.5填充TArray的方法——Insert
Insert
将在给定索引处添加单个元素或元素数组的副本(给定位置具体插入)
Actor类头文件增添代码:
public:
UFUNCTION(BlueprintCallable)//暴露给蓝图
void InsertString();
源文件函数代码 :
void Actor::InsertString()
{
TArray