原视频地址:
【虚幻5】UE5C++零基础全网全流程开发从入门到进阶教程合集(持续跟新中)_哔哩哔哩_bilibili
目录
FString、FName、FText区别和相互之间怎么转换
UE5中常用的宏,UE5中的反射机制
C++中并没有反射机制的存在,但是在UE5中集成了一套反射系统。
UE5中的反射机制通过C++宏定义的方式实现,不需要理解是怎么实现的。
只需要知道,为了让UE5识别到我们声明的类,结构体,属性和方法,我们需要告诉我们的UE5编辑器,我们是怎么声明的,声明的是什么。
UCLASS()
UCLASS()//声明UE5中的类
class MyClass(){}
UGENERATED_BODY()
在UE5中,还存在另一个类似的宏GENERATED_UCLASS_BODY()
。它们的主要区别在于对父类构造函数的处理方式。GENERATED_BODY()
表示不直接使用父类的构造函数,而GENERATED_UCLASS_BODY()
则表示使用父类的构造,并且会自动生成带有特定参数的构造函数。此外,GENERATED_UCLASS_BODY()
之后的成员变量和成员函数默认是公开的(public)。
UCLASS()//声明UE5中的类
class MyClass(){
GENERATED_BODY()
GENERATED_UCLASS_BODY()
}
UPROPERTY()
在UE5(Unreal Engine 5)中,UPROPERTY()
宏是一种非常重要的特性,它用于定义C++类中的属性,并将这些属性暴露给Unreal Editor和蓝图系统。通过UPROPERTY()
宏,开发者可以控制属性的可见性、可编辑性、类别分组、元数据(如别名、编辑条件、提示信息等)以及其他高级功能。
常见的属性说明符
VisibleDefaultsOnly
:仅在类的默认设置下可见。VisibleInstanceOnly
:仅在实例化细节面板中可见。VisibleAnywhere
:在类的默认设置和实例化细节面板中都可见。EditDefaultsOnly
:仅在类的默认设置中可编辑。EditInstanceOnly
:仅在实例化细节面板中可编辑。EditAnywhere
:在类的默认设置和实例化细节面板中都可编辑。BlueprintReadOnly
:在蓝图中只读。BlueprintReadWrite
:在蓝图中可读可写。
常见的元数据说明符
Category
:用于在编辑器中将属性分组到指定的类别下。DisplayName
:为属性设置一个别名,用于在编辑器中显示。EditCondition
:定义一个条件,只有当条件为真时,属性才可以在编辑器中被编辑,一般指向一个bool类型的属性名。ToolTip
:为属性提供一个提示信息,当鼠标悬停在属性上时显示。
注意事项
- 在使用
UPROPERTY()
宏时,要确保你的类是从UObject
或其子类派生的,因为UPROPERTY()
是UE5反射系统的一部分,它依赖于UE5的UObject架构。
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="MyCategory")
int32 MyInt;
UFUNCTION()
常见的属性说明符
VisibleDefaultsOnly
:仅在类的默认设置下可见。VisibleInstanceOnly
:仅在实例化细节面板中可见。VisibleAnywhere
:在类的默认设置和实例化细节面板中都可见。EditDefaultsOnly
:仅在类的默认设置中可编辑。EditInstanceOnly
:仅在实例化细节面板中可编辑。EditAnywhere
:在类的默认设置和实例化细节面板中都可编辑。BlueprintReadOnly
:在蓝图中只读。-
BlueprintReadWrite
:在蓝图中可读可写。
常见的元数据说明符
Category
:用于在编辑器中将属性分组到指定的类别下。DisplayName
:为属性设置一个别名,用于在编辑器中显示。EditCondition
:定义一个条件,只有当条件为真时,属性才可以在编辑器中被编辑。ToolTip
:为属性提供一个提示信息,当鼠标悬停在属性上时显示。
UFUNCTION(BlueprintCallable, Category="MyCategory")
void MyFunction();
USTRUCT()
USTRUCT()
宏通常放在结构体的定义之前,用于指定该结构体的一些元数据和特性。
常见的参数
BlueprintType
:允许这个结构体在蓝图中被使用。Blueprintable
:与BlueprintType
类似,但通常用于更复杂的场景,比如当结构体需要被用作蓝图函数的参数或返回值时。Meta = (SomeMetaData="Value")
:允许为结构体添加自定义的元数据,这些元数据可以在编辑器或代码中通过反射系统访问。
注意事项
- 只有当结构体需要与Unreal Engine的反射系统、编辑器或蓝图系统交互时,才需要使用
USTRUCT()
宏。对于简单的数据容器,普通的C++结构体可能就足够了。 - 使用
USTRUCT()
宏定义的结构体必须包含GENERATED_BODY()
宏,这是Unreal Engine反射系统生成代码所必需的。 - 结构体中的成员变量如果想要在编辑器中可见、可编辑或在蓝图中可用,也需要使用
UPROPERTY()
宏进行定义。 - 结构体不能包含非静态的引用成员或指向非UObject派生类的指针,因为这些类型无法被Unreal Engine的序列化系统正确处理。
USTRUCT(BlueprintType)
struct FMyStruct
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 MyInt;
// 其他成员变量和函数...
};
UENUM()
UENUM()
宏通常放在枚举类型的定义之前,并指定一个命名空间(Namespace),这个命名空间有助于避免不同枚举类型之间的命名冲突。枚举类型的每个值都可以通过UENUM()
宏指定的命名空间来唯一标识。
常见的参数
BlueprintType
:允许这个枚举类型在蓝图中被使用。Meta = (SomeMetaData="Value")
:允许为枚举类型或其值添加自定义的元数据,这些元数据可以在编辑器或代码中通过反射系统访问。
注意事项
- 枚举类型必须使用
enum class
或enum
(但在UE4和UE5中推荐使用enum class
以获得更好的类型安全性)来定义。 - 枚举值默认从0开始递增,但你也可以显式地为它们指定整数值。
- 枚举类型可以包含
ValueCount
这样的特殊值,用于表示枚举中值的数量,但这并不是必需的,并且需要手动维护其值。 - 枚举类型定义中的
UENUM()
宏和枚举值本身都需要放在头文件中,以便在需要的地方包含和使用它们。
//第一种实现方式
UENUM(BlueprintType)
enum class EMyEnum : uint8
{
Value1,
Value2,
Value3,
// 如果有需要,可以继续添加更多的值
ValueCount // 通常用作枚举的最后一个值,表示枚举中值的数量(可选)
};
//声明我们自定义的Enum
UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="MyEnum")
EMyEnum MyEnum1;
//=============================================================
//第二种实现方式
UENUM()
namespace MyEnumType{
enum MyCustomEnum{
Type1,
Type2,
Type3
};
}
//声明我们自定义的Enum
UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="MyEnum")
TEnumAsByte<MyEnumType::MyCustomEnum> CustomEnum1;
UE5的基础游戏架构
打开世界场景设置
在右下角面板打开世界场景设置,在这里可以重载我们的游戏模式,游戏模式包含下面几个类别。
在UE5(Unreal Engine 5)中,GameMode、DefaultPawn、HUD、PlayerController、GameState以及PlayerState是构成游戏逻辑和玩家交互的核心组件,它们之间存在着紧密的关系。
创建GameModeBase类并命名为MyGameModeBase
然后按照上面的方式分别创建我们的DefaultPawnClass,HUDClass,PlayerControllerClass,GameStateClass,PlayerStateClass。
在MyGameModeBase头文件中包含我们创建的所有组件的头文件,并声明构造函数
#pragma once
#include "MyDefaultPawn.h"
#include "MyHUD.h"
#include "MyPlayerController.h"
#include "MyPlayerState.h"
#include "MyGameState.h"
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "MyGameModeBase.generated.h"
UCLASS()
class PROJECT002_API AMyGameModeBase : public AGameModeBase
{
GENERATED_BODY()
AMyGameModeBase();
};
并在构造函数的实现中绑定我们其他的游戏组件。
#include "MyGameModeBase.h"
AMyGameModeBase::AMyGameModeBase()
{
DefaultPawnClass = AMyDefaultPawn::StaticClass();
HUDClass = AMyHUD::StaticClass();
PlayerControllerClass = AMyPlayerController::StaticClass();
PlayerStateClass = AMyPlayerState::StaticClass();
GameStateClass = AGameState::StaticClass();
}
编译我们的C++文件,并进行测试
在游戏模式重载的选项框中搜索我们自定义的游戏模式
选择完后,所有的游戏组件替换为我们自定义的组件类
认识BeginPlay,Tick,EndPlay函数
UE5的日志输出
UE5的基础变量类型
UE5的基础变量的打印
FString、FName、FText区别和相互之间怎么转换
容器TArray的用法
容器TMap的用法
TMap的Key是不可以重复的,emplace(1,value1),emplace(1,value2),后面添加的value2会覆盖前面的value1,和C++内置的Map一样。