UE5 C++ 创建可缩放的相机

一.要将相机设置在Pawn类里

1.在MyPawn头文件里,加上摇臂和相机组件

#include "GameFramework/SpringArmComponent.h"
#include "Camera/CameraComponent.h"

2.在Pawm里声明SceneComponet,SpringArmComponent,CameraComponent组件指针

再声明一个移动缩放调用的函数

public:
	UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category = "MySceneComponent")
	USceneComponent* MyRoot;
	UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category = "MySceneComponent")
	USpringArmComponent* MySpringArm;
	UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category = "MySceneComponent")
	UCameraComponent* MyCamera;
	//鼠标划轮移动镜头缩放
	void Zoom(bool Direction,float ZoomSpeed);

在Pawn里将的组件通过CreateDefaultSubobject<T>(TEXT("Name"))创造命名。

根组件赋值为MyRoot的物体组件。SetupAttackment来连接子组件。将MySpringArm的bDoCollisionTest = false来停止碰撞。

AMyPawn::AMyPawn()
{
 	// Set this pawn to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;
	MyRoot = CreateDefaultSubobject<USceneComponent>(TEXT("MyRootComponent"));
	MySpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("MySpringArmComponent"));
	MyCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("MyCameraComponent"));
	RootComponent = MyRoot;
	MySpringArm->SetupAttachment(MyRoot);
	MyCamera->SetupAttachment(MySpringArm);
	MySpringArm->bDoCollisionTest = false;  //让它无碰撞

3.设置好Pawn的Transform信息。

	FVector MyLocation = FVector(0,0,0);
	FRotator MyRotation = FRotator(-50,0,0);
	FVector MyScale = FVector(1,1,1);
	SetActorLocation(MyLocation);
	SetActorRotation(MyRotation);
	SetActorScale3D(MyScale);

4.在滑动函数里,将相机的伸缩臂的伸缩方向和速度的逻辑写好

void AMyPawn::Zoom(bool Direction, float ZoomSpeed)
{
	if (Direction) //1
	{
		if (MySpringArm->TargetArmLength >= 300 && MySpringArm->TargetArmLength < 5000)  //如果摄像机摇臂在300 到 5000之间
		{
			MySpringArm->TargetArmLength += (ZoomSpeed * 2);
			GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::Printf(TEXT("SpringArmLength is %f"), MySpringArm->TargetArmLength));
		}
	}
	else
	{
		if (MySpringArm->TargetArmLength > 300 && MySpringArm->TargetArmLength <= 5000)
		{
			MySpringArm->TargetArmLength -= (ZoomSpeed * 2);
			GEngine->AddOnScreenDebugMessage(-1,5.0f,FColor::Red,FString::Printf(TEXT("SpringArmLength is %f"),MySpringArm->TargetArmLength));
		}
	}
}

5.在PlayerController.cpp头文件里包含Pawn。注意顺序(MyPlayerController.h要放在第一个)

#include "MyPlayerController.h"
#include "MyPawn.h"

在PlayerController.h里声明 绑定输入 和 其他功能函数

	virtual void SetupInputComponent();
	void WheelUpFunction();
	void WheelDownFunction();

设置输入绑定事件,由于要重写SetupInputComponent虚函数,首先要继承父类的Super::SetupInputComponent(); 这个在UE里要写。再加上额外添加的代理绑定功能。

通过绑定输入代理,调用PlayerController的新定义的函数

void AMyPlayerController::SetupInputComponent()
{
	Super::SetupInputComponent();
	InputComponent->BindAction("WheelUp",IE_Pressed,this,&AMyPlayerController::WheelUpFunction);
	InputComponent->BindAction("WheelDown",IE_Pressed,this,&AMyPlayerController::WheelDownFunction);
}

新定义的函数中,通过GetPawn()拿到,GameMode里的Pawn,把它转换为AMyPawn。如果转换成功,在调用里面的MyPawn里的Zoom函数。

void AMyPlayerController::WheelUpFunction()
{
	if (GetPawn())
	{
		AMyPawn* MyCameraPawn = Cast<AMyPawn>(GetPawn());
		if (MyCameraPawn)
		{
			MyCameraPawn->Zoom(true, 10);
		}
	}
}

void AMyPlayerController::WheelDownFunction()
{
	if (GetPawn())
	{
		AMyPawn* MyCameraPawn = Cast<AMyPawn>(GetPawn());
		if (MyCameraPawn)
		{
			MyCameraPawn->Zoom(false, 10);
		}
	}
}

可以伸缩,并且打印SpringArm的长度

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.【架构师成长之路】职场新人:维护一张能力图谱

文章目录 导言一、能力图谱就是技能体系1、时刻提醒你&#xff0c;你有一个目标2、你可以知道靠近目标的具体方式3、你会变得更加自信 二、周期性review自己的能力图谱1、review能力项进度2、review能力项完整度3、固定周期review 本文总结说明 导言 上两篇文章我们讲了&#…

C语言中关于#include的一些小知识

写代码的过程中&#xff0c;因为手误&#xff0c;重复包含了头文件 可以看到没有报错 如果是你自己编写的头文件&#xff0c;那么如果没加唯一包含标识的话&#xff0c;那么编译器会编译报错的。如果是系统自带的头文件&#xff0c;由于其每个头文件都加了特殊标识&#xff0c…

【动态规划】【矩阵快速幂】LeetCode2851. 字符串转换

作者推荐 【深度优先搜索】【树】【有向图】【推荐】685. 冗余连接 II 涉及知识点 【矩阵快速幂】封装类及测试用例及样例 LeetCode 2851. 字符串转换 给你两个长度都为 n 的字符串 s 和 t 。你可以对字符串 s 执行以下操作&#xff1a; 将 s 长度为 l &#xff08;0 <…

安达发|APS排产软件的机台产线任务甘特图功能详解

在现代制造业中&#xff0c;高级计划与排产是制造业运营的关键环节。为了提高生产效率、降低成本并确保产品质量&#xff0c;企业需要对生产过程进行精细化管理。APS&#xff08;高级计划与排产&#xff09;系统作为一种先进的生产计划和调度工具&#xff0c;可以帮助企业实现这…

在计算机上设置和使用 KVM

为了使用 gem5 的 KVMCPU 来快进你的模拟&#xff0c;你必须有一个 KVM 兼容的处理器并且在你的机器上安装了 KVM。本页将引导您完成在计算机上启用 KVM 并将其与 gem5 一起使用的过程。 注意&#xff1a;以下教程假设 X86 Linux 主机。本教程的各个部分可能不适用于其他体系结…

IBM V5000存储更换控制器及电源模块

LED故障状态 后面板故障状态 系统内电源模块报错信息(可安全卸下状态为"是"&#xff0c;此时可直接热拔插) 控制器报错信息&#xff08;当前已是脱机状态可直接拔插&#xff0c;该型号控制器不需要更换缓存可直接热拔插更换&#xff09; 更换故障备件应先核对新旧备件…

CTFHub技能树web之RCE(二)

第五题&#xff1a;远程包含 根据题目&#xff0c;使用远程包含进行 打开phpinfo&#xff0c;可以看到allow_url_fopen和allow_url_include都是On&#xff0c;因此可以使用php://input&#xff0c;由于代码会检查file中的内容&#xff0c;因此不能够使用php://filter包含文件&a…

C++正则表达式笔记

最近翻了翻正则表达式的一些资料&#xff0c;做个记录。 1、微软官方 <regex> 函数 | Microsoft Learn 2、正则表达式语法简介 正则表达式语法简介 - 简书 3、正则表达式基础语法大全 正则表达式基础语法大全_正则表达式语法大全-CSDN博客 4、练习 &#xff08;1…

ffmpeg TS复用代码详解——mpegtsenc.c

一、mpegtsenc.c 整体架构 二、主要函数 mpegts_write_pes(AVFormatContext *s, AVStream *st, const uint8_t *payload, int payload_size, int64_t pts, int64_t dts)这个函数就是TS打包的主函数了&#xff0c;这个函数主要功能就是把一帧数据拆分成188字节的TS包&#xff0…

openai DALL-E 3 从文本描述生成图像原理通俗解释

序言 在数字时代&#xff0c;图像生成技术正日益成为人工智能领域的热点。 本讨论将重点聚焦于两个备受瞩目的模型&#xff1a;DALL-E和其他主流AI绘图方法。 我们将探讨它们的优势、局限性以及未来的发展方向。通过比较分析&#xff0c;我们期望能够更全面地了解这些技术&a…

Datawhale零基础入门金融风控Task1 赛题理解

Task1 赛题理解 Tip:本次新人赛是Datawhale与天池联合发起的0基础入门系列赛事第四场 —— 零基础入门金融风控之贷款违约预测挑战赛。 赛题以金融风控中的个人信贷为背景&#xff0c;要求选手根据贷款申请人的数据信息预测其是否有违约的可能&#xff0c;以此判断是否通过此项…

jenkins的nmp install命令无法下载包

问题&#xff1a;在jenkin的流水线脚本中执行到&#xff1a;npm install命令后无法下载前端依赖包 1、进到jenkins的工作目录&#xff0c;一般在底层为/var/lib/jenkins/workspace/任务名称 cd /var/lib/jenkins/workspace/xkc处理方式&#xff1a; # 查看镜像源 npm config …

​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】

欢迎来CILMY23的博客喔&#xff0c;本期系列为​【C语言】长篇详解&#xff0c;字符系列篇3-----strstr&#xff0c;strtok&#xff0c;strerror字符串函数的使用【图文详解​】&#xff0c;图文讲解各种字符串函数&#xff0c;带大家更深刻理解C语言中各种字符串函数的应用&am…

日常的一些异常

Column ‘id’ in where clause is ambiguous 这个错误in where clause is ambiguous多半是因为多表查询的时候几个表中同时出现了某个相同的列名&#xff0c;而在查询条件WHERE后面又没有指定是那个表&#xff0c;而引起的,又或者是查询结果里面有两个相同的列名&#xff0c;…

[notice] A new release of pip is available: 23.2.1 -> 24.0

翻译之后&#xff1a;〔通知〕新版本的pip可用&#xff1a;23.2.1->24.0 就是说&#xff0c;你的pip版本需要从当前的 23.2.1 升级到最新版本 24.0&#xff0c;执行如下命令&#xff1a; cmd命令以管理员身份进入目录 ${Python}\Python3.12.1\Scripts下&#xff0c;执行 p…

好用便签:如何利用备忘录高效处理待办事项?

在快节奏的现代生活中&#xff0c;我们需要处理各种各样的待办事项&#xff0c;从个人生活琐事到工作任务。如何利用备忘录高效处理待办事项&#xff0c;成为了提升效率和生活质量的关键。一个合理的待办事项规划不仅能帮助我们明确目标&#xff0c;还能让我们更加有条不紊地应…

【软考高项】【教材知识梳理】- 17 - 第17章 - 项目干系人管理

一、基本问题 问题1&#xff1a;干系人登记册包括什么? a.身份信息&#xff1a;姓名、 组织职位、 地点、 联系方式&#xff0c; 以及在项目中扮演的角色。b.评估信息&#xff1a;主要需求、 期望、 影响项目成果的潜力&#xff0c; 以及干系人最能影响或冲击的项目生命周期阶…

知识付费App开发:重塑学习与知识的价值链

随着互联网的普及和信息爆炸的时代&#xff0c;人们对于知识的渴求从未如此强烈。然而&#xff0c;如何在海量的信息中筛选出有价值的内容&#xff0c;成为了摆在用户面前的一大难题。此时&#xff0c;知识付费App应运而生&#xff0c;为用户提供了一个高效、便捷的知识获取与交…

vscode 点击import引用的组件直接跳转方法

vs code。下载插件。 搜索名称&#xff1a;别名路径跳转

小程序--自定义组件

一、创建自定义组件 .js中注册Component函数 .json使用"component": true Component({}) {"component": true } 二、使用自定义组件 全局配置、页面配置均可&#xff0c;全局配置就写在app.json中&#xff0c;页面配置就写在页面对应的json中。 配置之后…