本文为B站系列教学视频 《UE5_C++多人TPS完整教程》 —— 《P31 摄像机和弹簧臂(Camera And Spring Arm)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者)为 游戏引擎能吃么。
文章目录
- P31 摄像机和弹簧臂
- 31.1 添加摄像机和弹簧臂组件
- 31.2 Summary
P31 摄像机和弹簧臂
本节课将在我们创建的第三人称射击游戏角色蓝图类上添加摄像机组件和弹簧臂组件。
31.1 添加摄像机和弹簧臂组件
-
在虚幻引擎中打开项目 “
Blaster
”,从内容浏览器中拖拽蓝图类 “BP_BlasterCharacter
” 至关卡Lobby
中,并在右侧细节面板中将 “Pawn” 选项卡下的 “自动控制玩家”(Auto possess player)改为 “玩家 0”(Player 0),点击上方工具栏的 “播放”(▶)按钮,可以看到摄像机位于 “BP_BlasterCharacter
” 的内部。
-
因此,我们需要摄像头组件和弹簧臂组件来控制我们拥有角色时的视图(Control the view when we’re possessing the character)。在 VS 中打开 “
BlasterCharacter.h
”,定义摄像头组件和弹簧臂组件类为 “ABlasterCharacter
” 的私有成员变量。// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "BlasterCharacter.generated.h" UCLASS() class BLASTER_API ABlasterCharacter : public ACharacter { GENERATED_BODY() public: // Sets default values for this character's properties ABlasterCharacter(); // Called every frame virtual void Tick(float DeltaTime) override; // Called to bind functionality to input virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; protected: // Called when the game starts or when spawned virtual void BeginPlay() override; /* P31 摄像机和弹簧臂(Camera And Spring Arm)*/ private: UPROPERTY(VisibleAnywhere, Category = Camera) class USpringArmComponent* CameraBoom; // 定义弹簧臂组件类,归类为 “Camera” UPROPERTY(VisibleAnywhere, Category = Camera) class UCameraComponent* FollowCamera; // 定义摄像机组件类,归类为 “Camera” /* P31 摄像机和弹簧臂(Camera And Spring Arm)*/ public: };
-
在 “
BlasterCharacter.cpp
” 的构造函数 “ABlasterCharacter::ABlasterCharacter()
” 中分别创建弹簧臂组件和摄像机组件对象,设置它们的默认属性并调整它们的相对位置。// Fill out your copyright notice in the Description page of Project Settings. #include "BlasterCharacter.h" /* P31 摄像机和弹簧臂(Camera And Spring Arm)*/ #include "GameFramework/SpringArmComponent.h" #include "Camera/CameraComponent.h" /* P31 摄像机和弹簧臂(Camera And Spring Arm)*/ // 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; /* P31 摄像机和弹簧臂(Camera And Spring Arm)*/ // 创建弹簧臂对象 CameraBoom 并设置 CameraBoom 的默认属性 CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom")); // 基于弹簧臂组件类创建对象 CameraBoom->SetupAttachment(GetMesh()); // 设置弹簧臂附加到角色的骨骼网格体组件,如果附加到胶囊体上,角色在做蹲下的动作时,由于胶囊体的大小和路线会发生改变,弹簧臂的高度也会发生改变(弹簧臂将会移动) CameraBoom->TargetArmLength = 600.f; // 设置弹簧臂长度 CameraBoom->bUsePawnControlRotation = true; // 设置弹簧臂跟随角色控制器旋转 // 创建摄像机对象 FollowCamera 并设置 FollowCamera 的默认属性 FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera")); // 基于摄像机组件类创建对象 FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); // 将摄像机附加到弹簧臂 CameraBoom 上,并指定插槽名为虚幻引擎摄像机组件成员变量 SocketName FollowCamera->bUsePawnControlRotation = false; // 设置摄像机不跟随角色控制器旋转 // 调整弹簧臂和摄像机的相对位置(也可以在虚幻引擎的蓝图编辑器中设置) CameraBoom->SetRelativeLocation(FVector(0, 0, 88)); // 设置弹簧臂和摄像机在蓝图类 “BP_BlasterCharacter” 的相对位置为 (0, 0, 88),以避免它们与地面相撞 /* P31 摄像机和弹簧臂(Camera And Spring Arm)*/ } // Called when the game starts or when spawned void ABlasterCharacter::BeginPlay() { Super::BeginPlay(); } // Called every frame void ABlasterCharacter::Tick(float DeltaTime) { Super::Tick(DeltaTime); } // Called to bind functionality to input void ABlasterCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); }
-
回到 “
Lobby
” 关卡编辑器,点击上方工具栏的 “播放”(▶)按钮,可以看我们的视角就在角色的正后方。
31.2 Summary
本节课本节课在角色蓝图类 “BP_BlasterCharacter
” 上添加了摄像机组件和弹簧臂组件,具体做法是在 “BlasterCharacter.h
” 中定义摄像头组件和弹簧臂组件类,然后在 “BlasterCharacter.cpp
” 的的构造函数 “ABlasterCharacter::ABlasterCharacter()
” 中分别创建弹簧臂组件和摄像机组件对象,设置它们的默认属性,最后调整它们的默认相对位置,这一步既可以通过 C++ 代码实现,也可以在蓝图编辑器中实现。