总体思路
很简单,先创建一个C++的Character作为基类,然后再基于这个C++类创建BluePrint。然后在实际项目中,我们直接使用这个蓝图类即可,这样就既可以编码,也可以直接使用蓝图的比较简单的功能。
什么是Character
ACharacter 是APawn的子类,同时以A打头,说明它的老祖宗是AActor。
Characters in Unreal Engine | Unreal Engine 5.3 Documentation
在文档中已经说明,它属于APawn的延申,我们可以把它直接理解为类人角色,毕竟它直接包含了可以绑定skeleton mesh的组件。
基本步骤
- 创建C++ Character类,
BlasterCharacter - 基于
BlasterCharacter创建BP_BlasterChacter。注意将蓝图名和C++名区分开的同时保持一致。 - 绑定 skeleton
- 点击 mesh 组件, 绑定上目标骨骼
SK_...。然后将我们的人物正面和Arrow组件指向的方向对其。 - 点击 Capsule 组件,我们查看它的高度,并以此对其我们的mesh。
- 点击 mesh 组件, 绑定上目标骨骼
添加CameraBoom和Camera
接下来,我们在我们的C++Charater中添加上CameraBoom和Camera两个类。CameraBoom相当于我们平常的照相机支架,它用来控制照相机和我们角色的距离。Camera的视口就是我们玩家的视口,对于我们第三人称的游戏,我们一般而言会把照相机固定在我们角色的后面,然后随着我们鼠标的移动,画面也会跟着移动。
下面是基本代码和注释。记得手动添加include
// BlasterCharacter.h
UPROPERTY(VisibleAnyWhere, Category= Camera)
class USpringArmComponent* CameraBoom;
UPROPERTY(VisibleAnyWhere, Category= Camera)
class UCameraComponent* FollowCamera;
// Sets default values
ABlasterCharacter::ABlasterCharacter()
{
// Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
// create subcomponent USpringArmComponent and name it as CameraBoom
// 其目的是让它本身的子组件和其父组件保持一定的距离
CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
// 将其固定到skeleton组件上
CameraBoom->SetupAttachment(GetMesh());
// 到父组件的距离设置为600
CameraBoom->TargetArmLength = 600.f;
// 跟随玩家的rotation
CameraBoom->bUsePawnControlRotation = true;
FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
// 成为CameraBoom的子组件
FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName);
// 直接跟随CameraBoom即可
FollowCamera->bUsePawnControlRotation = false;
}
添加完毕后,在蓝图中调整CameraBoom的位置到自己喜欢的视角。