【UE5随笔】01_基础类型与容器

本文介绍了虚幻引擎中的游戏模式类(MyGameMode)实现以及关键数据类型如基本类型、TArray、TMap和TSet的用法,包括它们的初始化、操作和应用场景。同时涵盖了字符串处理(FName和FText)和向量、旋转等数学结构(FVector、FRotator和FTransform)的使用,以及日志记录和屏幕输出的方法。
摘要由CSDN通过智能技术生成

1. 游戏模式类

MyGameMode.h

#pragma once

#include "CoreMinimal.h"

// 头文件必须放在这个位置,不能更改
#include "MyHUD.h"
#include "MyGameState.h"
#include "MyPawn.h"
#include "MyPlayerController.h"
#include "MyPlayerState.h"

#include "GameFramework/GameMode.h"
#include "MyGameMode.generated.h"

UCLASS()
class MYPROJECT_API AMyGameMode : public AGameMode
{
	GENERATED_BODY()
	AMyGameMode();
public:
	
	virtual void BeginPlay() override;
	virtual void Tick(float deltaTime) override;
	virtual void EndPlay(const EEndPlayReason::Type endPlayRes) override;
};

MyGameMode.cpp

#include "MyGameMode.h"

AMyGameMode::AMyGameMode() 
{
    DefaultPawnClass = AMyPawn::StaticClass();
    PlayerControllerClass = AMyPlayerController::StaticClass();
    GameStateClass = AMyGameState::StaticClass();
    PlayerStateClass = AMyPlayerState::StaticClass();
    HUDClass = AMyHUD::StaticClass();
}

void AMyGameMode::BeginPlay()
{
    Super::BeginPlay();
}

void AMyGameMode::Tick(float deltaTime)
{
    Super::Tick(deltaTime);
}

void AMyGameMode::EndPlay(const EEndPlayReason::Type endPlayRes)
{
    Super::EndPlay(endPlayRes);
}

2. 数据类型

2.1 基本类型

类 型含 义
bool基本的布尔类型,代表真(true)或假(false)的值。用于简单的条件和逻辑判断。
int3232位整数类型,用于存储标准整数值。它可以存储从-2,147,483,648到2,147,483,647的范围内的值。
int6464位整数类型,用于存储更大范围的整数值。它的范围大约在-9.22e18到9.22e18之间。
BYTE8位无符号整数类型,通常用于存储小的数值或数据字节。它的范围是0到255。
FString虚幻引擎的字符串类型,用于存储和操作文本。它是动态的,可以根据需要改变大小,并支持Unicode。
FName用于存储具有内部哈希值的字符串,优化了字符串的比较和查找速度。常用于标识符和资产名称。
FText用于处理本地化文本。它不仅存储字符串本身,还存储相关的本地化信息,以支持多语言环境。
FVector用于表示三维空间中的点或向量。它包含三个浮点数(X, Y, Z),用于表示空间中的位置或方向。
FRotator用于表示对象在三维空间中的旋转。它包含三个浮点数(Pitch, Yaw, Roll),分别表示绕X轴、Y轴和Z轴的旋转角度。
FTransform用于表示对象的位置、旋转和缩放。它结合了FVector(位置)、FRotator(旋转)和FVector(缩放)来定义对象在三维空间中的变换。

2.2 类型转换

string => name

FName name = FName(*str);

string => text

FText text = FText::FromString(str);

name => string

FString str = name.ToString();

text => string

FString str = text.ToString();

name => text

FText text = FText::FromName(name);

text => name

FName name = FName(*(text.ToString()));

3. 容器

3.1 TArray

TArray 是一个动态数组,类似于C++标准库中的 std::vector。提供了快速的随机访问和高效的内存管理,适用于需要动态大小和可以改变内容的数组场景。

1. 创建和初始化

TArray<int32> MyArray; // 创建一个空的TArray
TArray<int32> InitializedArray = {1, 2, 3, 4}; // 创建并初始化TArray

2. 添加元素

MyArray.Add(5); // 在数组末尾添加一个元素
MyArray.AddUnique(6); // 添加一个元素,如果该元素已存在,则不添加
MyArray.Append(InitializedArray); // 将另一个数组的内容添加到当前数组

3. 访问元素

int32 FirstElement = MyArray[0]; // 访问第一个元素
int32 LastElement = MyArray.Last(); // 访问最后一个元素

4. 修改元素

MyArray[0] = 10; // 修改第一个元素的值
MyArray.Insert(60, 0); // 在 0 位置插入 60

5. 删除元素

MyArray.RemoveAt(0); // 删除指定索引处的元素
MyArray.Remove(10); // 删除所有值为10的元素
MyArray.Empty(); // 清空整个数组

6. 数组大小和容量

int32 NumElements = MyArray.Num(); // 获取数组中元素的数量
MyArray.Reserve(100); // 为数组预留足够的空间以容纳100个元素

7. 查找元素

int32 Index = MyArray.IndexOfByKey(10); // 找到值为10的元素的索引
int32 Index = MyArray.Find(10); // 找到第一个值为10的元素的索引
int32 Index = MyArray.FindLast(10); // 找到最后一个值为10的元素的索引
bool bContains = MyArray.Contains(10); // 检查数组是否包含特定值

8. 迭代

// 1. 迭代器
for (auto iter = MyArray.CreateIterator(); iter; iter++) 
{
    int32 Value = *iter;
    // 对Value进行操作
}

// 2. 常量迭代器
for (auto iter = MyArray.CreateConstIterator(); iter; iter++) 
{
    int32 Value = *iter;
    // 对Value进行操作
}

// 3. 内置迭代方式
for (auto& Value : MyArray)
{
    // 对Value进行操作
}

Tips: 注意不是引用。

9. 排序

MyArray.Sort(); // 对数组进行排序

10. 使用Lambda表达式

MyArray.Sort([](const int32 A, const int32 B) 
{
    return A < B; // 自定义排序准则
});

3.2 TMap

TMap 是一个关联容器,类似于C++标准库中的 std::map 。它以键值对的形式存储元素,每个键都唯一对应一个值。

1. 创建和初始化

// 创建一个空的TMap
TMap<int32, FString> MyMap;

// 使用初始化列表创建TMap
TMap<int32, FString> InitializedMap = {{1, TEXT("One")}, {2, TEXT("Two")}, {3, TEXT("Three")}};

2. 添加元素

// 添加或更新键值对
MyMap.Add(4, TEXT("Four"));

// 另一种添加或更新的方式
MyMap[5] = TEXT("Five");

3. 访问元素

// 访问元素(确保键存在)
FString Value;

if (MyMap.Contains(1)) 
{
    Value = MyMap[1];
}

4. 删除元素

// 删除具有特定键的元素
MyMap.Remove(1);

// 清空整个TMap
MyMap.Empty();

5. 遍历元素

// 使用范围基于的for循环遍历
for (const auto& Pair : MyMap) 
{
    int32 Key = Pair.Key;
    FString Value = Pair.Value;
    // 对Key和Value进行操作
}

// 使用迭代器遍历
for (auto It = MyMap.CreateConstIterator(); It; ++It) 
{
    int32 Key = It->Key;
    FString Value = It->Value;
    // 对Key和Value进行操作
}

5. 查找元素

// 查找键对应的值
FString* FoundValue = MyMap.Find(2);

if (FoundValue) 
{
    // 对找到的值进行操作
}

6. 获取大小

// 获取TMap中的元素数量
int32 Size = MyMap.Num();

7. 特定条件的操作

// 过滤或查找满足特定条件的键值对
TMap<int32, FString> FilteredMap;
for (const auto& Pair : MyMap) 
{
    if (Pair.Key > 2) 
    {
        FilteredMap.Add(Pair.Key, Pair.Value);
    }
}

3.3 TSet

TSet 是一个集合容器,类似于C++标准库中的 std::set 。它用于存储唯一元素的集合,确保没有重复项。

1. 创建和初始化

// 创建一个空的TSet
TSet<int32> MySet;

// 使用初始化列表创建TSet
TSet<int32> InitializedSet = {1, 2, 3, 4, 5};

2. 添加元素

// 添加元素
MySet.Add(6);
MySet.Add(7);

3. 检查元素存在

// 检查元素是否存在
bool bExists = MySet.Contains(3);

4. 删除元素

// 删除元素
MySet.Remove(2);

// 清空整个TSet
MySet.Empty();

5. 遍历集合

// 使用for循环遍历
for (int32 Element : MySet) 
{
    // 对Element进行操作
}

// 使用迭代器遍历
for (auto It = MySet.CreateConstIterator(); It; ++It) 
{
    int32 Element = *It;
    // 对Element进行操作
}

6. 获取大小

// 获取TSet中的元素数量
int32 Size = MySet.Num();

7. 集合操作

// 两个TSet的并集
TSet<int32> OtherSet = {4, 5, 6, 7};
MySet.Append(OtherSet);

// 两个TSet的交集
MySet.Intersect(OtherSet);

// 两个TSet的差集
MySet.Difference(OtherSet);

8. 特定条件的操作

// 过滤或查找满足特定条件的元素
TSet<int32> FilteredSet;
for (int32 Element : MySet) 
{
    if (Element > 3) 
    {
        FilteredSet.Add(Element);
    }
}

4. 打印

4.1 日志打印

// 日志记录级别:Error > Warning > Display
UE_LOG(LogTemp, Error, TEXT("Hello starts Error"));
UE_LOG(LogTemp, Warning, TEXT("Hello starts Warning"));
UE_LOG(LogTemp, Display, TEXT("Hello starts Display"));

4.2 屏幕打印

// 打印到屏幕上
// 默认值,显示时间,显示的颜色,打印内容
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("Hello starts in Screen"));

4.3 格式化输出

int32 test = 1;

UE_LOG(LogTemp, Warning, TEXT("Hello starts Warning : %d"), test);

GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::Printf(TEXT("Hello starts in Screen : %d"), test));
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值