UE5入门学习笔记(四)——C++学习记录

学习视频:https://www.bilibili.com/video/BV1ne4y1P7sh/
参考文章:https://zhuanlan.zhihu.com/p/656902478/

命名关系
● 派生自 Actor 带有 A 前缀,如 AController
● 派生自 Object 带有 U 前缀,如 UComponent
● Enums 的前缀是 E,如 EFortificationType
● Interface 的前缀是 I,如 IAbilitySystemInterface
● Template 的前缀是 T,如 TArray
● 派生自 SWidget 的类(Slate UI)带有前缀 S,如 SButton
● 其它类(结构)的前缀为字母 F,如 FVector

0、创建一个继承自Actor的类。

CoreMinimal.h 定义了一些基本类型、常量和日志工具
GameFramework/Actor.h Actor类头文件
xxxxx.generated.h 自动生成的头文件,包含类的元信息,必须放在include列表的最下面
宏:
UCLASS()
xxxxx_API
GENERATED_BODY()
函数:
BeginPlay() //Actor生成时调用一次
Tick(float DeltaTime) //每帧调用,DeltaTime为与上一帧的时间差
成员对象:
PrimaryActorTick.bCanEverTick //默认为true,意为使Tick函数每帧调用
Super //父类的别名,这里等同于AActor

1、UE_LOG宏

UE_LOG(LogTemp, Display, TEXT(“Hello Unreal !”));
LogTemp:日志记录类别名称,这里是临时类别
Display:日志记录级别,常用的为Display、Warning、Error
TEXT(“Hello Unreal !”):输出内容,字符串需要用TEXT()附加宏,TEXT()是将字符串转为宽字符,查看源码可知最终是用了L前缀

需要带参数则使用格式化占位符:
UE_LOG(LogTemp, Display, TEXT(“Num1 : %d Num2 : %f”), num1, num2);

2、FString

创建自定义日志记录类别名称:
DEFINE_LOG_CATEGORY_STATIC(LogBaseGeometry, All, All) //此类别仅在当前cpp文件中有效
LogBaseGeometry:自定义日志记录类别名称
All:默认启用的最大日志记录级别(DefaultVerbosity)
All:编译时候支持的最大日志记录级别(CompileTimeVerbosity)
日志记录级别从低到高有NoLogging、Fatal、Error、Warning、Display、Log、Verbose、All(VeryVerbose)
编译时如果DefaultVerbosity甚至大于CompileTimeVerbosity,这个日志就不会被编译进代码,运行时就不存在这个日志

FString Name = “John”;
UE_LOG(LogBaseGeometry, Display, TEXT(“Name : %s”), *Name); //需要加星号
FString IntStr = "IntStr : " + FString::FromInt(IntNum);
FString FloatStr = “FloatStr : " + FString::SanitizeFloat(FloatNum);
FString BoolStr = “BoolStr : " + FString(BoolValue ? “true” : “false”);
FString InfoStr = FString::Printf(TEXT(”%s %s %s”), *IntStr, *FloatStr, *BoolStr);

在屏幕上打印信息:
#include “Engine/Engine.h”
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Orange, InfoStr, true, FVector2D(1.5f, 1.5f));
-1:唯一消息键。Key为-1时,添加新的消息,不会覆盖原有消息(此时bNewerOnTop有效,直接添加到队列最上层),Key不为-1时,则更新原有消息
5.0f:消息在屏幕上的持续时间
FColor::Orange:消息的颜色
InfoStr:消息内容
true:新消息是否添加到队列最上层,默认为true
FVector2D(1.5f, 1.5f):文本缩放比例

3、UPROPERTY宏

使能够在编辑器的查看修改成员变量:
UPROPERTY(EditAnywhere, Category = “MOVEMENT”)
float Amplitude = 50.0f;
UPROPERTY(EditAnywhere)
float Frequency = 2.0f;
EditAnywhere:访问说明符,有BlueprintReadWrite、BlueprintReadOnly、EditAnywhere 可在任何地方编辑、VisibleAnywhere 任何地方可见、EditInstanceOnly 只可在实例上编辑、VisibleInstanceOnly 只可在实例上查看、EditDefaultsOnly 只可在原型中编辑、VisibleDefaultsOnly 只可在原型中编辑
Category:分类,设为同一名称的成员变量,在编辑器中会放在此名称的栏目下

获得Actor对象的名称:
GetName();

4、组件Transform

添加一个静态网格成员对象:
#include “Components/StaticMeshComponent.h”
UStaticMeshComponent* _BaseMesh = nullptr;
_BaseMesh = CreateDefaultSubobject(“BaseMesh”);
SetRootComponent(_BaseMesh);

获取Actor的变换对象:
FTransform Transform = GetActorTransform();
FVector Location = Transform.GetLocation();
FRotator Rotation = Transform.Rotator();
FVector Scale = Transform.GetScale3D();

转为字符串:
Location.ToString();
Rotation.ToString();
Scale.ToString();
Transform.ToHumanReadableString();

使Actor以正弦函数上下移动:
//BeginPlay
FVector InitialLocation = GetActorLocation();
//Tick
FVector CurrentLocation = GetActorLocation();
float time = GetWorld()->GetTimeSeconds();
CurrentLocation.Z = InitialLocation.Z + GeometryData.Amplitude * FMath::Sin(GeometryData.Frequency * time);
SetActorLocation(CurrentLocation);

5、USTRUCT、UENUM宏

UENUM(BlueprintType)
enum class EMovementType : uint8
{
	SIN UMETA(DisplayName = "Move"),
	STATIC UMETA(DisplayName = "NoMove")
};
USTRUCT(BlueprintType)
struct FGeometryData
{
	GENERATED_USTRUCT_BODY()

	UPROPERTY(EditAnywhere, Category = "MOVEMENT")
	float Amplitude = 50.0f;
	UPROPERTY(EditAnywhere, Category = "MOVEMENT")
	float Frequency = 2.0f;
	UPROPERTY(EditAnywhere, Category = "MOVEMENT")
	EMovementType MoveType = EMovementType::STATIC;
};

UENUM:定义带反射枚举
USTRUCT:定义带反射结构体
BlueprintType:蓝图可用
UMETA:设定变量在编辑器中的别名
GENERATED_USTRUCT_BODY:生成反射数据使蓝图可见

6、材质

UMaterialInstanceDynamic* DynamicMaterial = _BaseMesh->CreateAndSetMaterialInstanceDynamic(0);
DynamicMaterial->SetVectorParameterValue(“Param”, FLinearColor::Red);
0:材质索引
“Param”:材质中的自定义参数名称
FLinearColor::Red:颜色,使用FLinearColor::MakeRandomColor()可以生成随机颜色,Color.ToString()转为字符串

7、定时器

#include “TimerManager.h”
FTimerHandle TimerHandle;
GetWorldTimerManager().SetTimer(TimerHandle, this, &ABaseGeometryActor::OnTimerFired, TimerRate, true); //清除定时器ClearTimer(TimerHandle)
TimerHandle:定时器句柄
this:回调函数所属对象指针
&ABaseGeometryActor::OnTimerFired:回调函数地址
TimerRate:定时器时间
true:是否循环

8、生成Actor

//在编辑器中会自动筛选出模板传入的主类、继承类以及蓝图类
UPROPERTY(EditAnywhere)
TSubclassOf<ABaseGeometryActor> _GeometryClass;
//在编辑器中可以设置成所有引擎类的对象
UPROPERTY(EditAnywhere)
UClass* Class;
//在编辑器中只能设置为指向场景中的类对象
UPROPERTY(EditAnywhere)
ABaseGeometryActor* _GeometryObject;
//数组容器,在编辑器中可以添加多个
UPROPERTY(EditAnywhere)
TArray<TSubclassOf<ABaseGeometryActor>> GeometryArray;
//生成Actor方式1,函数返回为AActor*,需要dynamic_cast
auto actor_1 = w->SpawnActor(_GeometryClass,&vt);
//生成Actor方式2,函数返回为ABaseGeometryActor*
auto actor_2 = w->SpawnActor<ABaseGeometryActor>(_GeometryClass, GeometryTransform);
//生成Actor方式3,函数返回为ABaseGeometryActor*
auto actor_3 = w->SpawnActorDeferred<ABaseGeometryActor>(_GeometryClass, GeometryTransform);//延迟调用生成对象的BeginPlay,与方式1、2相比,能够修改BeginPlay中使用到的参数
Geometry->FinishSpawning(GeometryTransform);//手动调用BeginPlay,不调用将会在所在函数执行结束以后再统一调用生成对象的BeginPlay,调用将会马上调用生成对象的BeginPlay

9、DELEGATES、UFUNCTION宏

//BlueprintReadWrite允许在蓝图视图上访问成员,结构体中的成员也需要加上此属性才能在蓝图中访问到
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GEOMETRY DATA")
FGeometryData GeometryData;
//允许函数在蓝图视图上调用
UFUNCTION(BlueprintCallable)
void setGeometryData(FGeometryData data) 
{
	GeometryData = data;
}
//允许函数在蓝图视图上调用
UFUNCTION(BlueprintCallable)
FGeometryData getGeometryData() 
{
	return GeometryData;
}
//委托可以使存储对任意类的具有特定签名的方法的引用,并在必要时调用此方法
//Multi-cast Delegate 如果需要将多个方法绑定到同一个Delegate上,并且最终方法被一起调用,则需要使用Multi-cast Delegate
//Dynamic Delegate 如果需要从蓝图中使用自定义事件,则必须使用Dynamic Delegate,同时在Delegate的实例上声明BlueprintAssignable
//FOnColorChanged自定义名称,后面为两个参数,动态多播委托类型
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnColorChanged, const FLinearColor&, Color, const FString&, Name);
//FOnTimerFinished自定义名称,后面为一个参数,多播委托类型,此委托仅在C++中可用所以不用指定参数名称
DECLARE_MULTICAST_DELEGATE_OneParam(FOnTimerFinished, AActor*)

//若要在蓝图中订阅此委托
UPROPERTY(BlueprintAssignable)
FOnColorChanged OnColorChanged;
FOnTimerFinished OnTimerFinished;

//触发委托
OnColorChanged.Broadcast(GeometryData.Color, GetName());
OnTimerFinished.Broadcast(this);

//在AGeometryHubActor类中订阅委托,OnColorChanged、OnTimerFinished为委托处理函数
actor->OnColorChanged.AddDynamic(this, &AGeometryHubActor::OnColorChanged);
actor->OnTimerFinished.AddUObject(this, &AGeometryHubActor::OnTimerFinished);

//动态委托的处理函数需要用UFUNCTION宏标记
UFUNCTION()
void OnColorChanged(const FLinearColor& Color, const FString& Text);
void OnTimerFinished(AActor* Actor);

//UE具有的转换函数
auto ptr = Cast<ABaseGeometryActor>(Actor);
auto ptr = CastChecked<ABaseGeometryActor>(Actor);

//销毁Actor
//ptr->Destroy();
//延迟销毁Actor(类似启动定时器后销毁)
ptr->SetLifeSpan(3.0f);
//销毁会调用Actor的EndPlay,需要自己手动重写
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;

10、主要类概述

UE5入门学习笔记(四)——C++学习记录_第1张图片
UE5入门学习笔记(四)——C++学习记录_第2张图片
UE5入门学习笔记(四)——C++学习记录_第3张图片

11、Pawn类和输入

学习视频是基于UE4的所以使用的是老的轴和操作映射系统,而在UE5.3中此系统已经被废弃掉了,默认使用的增强输入(Enhanced Input)系统,所以这里不再记录。增强输入系统具体使用方式参考下面文章。

UE5入门学习笔记(五)——增强输入(Enhanced Input)

12、APlayerController

你可能感兴趣的:(UE5,ue5,学习,笔记,c++,3d,图形渲染,游戏引擎)