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


