欢迎光临
我们一直在努力

Unreal Engine5 基础笔记(持续更新)

C++

Debug及UE_Log

debugPrint

GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, "Begin play");

含参print

int a =100;
GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, FString::Printf(TEXT("%d"), a));

绘制调制函数

#include "DrawDebugHelpers.h"

DrawDebugSphere()

UWorld* world=GetWorld();
//确保世界不为NULL
if(world)
{
DrawDebugSphere(GetWorld(),GetActorLocation(),25.0f,24,FColor::Red,true );
//不会消失
DrawDebugSphere(GetWorld(),GetActorLocation(),25.0f,24,FColor::Red,false,30.0f );
//30s后消失
}

DrawDebugLine()

DrawDebugLine(GetWorld(),GetActorLocation(),GetActorLocation()+100.0f*GetActorForwardVector(),FColor::Red,true);

DrawDebugPoint()

DrawDebugPoint(GetWorld(),GetActorLocation()+100.0f*GetActorForwardVector(),15.0f,FColor::Red,true);

UE_log

Display:普通日志消息

Warning:黄色日志消息

Error: 红色日志消息

int NumberOfApples=10;
UE_LOG(LogTemp,Display,TEXT("NumberOfApples: %d"),NumberOfApples);

基本类型

Bool

大小:1 byte

取值范围:0|1

布尔变量必须以b为前缀

uint8 bTest:1;

uint8 是无符号 8 位整数类型,占用 1 字节(8 位)

:1 是 C++ 的位域语法,指定该变量只占用 1 个比特位。因此 Test 实际存储的值只能是 0 或 1

该语法只可在头文件中使用

uint8

大小:1 byte

取值范围:0~255

int32

大小:4 byte

取值范围:-2^32~2^32-1

float

大小:4 byte

取值范围:-2^32~2^32-1

int 64

大小:4byte

取值范围:-2^64~2^64-1

FName

大小:12byte

FString

大小:12byte

FText

大小:24byte

FVector(三维向量)

FVector2D(二维向量)

FRotator

Pitch是围绕Y轴旋转,叫做俯仰角

Yaw是围绕Z轴旋转,叫做偏航角

Roll是围绕X轴旋转,叫做翻滚角

Ftransform

UPROPERTY

EditAnywhere:在编辑中可见且可编辑

EditDefaultsOnly:只在类默认设置中可见

EditInstanceOnly:可通过属性窗口进行编辑,但只能在实例上进行,不能在原型上进行

VisibleAnywhere:在编辑中可见,且不可编辑

BlueprintReadOnly:蓝图只读

BlueprintReadWrite:蓝图可读可写

UFUNCTION

UE5.6官方UFunction文档

UFUNCTION([specifier1=setting1, specifier2, …], [meta(key1="value1", key2, …)])
ReturnType FunctionName([Parameter1, Parameter2, …, ParameterN1=DefaultValueN1, ParameterN2=DefaultValueN2]) [const];

BlueprintAuthorityOnly:如果在具有网络权限的机器上运行(服务器、专用服务器或单人游戏),此函数将仅从蓝图代码执行

BlueprintCallable:此函数可在蓝图或关卡蓝图图表中执行

BlueprintCosmetic:此函数为修饰性的,无法在专用服务器上运行

BlueprintImplementableEvent:此函数可在蓝图或关卡蓝图图表中实现

BlueprintNativeEvent:此函数旨在被蓝图覆盖掉,但是也具有默认原生实现。用于声明名称与主函数相同的附加函数,但是末尾添加了_Implementation,是写入代码的位置。如果未找到任何蓝图覆盖,该自动生成的代码将调用 _Implementation 方法

BlueprintPure:此函数不对拥有它的对象产生任何影响,可在蓝图或关卡蓝图图表中执行。早默认情况下,带有 const 标记的函数将作为纯函数公开。要将常量函数变成非纯函数,你可以做以下声明:BlueprintPure=false

UFUNCTION(BlueprintPure)
float BlueprintPureFunction;

UFUNCTION(BlueprintCallable)
float BlueprintCallableFunction

UFUNCTION(BlueprintCallable)
int32 BlueprintCallableConstFunction() const

UFUNCTION(BlueprintPure=fasle)
Int32 BlueprintPureFalseFunction() const

Category = "TopCategory\\|SubCategory\\|Etc"

在蓝图编辑工具中显示时指定函数的类别。使用 | 运算符定义嵌套类别

元数据说明符

官方文档

常用属性元数据说明符

ClampMin="N":用于浮点和整数属性。指定可在属性中输入的最小值 N

ClampMax="N":用于浮点和整数属性。指定可在属性中输入的最大值 N

自定义宏

#define DRAW_SPHERE(Location) if (GetWorld()) DrawDebugSphere(GetWorld(),Location,25.0f,24,FColor::Red,true);
#define DRAW_VECTOR(StartLocation,EndLocation) if (GetWorld())\\
{ \\
DrawDebugLine(GetWorld(),StartLocation,EndLocation,FColor::Red,true,-1.f,0,1.f);\\
DrawDebugPoint(GetWorld(),EndLocation,15.f,FColor::Red,true);\\
}

代码规范

官方文档

命名规范

枚举

枚举的前缀为E,定义在头文件

UENUM(BlueprintType)
enum class EColorBits :uint8
{
ECB_Red,
ECB_Green,
ECB_Blue
};

结构体

官方文档

前缀为U,定义在头文件

USTRUCT([Specifier, Specifier, …])
struct FStructName
{
GENERATED_BODY()
};

结构规范符Struct Specifiers

结构规范器提供元数据,控制结构体在引擎和编辑器的各个方面如何表现

Atomic:表示该类型应始终序列化为单一单元。该类不会生成自动生成的代码。该头仅用于解析元数据。

BlueprintType:将此类型暴露为可在蓝图中用于变量的类型

NoExport:该类不会生成自动生成的代码。头部仅用于解析元数据

生成和销毁Actor

官方文档  

GetWorld()->SpawnActor<AMyActor>(GetActorLocation(),GetActorRotation());

类型转换函数

FString To FName & FName To FString

//FString To FName
FString Str =TEXT("TestString");
FName Name =FName(*Str);
//FName To FString
FString TargetFString = Name.ToString();

组件

UStaticMeshComponent

UStaticMeshComponent* MyMesh;
TObjectPtr<UStaticMeshComponent>MyMesh;
//两种方法都可以

构造函数中

MyMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MyMeshComp"));
RootComponent = MyMesh;

UCapsuleComponent

官方文档

UPROPERTY(VisibleAnywhere)
UCapsuleComponent* Capsule;
//定义
Capsule = CreateDefaultSubobject<UCapsuleComponent>(TEXT("MyCapsule"));
SetRootComponent(Capsule);
GetCapsuleComponent()->InitCapsuleSize(45.0f,100.0f);
//初始化

USkeletalMeshComponent

UPROPERTY(VisibleAnywhere)
USkeletalMeshComponent* SkeletalMesh;
SkeletalMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("MySkeletalMesh"));
SkeletalMesh->SetupAttachment(GetRootComponent());

UCameraComponent & USpringArmComponent

UPROPERTY(VisibleAnywhere,BlueprintReadWrite,Category="Player",meta = (AllowPrivateAccess="true"))
TObjectPtr<UCameraComponent>Camera;

UPROPERTY(VisibleAnywhere,BlueprintReadWrite,Category="Player",meta = (AllowPrivateAccess="true"))
TObjectPtr<USpringArmComponent>CameraBoom;
CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("MyCameraBoom"));
CameraBoom->SetupAttachment(GetRootComponent());
CameraBoom->TargetArmLength=300.0f;
CameraBoom->bUsePawnControlRotation = true;
//弹簧臂是否跟随控制旋转
Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("MyCamera"));
Camera->SetupAttachment(CameraBoom,USpringArmComponent::SocketName);
Camera->bUsePawnControlRotation = false;

Input & Enhanced Input

Input System依赖InputComponent 和Project Settings修改input配置

在此不多做说明

Enhanced Input System基本流程:

(1)硬件输入

(2)UE Input System捕获

(3)Input Mapping Context(输入映射表)

(4)Input Action(抽象的动作)

(5)Triggers &Modifiers(触发条件/修饰器)

(6)Input Mapping Context与InputAction绑定

(7)通过EnhancedInputComponent绑定inputAction与具体的逻辑代码(蓝图系统自动实现)

UPROPERTY(EditAnywhere,Category="Input")
TObjectPtr<UInputMappingContext>IMC_Input;

UPROPERTY(EditAnywhere,Category="Input")
TObjectPtr<UInputAction>IA_Move;

UPROPERTY(EditAnywhere,Category="Input")
TObjectPtr<UInputAction>IA_Look;
//子系统注册
APlayerController* PlayerController = Cast<APlayerController>(GetController());
if(PlayerController)
{
UEnhancedInputLocalPlayerSubsystem* EnhancedSubSystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer());
if(EnhancedSubSystem)
{
EnhancedSubSystem->AddMappingContext(IMC_Input,1);
}
}

注意:子系统在Begin Play中注册

UEnhancedInputComponent* EnhancedPlayerInputComponent =CastChecked<UEnhancedInputComponent>(PlayerInputComponent);
EnhancedPlayerInputComponent->BindAction(IA_Move,ETriggerEvent::Triggered,this,&AMyCharacter::Move);
//在SetupPlayerInputComponent函数中

Controller

AutoPossessPlayer = EAutoReceiveInput::Player0;
//Player0 控制
bUseControllerRotationPitch = false;
bUseControllerRotationRoll =false;
bUseControllerRotationYaw = false;
//是否根据Controller旋转
GetCharacterMovement()->bOrientRotationToMovement = true;
//角色的朝向是否对齐到移动方向

常用快捷键(Rider)

切换头/源文件:Alt+O

前往声明或用法:F12

赞(0)
未经允许不得转载:171主机测评 » Unreal Engine5 基础笔记(持续更新)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址