《UE5_C++多人TPS完整教程》学习笔记30 ——《P31 摄像机和弹簧臂(Camera And Spring Arm)》

news2024/11/20 15:15:36

本文为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 添加摄像机和弹簧臂组件

  1. 在虚幻引擎中打开项目 “Blaster”,从内容浏览器中拖拽蓝图类 “BP_BlasterCharacter” 至关卡 Lobby 中,并在右侧细节面板中将 “Pawn” 选项卡下的 “自动控制玩家”(Auto possess player)改为 “玩家 0”(Player 0),点击上方工具栏的 “播放”(▶)按钮,可以看到摄像机位于 “BP_BlasterCharacter” 的内部。
    在这里插入图片描述
    在这里插入图片描述

  2. 因此,我们需要摄像头组件和弹簧臂组件来控制我们拥有角色时的视图(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:	
    
    };
    
    
  3. 在 “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);
    
    }
    

    在这里插入图片描述

  4. 回到 “Lobby” 关卡编辑器,点击上方工具栏的 “播放”(▶)按钮,可以看我们的视角就在角色的正后方。
    在这里插入图片描述


31.2 Summary

本节课本节课在角色蓝图类 “BP_BlasterCharacter” 上添加了摄像机组件和弹簧臂组件,具体做法是在 “BlasterCharacter.h” 中定义摄像头组件和弹簧臂组件类,然后在 “BlasterCharacter.cpp” 的的构造函数 “ABlasterCharacter::ABlasterCharacter()” 中分别创建弹簧臂组件和摄像机组件对象,设置它们的默认属性,最后调整它们的默认相对位置,这一步既可以通过 C++ 代码实现,也可以在蓝图编辑器中实现。
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1570229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在云端遇见雨云:一位服务器寻觅者的指南

引言&#xff1a;寻觅一座云端归宿 当我踏入数字世界的边缘&#xff0c;带着对网络的探索与期待&#xff0c;我迫切需要一座安全可靠的数字栖息地。云计算技术正如一场魔法般的变革&#xff0c;而在这片广袤的云端中&#xff0c;雨云就像是一位友善的向导&#xff0c;引领我穿越…

【AAOS车载系统+AOSP14系统攻城狮入门实战课】:正式上线了(二百零三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

代码随想录算法训练营第三十天| 332.重新安排行程, 51. N皇后, 37. 解数独,总结

题目与题解 参考资料&#xff1a;回溯总结 332.重新安排行程 题目链接&#xff1a;332.重新安排行程 代码随想录题解&#xff1a;332.重新安排行程 视频讲解&#xff1a;带你学透回溯算法&#xff08;理论篇&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 解题思路&a…

c语言--动态内存管理(malloc、realloc、free、calloc)

目录 一、为什么要有动态内存分配二、 malloc和free2.1 malloc 三、 calloc和realloc3.1calloc3.2 realloc 四、常见的动态内存的错误4.1 对NULL指针的解引用操作4.2 对动态开辟空间的越界访问4.3 对非动态开辟内存使用free释放4.4 使用free释放⼀块动态开辟内存的一部分4.5对同…

Midjourney艺术家分享|By Moebius

Moebius&#xff0c;本名让吉拉德&#xff08;Jean Giraud&#xff09;&#xff0c;是一位极具影响力的法国漫画家和插画师&#xff0c;以其独特的科幻和幻想风格而闻名于世。他的艺术作品不仅在漫画领域内受到高度评价&#xff0c;也为电影、时尚和广告等多个领域提供了灵感。…

逆向案例十三(1)——贝壳网登录密码逆向

链接地址&#xff1a;合肥房产网_合肥二手房|租房|新房|房地产信息网【合肥贝壳找房】 点击登录&#xff0c;打开开发者工具&#xff0c;点击账号密码登录&#xff0c;输入错误密码和账号 。找到登录的数据包。打开发现有许多参数加密。数据包是authenticate 再登陆一次看哪些…

分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小支持向量机数据分类预测

分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小支持向量机数据分类预测 目录 分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现CPO-LSSVM冠豪猪算法优化最小支持向量机数据分类预…

机器学习模型:决策树笔记

第一章&#xff1a;决策树原理 1-决策树算法概述_哔哩哔哩_bilibili 根节点的选择应该用哪个特征&#xff1f;接下来选什么&#xff1f;如何切分&#xff1f; 决策树判断顺序比较重要。可以使用信息增益、信息增益率、 在划分数据集前后信息发生的变化称为信息增益&#xff0c…

MySQL故障排查与优化

一、MySQL故障排查 1.1 故障现象与解决方法 1.1.1 故障1 1.1.2 故障2 1.1.3 故障3 1.1.4 故障4 1.1.5 故障5 1.1.6 故障6 1.1.7 故障7​ 1.1.8 故障8 1.1.9 MySQL 主从故障排查 二、MySQL优化 2.1 硬件方面 2.2 查询优化 一、MySQL故障排查 1.1 故障现象与解决方…

Windows Docker 部署 Firefly III 开源记账软件

一、简介 Firefly III是一款开源的记账软件&#xff0c;支持全球多种语言。它可以帮助用户追踪和管理个人账目、预算和账单&#xff0c;减少支出&#xff0c;节省更多。该软件支持多种货币、银行账户和投资账户&#xff0c;并提供了丰富的报表功能&#xff0c;帮助用户更好地了…

Netty客户端发送数据给服务器的两个通道(1)

EventLoopGroup group new NioEventLoopGroup();// 设置的连接group。 Bootstrap bootstrap new Bootstrap().group(group).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000) // 超时时间。 .channel(NioSocketChannel.class).handler(new ChannelInitializer() { Ov…

JVM专题——类文件加载

本文部分内容节选自Java Guide和《深入理解Java虚拟机》, Java Guide地址: https://javaguide.cn/java/jvm/class-loading-process.html &#x1f680; 基础&#xff08;上&#xff09; → &#x1f680; 基础&#xff08;中&#xff09; → &#x1f680;基础&#xff08;下&a…

Makefile:make install的实现(十一)

1、make install的概念 在Linux环境下有些时候软件或者服务会通过源码安装&#xff0c;执行一些make、make install、make clean的指令。例如&#xff1a;redis make&#xff1a;编译所有的文件、生成一些动态库、静态库、可执行程序等等make install&#xff1a;通常会创建一个…

Qt | Qt 框架结构概述

一、Qt 基本框架概述 1、Qt 5 引入了模块化的概念,Qt 5 将实现众多功能的 Qt 库细分为各个模块,也就是说一个模块中包含了实现某种功能的众多 C++类库,比如 Qt GUI 模块用于图形用户界面绘制,该模块中包含了实现 GUI 组件的类库,比如 QFont、QImage、QOpenGL、QWindow 等…

11.python的字典dict(下) 遍历字典,结构优化

11.python的字典dict(下) 遍历所有的键值对 items()方法是字典的一个内置方法&#xff0c;用于返回字典中所有键值对的视图&#xff08;view&#xff09;。它返回一个可迭代的对象&#xff0c;每个元素都是一个包含键和对应值的元组。 下面用一个例子来说明items()方法的用法…

闻风丧胆的算法(二)

&#x1f308;个人主页&#xff1a;Rookie Maker &#x1f525; 系列专栏&#xff1a;算法 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x1f601; 喜欢的小…

第十二届通信和宽带网络国际会议(ICCBN 2024)即将召开!

2024年第十二届通信和宽带网络国际会议将于2024年7月25日至27日在西藏林芝举行会议涵盖的议题广泛多样&#xff0c;包括但不限于&#xff1a;5G、6G技术与应用&#xff0c;宽带网络架构和优化&#xff0c;物联网与智能连接&#xff0c;人工智能在通信领域的应用&#xff0c;数据…

C++ 标准库类型stackqueue

C/C总述&#xff1a;Study C/C-CSDN博客 栈与队列详解&#xff08;数据结构&#xff09;&#xff1a;栈与队列_禊月初三-CSDN博客 stack&#xff08;栈&#xff09; stack的常用函数 函数说明功能说明stack()构造空栈push(T& val)将元素val压入栈中size()返回栈中元素个…

蓝桥杯算法题:区间移位

题目描述 数轴上有n个闭区间&#xff1a;D1,...,Dn。 其中区间Di用一对整数[ai, bi]来描述&#xff0c;满足ai < bi。 已知这些区间的长度之和至少有10000。 所以&#xff0c;通过适当的移动这些区间&#xff0c;你总可以使得他们的“并”覆盖[0, 10000]——也就是说[0, 100…

【数据结构(一)】初识数据结构

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.集合架构3.时间和空间复杂度3.1算法效率3.2时间复杂度3.2.1大O的渐进…