在本教程中,你将向 CharacterBlueprint 类添加摄像机组件。
摄像机提供了一个可以查看关卡的视角,这个视角可以附加到关卡中的任何Actor,包括可操作角色和不可操作角色。
本教程将介绍如何向角色蓝图类添加摄像机组件,并为角色设置两个不同摄像机视角之间的切换开关。
创建角色蓝图
-
首先,点击 新建(New) > 游戏(Games) > 空白(Blank) > 蓝图(Blueprint) 创建名为 CameraComponents 的项目。
-
从 内容浏览器(Content Browser) 中点击 添加/导入(Add/Import) 按钮新建蓝图 角色(Character) 类,将其命名为 BP_CameraCharacter。
-
从 内容浏览器(Content Browser) 中双击 BP_CameraCharacter 打开 类默认值(Class Defaults)。
-
选择 网格体(Mesh) 骨骼网格体组件,然后从 组件(Components) 选项卡中点击 添加组件(Add Component),从下拉菜单中选择 箭头(Arrow),并将其重命名为 CameraRShoulderLocation。
箭头组件(Arrow Component) 是一种 场景组件(Scene Component),可渲染带线条的简单箭头,用于指示朝向。 详见关于工具控件的文档。
-
选择 CameraRShoulderLocation 箭头组件,从细节(Details)面板导航到 变换(Transform) 类别,将 位置(Location) 设置为(-30,0,150),将 旋转(Rotation) 设置为(0,0,90)。
-
选择 网格体(Mesh) 骨骼网格体组件,然后从 组件(Components) 选项卡中点击 添加组件(Add Component)。从下拉菜单中选择 箭头(Arrow),并将其重命名为 CameraOriginLocation。
-
从组件(Components)选项卡中选择 CameraOriginLocation 箭头组件,然后在细节(Details)面板中导航到 变换(Transform) 类别,将其 位置(Location) 设置为(0, -120, 150),将 旋转(Rotation) 设置为(0,0,90)。
CameraOriginLocation 和 CameraRShoulderLocation 附加到 骨架网格体组件(Skeletal Mesh Component),以提供摄像机组件将在何处切换其视点位置的可视化表示。
-
在 组件(Components) 选项卡中,选择 网格体(Mesh) 组件并导航至细节(Details)面板。从网格体(Mesh)类别中选择骨骼网格体,并从下拉菜单中搜索并选择 TutorialTPP。
如果下拉菜单中没有列示任何选项,点击 查看选项(View Options),勾选 显示引擎内容(Show Engine Content) 框。
-
从细节(Details)面板导航到 变换(Transform) 类别,将网格体的 位置(Location) 设置为(0,0,-90),将 旋转(Rotation) 设置为(0,0,-90)。
10.接下来,在 组件(Components) 选项卡中,点击 添加组件(Add Component) 按钮,选择摄像机(Camera)以添加 摄像机(Camera) 组件,并将该组件重命名为 CameraComp。

11.导航到 细节(Details) 面板,将摄像机的 位置(Location) 值设置为(0, -120, 150)。

12.编译 并 保存。
蓝图阶段成果

本例中,摄像机附加到角色的骨骼网格体组件,以提供第三人称视角,但可以向任何蓝图Actor类添加摄像机组件,以用于任何已选定的摄像机视角。
创建和绑定输入按键事件
创建角色蓝图类后,你需要设置一些脚本逻辑,以在两个不同的箭头组件位置之间转换摄像机组件的相对位置。
-
从BP_CameraCharacter的类默认值,点击 事件图表(Event Graph) 选项卡并在图表中 点击右键。从下拉菜单中选择 鼠标右键(Right Mouse Button) 以添加输入鼠标事件。
事件图表是移动摄像机的脚本逻辑发生之处。
-
导航到 我的蓝图(My Blueprint) 面板,然后从变量类别中 按住Ctrl键并点击 CameraComp 变量,将其副本拖动到事件图表上。
创建CameraComp变量的副本后,可以设置属性或通过类方法影响摄像机组件。
-
导航回 我的蓝图(My Blueprint) 面板,然后从变量类别中 按住Ctrl键并点击 CameraOriginLocation和CameraRShoulderLocation箭头组件,将它们拖动到事件图表中。
-
在事件图表中,点击CameraComp输出引脚并拖出引脚,然后从下拉菜单中搜索并选择 SetRelativeLocation。
SetRelativeLocation方法能够将摄像头组件移至选定位置。
-
点击 CameraRShoulderLocation 节点输出引脚并拖开引脚,然后搜索并选择 GetRelativeLocation。
-
将 Relative Location 节点的输出引脚连接到 New Location 节点,然后将 Right Mouse Button 事件节点的 Pressed 执行引脚连接到 Set Relative Location 节点的输入执行引脚。
按下 鼠标右键(Right Mouse Button) 后,摄像机的相对位置设置为箭头组件 CameraRShoulderLocation 的位置。
-
点击Camera Comp引脚并拖开引脚,然后从下拉菜单中选择 SetRelativeLocation。
-
点击 CameraOriginLocation 节点输出引脚并拖开引脚,然后从下拉菜单中选择 获取相对位置(Get Relative Location)。
-
将 CameraOriginLocation 的 Relative Location 节点输出引脚连接到 New Location 引脚,然后从 Right Mouse Button 事件节点将 Released 执行引脚连接到 SetRelativeLocation 节点的输入执行引脚。
10.编译 并 保存。
事件图表现在应类似于下图:

完成后的蓝图

设置游戏模式
创建并设置角色后,你需要修改游戏模式,以在点击运行(PIE)(Play (PIE))时生成角色。
-
从 内容浏览器(Content Browser) 中点击 添加/导入(Add/Import) 按钮新建一个游戏模式基础蓝图类,将其命名为 BP_CameraCompGameMode。
-
双击 BP_CameraCompGameMode,打开 类默认值(Class Defaults)。从 细节(Details) 面板导航到 类(Classes) 类别,从 默认Pawn类(Default Pawn Class) 下拉菜单中选择 Bp_CameraCharacter。
有关玩家控制器以及拥有Pawn Actor的其他文档,参见拥有Pawn。
-
编译 并 保存。
-
从虚幻引擎工具栏中选择 编辑(Edit)>项目设置(Project Settings),导航至 地图和模式(Maps & Modes) 设置。从 默认模式(Default Modes) 类别中选择新创建的 BP_CameraCompGameMode 类。
-
从关卡编辑器中点击 运行(PIE)(Play (PIE)) 按钮预览这些更改。
最终效果

选择 运行(PIE)(Play (PIE)) 后,点击和释放鼠标右键可以在两个摄像机视角之间转换。
后续步骤
现在你已了解了摄像机组件,你可能想要继续学习弹簧臂组件教程。
本教程将演示在将摄像机移动到狭窄空间中或有物体阻挡摄像机的玩家视角时,如何防止摄像机被遮挡。
在本教程中,你将向 角色(Character) 蓝图(Blueprint) 类添加摄像机组件。
摄像机提供了一个可以查看关卡的视角,这个视角可以附加到关卡中的任何Actor,包括可操作角色和不可操作角色。
本教程将介绍如何向角色蓝图类添加摄像机组件,并为角色设置两个不同摄像机视角之间的切换开关。
创建角色类
-
首先,点击 新建(New) > 游戏(Games) > 空白(Blank) > C++ 创建名为 CameraComponents 的项目。
-
从 C++类向导(C++ Class Wizard) 中,新建名为 CameraCharacter 的 角色(Character) 类,然后导航到
CameraCharactor.h
文件,并声明以下类定义:
protected:
//用于摄像机肩部视点位置的箭头组件
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UArrowComponent* CameraRShoulderLocation;
//用于摄像机原点视点位置的箭头组件
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UArrowComponent* CameraOriginLocation;
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UCameraComponent* CameraComp;
- 导航至
CameraCharactor.cpp
文件并添加以下类库:
#include "Camera/CameraComponent.h"
#include "Components/ArrowComponent.h"
- 在 ACameraCharactor::ACameraCharacter 构造函数方法中,声明以下代码,以实例化箭头和摄像机组件,并将其附加到角色的骨骼网格体。
//实例化你的类组件
CameraRShoulderLocation = CreateDefaultSubobject<UArrowComponent>(TEXT("CameraRShoulderLocation"));
CameraOriginLocation = CreateDefaultSubobject<UArrowComponent>(TEXT("CameraOriginLocation"));
CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComp"));
//将你的类组件附加到默认角色的骨骼网格体组件。
CameraRShoulderLocation->SetupAttachment(GetMesh());
CameraOriginLocation->SetupAttachment(GetMesh());
CameraComp->SetupAttachment(GetMesh());
[UProperty说明符提供了在蓝图中编辑类组件和属性的能力。
- 编译 代码。
-
从 内容浏览器(Content Browser) 中导航至 C++类(C++ Classes) 文件夹。右键点击 CameraCharacter 类,从下拉菜单中选择 基于CameraCharacter创建蓝图类(Create Blueprint class based on CameraCharacter),并将蓝图命名为 BP_CameraCharacter。
-
双击 BP_CameraCharacter,打开类默认值。
-
在 组件(Components) 选项卡中,选择 网格体(Mesh) 组件并导航至细节(Details)面板。从网格体(Mesh)类别中选择骨骼网格体,并从下拉菜单中搜索并选择 TutorialTPP。
如果下拉菜单中没有列示任何选项,点击 查看选项(View Options),勾选 显示引擎内容(Show Engine Content) 框。

-
从细节(Details)面板导航到 变换(Transform) 类别,将网格体的 位置(Location) 设置为(0,0,-90),将 旋转(Rotation) 设置为(0,0,-90)。
10.选择 CameraRShoulderLocation 箭头组件,从细节(Details)面板导航到 变换(Transform) 类别,将 位置(Location) 设置为(-30,0,150),将 旋转(Rotation) 设置为(0,0,90)。

11.从组件(Components)选项卡中选择 CameraOriginLocation 箭头组件,然后在细节(Details)面板中导航到 变换(Transform) 类别,将其 位置(Location) 设置为(0, -120, 150),将 旋转(Rotation) 设置为(0,0,90)。

CameraOriginLocation 和 CameraRShoulderLocation 附加到 骨架网格体组件(Skeletal Mesh Component),以提供摄像机组件将在何处切换其视点位置的可视化表示。
12.从组件(Components)选项卡中选择 CameraComp,然后在细节(Details)面板中导航到 变换(Transform) 类别,将其 位置(Location) 设置为(0, -120, 150),将 旋转(Rotation) 设置为(0,0,90)。

- 编译 并 保存。
13.组件应如下方视口中所示。

代码阶段成果
CameraCharacter.h
//在项目设置(Project Settings)的描述(Description)页面中填写版权声明。
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "CameraCharacter.generated.h"
UCLASS()
class CAMERACOMPONENTS_API ACameraCharacter : public ACharacter
{
GENERATED_BODY()
public:
// 为此角色的属性设置默认值
ACameraCharacter();
protected:
// 当游戏开始或重生(Spawn)时被调用
virtual void BeginPlay() override;
public:
// 每一帧都被调用
virtual void Tick(float DeltaTime) override;
// 被调用,将功能与输入绑定
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
protected:
//用于摄像机肩部视点位置的箭头组件
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UArrowComponent* CameraRShoulderLocation;
//用于摄像机原点视点位置的箭头组件
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UArrowComponent* CameraOriginLocation;
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UCameraComponent* CameraComp;
};
CameraCharacter.cpp
//在项目设置(Project Settings)的描述(Description)页面中填写版权声明。
#include "CameraCharacter.h"
#include "Camera/CameraComponent.h"
#include "Components/ArrowComponent.h"
// 设置默认值
ACameraCharacter::ACameraCharacter()
{
// 将此角色设置为每帧调用Tick()。 如果不需要此特性,可以关闭以提升性能。
PrimaryActorTick.bCanEverTick = true;
//实例化你的类组件
CameraRShoulderLocation = CreateDefaultSubobject<UArrowComponent>(TEXT("CameraRShoulderLocation"));
CameraOriginLocation = CreateDefaultSubobject<UArrowComponent>(TEXT("CameraOriginLocation"));
CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComp"));
//将你的类组件附加到默认角色的骨骼网格体组件。
CameraRShoulderLocation->SetupAttachment(GetMesh());
CameraOriginLocation->SetupAttachment(GetMesh());
CameraComp->SetupAttachment(GetMesh());
}
// 当游戏开始或重生(Spawn)时被调用
void ACameraCharacter::BeginPlay()
{
Super::BeginPlay();
}
// 每一帧都被调用
void ACameraCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// 被调用,将功能与输入绑定
void ACameraCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
}
创建和绑定输入按键事件函数
创建角色蓝图类后,你需要设置一些脚本逻辑,以在两个不同的箭头组件位置之间转换摄像机组件的相对位置。
-
从关卡编辑器工具栏中,导航到 编辑(Edit)>项目设置(Project Settings) 并打开 输入(Input) 页面。然后从 绑定(Bindings) 类别中点击 操作映射(Action Mappings) 旁的 + 图标,以新建输入映射。
-
将该操作映射命名为 SwitchCamera,并从下拉菜单中选择 鼠标右键(Right Mouse Button) 键值。
-
导航至
CameraCharacter.h
文件并声明以下类定义。
protected:
//设置CameraComp相对于CameraRShoulderLocation箭头组件的位置。
void SetCameraShoulderLocation();
//设置CameraComp相对于CameraOriginLocation箭头组件的位置
void SetCameraOriginLocation();
- 在
CameraCharacter.cpp
文件中,实现以下类方法。
void ACameraCharacter::SetCameraShoulderLocation()
{
CameraComp->SetRelativeLocation(CameraRShoulderLocation->GetRelativeLocation());
}
void ACameraCharacter::SetCameraOriginLocation()
{
CameraComp->SetRelativeLocation(CameraOriginLocation->GetRelativeLocation());
}
- 接下来导航至 ACameraCharacter::SetupPlayerInputComponent 方法,并实现以下代码。
//被调用,用于将功能绑定到输入
void ACameraCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAction("SwitchCamera", IE_Pressed, this, &ACameraCharacter::SetCameraShoulderLocation);
PlayerInputComponent->BindAction("SwitchCamera", IE_Released, this, &ACameraCharacter::SetCameraOriginLocation);
}
有关玩家控制器以及拥有Pawn Actor的其他文档,参见拥有Pawn。
- 编译 代码。
完成后的代码
CameraCharacter.h
//在项目设置(Project Settings)的描述(Description)页面中填写版权声明。
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "CameraCharacter.generated.h"
UCLASS()
class CAMERACOMPONENTS_API ACameraCharacter : public ACharacter
{
GENERATED_BODY()
public:
// 为此角色的属性设置默认值
ACameraCharacter();
protected:
// 当游戏开始或重生(Spawn)时被调用
virtual void BeginPlay() override;
public:
// 每一帧都被调用
virtual void Tick(float DeltaTime) override;
// 被调用,将功能与输入绑定
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
protected:
//用于摄像机肩部视点位置的箭头组件
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UArrowComponent* CameraRShoulderLocation;
//用于摄像机原点视点位置的箭头组件
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UArrowComponent* CameraOriginLocation;
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UCameraComponent* CameraComp;
protected:
//设置CameraComp相对于CameraRShoulderLocation箭头组件的位置。
void SetCameraShoulderLocation();
//设置CameraComp相对于CameraOriginLocation箭头组件的位置
void SetCameraOriginLocation();
};
CameraCharacter.cpp
//在项目设置(Project Settings)的描述(Description)页面中填写版权声明。
#include "CameraCharacter.h"
#include "Camera/CameraComponent.h"
#include "Components/ArrowComponent.h"
// 设置默认值
ACameraCharacter::ACameraCharacter()
{
// 将此角色设置为每帧调用Tick()。 如果不需要此特性,可以关闭以提升性能。
PrimaryActorTick.bCanEverTick = true;
//实例化你的类组件
CameraRShoulderLocation = CreateDefaultSubobject<UArrowComponent>(TEXT("CameraRShoulderLocation"));
CameraOriginLocation = CreateDefaultSubobject<UArrowComponent>(TEXT("CameraOriginLocation"));
CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComp"));
//将你的类组件附加到默认角色的骨骼网格体组件。
CameraRShoulderLocation->SetupAttachment(GetMesh());
CameraOriginLocation->SetupAttachment(GetMesh());
CameraComp->SetupAttachment(GetMesh());
}
// 当游戏开始或重生(Spawn)时被调用
void ACameraCharacter::BeginPlay()
{
Super::BeginPlay();
}
// 每一帧都被调用
void ACameraCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
//被调用,用于将功能绑定到输入
void ACameraCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAction("SwitchCamera", IE_Pressed, this, &ACameraCharacter::SetCameraShoulderLocation);
PlayerInputComponent->BindAction("SwitchCamera", IE_Released, this, &ACameraCharacter::SetCameraOriginLocation);
}
void ACameraCharacter::SetCameraShoulderLocation()
{
CameraComp->SetRelativeLocation(CameraRShoulderLocation->GetRelativeLocation());
}
void ACameraCharacter::SetCameraOriginLocation()
{
CameraComp->SetRelativeLocation(CameraOriginLocation->GetRelativeLocation());
}
设置游戏模式
创建并设置角色后,你需要修改游戏模式,以在点击运行(PIE)(Play (PIE))时生成角色。
-
先导航至C++类文件夹。右键点击CameraComponentsGameModeBase类,从下拉菜单中选择 基于CameraComponentsGameModeBase创建蓝图类(Create Blueprint Class based CameraComponentsGameModeBase),并将蓝图命名为 BP_CameraCompGameMode。
-
从 细节(Details) 面板导航到 类(Classes) 类别,从 默认Pawn类(Default Pawn Class) 下拉菜单中选择 BP_CameraCharacter。
默认Pawn类也可从代码中的GameModeBase 默认Pawn变量中设置。
-
编译 并 保存。
-
从虚幻引擎工具栏中选择 编辑(Edit)>项目设置(Project Settings),导航至 地图和模式(Maps & Modes) 设置。从 默认模式(Default Modes) 类别中选择新创建的 BP_CameraCompGameMode 类。
-
从关卡编辑器中点击 运行(PIE)(Play (PIE)) 按钮预览这些更改。
最终效果

选择运行(PIE)(Play (PIE))后,点击和释放鼠标右键可以在两个摄像机视角之间转换。
后续步骤
现在你已了解了摄像机组件,你可能想要继续学习弹簧臂组件教程。
本教程将演示在将摄像机移动到狭窄空间中或有物体阻挡摄像机的玩家视角时,如何防止摄像机被遮挡。