1.UE5中基础的概念

   原视频地址:

【虚幻5】UE5C++零基础全网全流程开发从入门到进阶教程合集(持续跟新中)_哔哩哔哩_bilibili

目录

UE5中常用的宏,UE5中的反射机制

UCLASS()

UGENERATED_BODY()

UPROPERTY()

UFUNCTION()

USTRUCT()

UENUM()

UE5的基础游戏架构

认识BeginPlay,Tick,EndPlay函数

UE5的日志输出

UE5的基础变量类型

UE5的基础变量的打印

FString、FName、FText区别和相互之间怎么转换

容器TArray的用法

容器TMap的用法

容器TSet的用法


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 classenum(但在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一样。

容器TSet的用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值