UE C++ 多镜头设置缩放 平移

一.整体思路

首先需要在 想要控制的躯体Pawn上,生成不同相机对应的SpringArm组件。其次是在Controller上,拿到这个Pawn,并在其中设置输入响应,并定义响应事件。响应事件里有指向Pawn的指针,并把Pawn的缩放平移功能进行调用。

二.

1.CameraPawn的组件构成

	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);void Panx(float x);void Pany(float y);void Back();
ACameraPawn::ACameraPawn()
{// 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("MySCameraComponent"));RootComponent = MyRoot;MySpringArm->SetupAttachment(MyRoot);MyCamera->SetupAttachment(MySpringArm);MySpringArm->bDoCollisionTest = false;
}

2.将Pawn自己镜头伸缩,平移功能,复原写好

void ACameraPawn::Zoom(bool Direction, float ZoomSpeed) {if (Direction) {if (MySpringArm->TargetArmLength >= 300 && MySpringArm->TargetArmLength < 5000) {MySpringArm->TargetArmLength += (ZoomSpeed * 2);GEngine->AddOnScreenDebugMessage(-1, 5.f, 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.f, FColor::Red, FString::Printf(TEXT("SpringArmLength is %f"), MySpringArm->TargetArmLength));}}
}void ACameraPawn::Panx(float x)
{MyCamera->AddLocalOffset(FVector(0,x,0));
}void ACameraPawn::Pany(float y)
{MyCamera->AddLocalOffset(FVector(0,0,y));
}void ACameraPawn::Back()
{MyCamera->SetRelativeLocation(FVector(0,0,0));
}

 3.在MyPlayerController里面绑定输入映射,以及响应的事件。

	virtual void SetupInputComponent();void WheelUpFunction();void WheelDownFunction();void PanX(float x);void PanY(float y);void Back();

4.绑定映射

void AMyPlayerController::SetupInputComponent()
{Super::SetupInputComponent();InputComponent->BindAction("WheelUp", IE_Pressed, this, &AMyPlayerController::WheelUpFunction);InputComponent->BindAction("WheelDown", IE_Pressed, this, &AMyPlayerController::WheelDownFunction);InputComponent->BindAction("BackXY",IE_Pressed,this,&AMyPlayerController::Back);InputComponent->BindAxis("PanX",this,&AMyPlayerController::PanX);InputComponent->BindAxis("PanY",this,&AMyPlayerController::PanY);//InputComponent->BindAction("ESCEvent", IE_Pressed, this, &AMyPlayerController::ESCEvent).bExecuteWhenPaused=true;//游戏暂停可以执行//InpuptComponent->BindAxis("PanY",this,);
}

5.响应事件,并操控控制到对应的Pawn里的函数。

void AMyPlayerController::WheelUpFunction()
{if (GetPawn()) {ACameraPawn* MyCameraPawn = Cast<ACameraPawn>(GetPawn());if (MyCameraPawn) {MyCameraPawn->Zoom(1, 10);}}
}void AMyPlayerController::WheelDownFunction()
{if (GetPawn()) {ACameraPawn* MyCameraPawn = Cast<ACameraPawn>(GetPawn());if (MyCameraPawn) {MyCameraPawn->Zoom(0, 10);}}
}void AMyPlayerController::PanX(float x)
{if (GetPawn()){ACameraPawn* MyCameraPawn = Cast<ACameraPawn>(GetPawn());if (MyCameraPawn) {MyCameraPawn->Panx(x);}}
}void AMyPlayerController::PanY(float y)
{if (GetPawn()){ACameraPawn* MyCameraPawn = Cast<ACameraPawn>(GetPawn());if (MyCameraPawn) {MyCameraPawn->Pany(y);}}
}void AMyPlayerController::Back()
{if (GetPawn()){ACameraPawn* MyCameraPawn = Cast<ACameraPawn>(GetPawn());if (MyCameraPawn) {MyCameraPawn->Back();}}
}

6.需要在ProjectSetting里面,设置使用的按键。

三.可能需要注意的

1.Pawn这里,需要Poccess。不然会控制不到。

2.SpringArm设置视角的位置。Camera最好都是相对位置为0,这样视角返回默认值可以用。

MyCamera->SetRelativeLocation(FVector(0,0,0));

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

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

相关文章

《大语言模型》赵鑫

前言 大模型技术的发展阶段&#xff1a;统计语言模型&#xff0c;神经网络语言模型&#xff0c;预训练语言模型等 谷歌2017 年推出基于注意力机制的Transformer 模型。 OpenAI基于此&#xff0c;开始构建GPT系列模型&#xff0c; GPT-1能够通过“通用文本训练-特定任务微调”的…

Solidity: 引用类型, array, struct

数组 array​ 数组&#xff08;Array&#xff09;是Solidity常用的一种变量类型&#xff0c;用来存储一组数据&#xff08;整数&#xff0c;字节&#xff0c;地址等等&#xff09;。数组分为固定长度数组和可变长度数组两种&#xff1a; 固定长度数组&#xff1a;在声明时指定…

MySQL的慢sql

什么是慢sql 每执行一次sql&#xff0c;数据库除了会返回执行结果以外&#xff0c;还会返回sql执行耗时&#xff0c;以mysql数据库为例&#xff0c;当我们开启了慢sql监控开关后&#xff0c;默认配置下&#xff0c;当sql的执行时间大于10s&#xff0c;会被记录到慢sql的日志文件…

集中管理和分析日志:使用 ELK 套件构建强大的日志管理平台

集中管理和分析日志&#xff1a;使用 ELK 套件构建强大的日志管理平台 日志是监控和调试应用程序和系统的重要工具。集中管理和分析日志可以帮助你快速定位问题、了解系统运行状况和性能&#xff0c;并提高你的日志管理效率。ELK 是一个流行的日志管理解决方案&#xff0c;由 …

优选算法之技巧(一):双指针一:移位0与复写0

引用&#xff1a;我们之前学过快排&#xff0c;首先用三元取中&#xff0c;找(key)&#xff0c;然后就用到了双指针的方法来进行交换排序&#xff0c;那我们今天要讲的双指针其实大同小异&#xff0c;无非在数组中就变成了下标。 题一&#xff1a; 给定一个数组 nums&#xf…

LDR6020-VR串流线:开启虚拟现实新纪元的钥匙

随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经从科幻概念逐渐走进我们的生活&#xff0c;成为娱乐、教育、医疗等多个领域的热门话题。而VR串流线&#xff0c;作为这一技术的重要组成部分&#xff0c;正逐步成为连接用户与高质量VR体验的关键桥梁…

pip的常用命令和常见问题的解决

常用命令 安装包&#xff1a;pip install package_name 例子&#xff1a;pip install requests 指定版本安装包&#xff1a;pip install package_nameversion_number 例子&#xff1a;pip install numpy1.19.4 升级包&#xff1a;pip install --upgrade package_name 例子&am…

移动硬盘坏道深度解析与应对全攻略

一、现象解读&#xff1a;移动硬盘坏道的直观展示 在数字化信息爆炸的今天&#xff0c;移动硬盘作为便捷的数据存储与传输工具&#xff0c;其重要性不言而喻。然而&#xff0c;随着使用时间的推移&#xff0c;不少用户遭遇了移动硬盘出现“坏道”的困扰。坏道&#xff0c;作为…

Python中如何使用列表或其他数据结构实现栈和队列

在Python中&#xff0c;可以使用列表&#xff08;List&#xff09;数据结构来方便地实现栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;这两种重要的数据结构。栈和队列都是基于先进后出&#xff08;FILO, First In Last Out&#xff09;和先进先出&…

Spring与Quartz整合

Quartz框架是一个轻量级的任务调度框架&#xff0c;它提供了许多内置的功能&#xff0c;包括&#xff1a;支持作业的调度、集群调度、持久化、任务持久化、任务依赖、优先级、并发控制、失败重试等。同时也支持自定义作业类型和触发器类型。与Spring整合步骤如下&#xff1a; …

SQL跨数据库服务器查询和跨表批量插入的操作

MSSQL实现跨服务器查询数据库 EXEC sp_addlinkedserver server192.168.1.10, --链接服务器别名 srvproduct, providerSQLOLEDB, datasrc192.168.1.10 --要访问的的数据库所在的服务器的ip GO EXEC sp_addlinkedsrvlogin 192.168.1.10, --链接服务器别名…

scp命令快速上手用法

作用 scp命令可以实现linux和linux&#xff0c;linux和windows之间文件互传 操作 实验准备 windows系统 ip&#xff1a;192.168.172.1 linux系统A ip&#xff1a;192.168.172.181 linux系统B ip&#xff1a;192.168.172.181 实验1&#xff1a;linux系统A推送文件到linxu…

elasticsearch用curl查询

curl:-X :指定http的请求方式&#xff0c;有HEAD、GET、POST、PUT、DELETE-d :指定要传输的数据-H :指定http的请求头信息 curl -XPUT http://ip:port/索引名?pretty-- 创建索引 curl -XGET http://ip:port/_cat/indices?v --查看当前es的所有索引信息 curl -XGET http://ip:…

基于springboot+vue+uniapp的贵工程寝室快修小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

哈喽GPT-4o,程序员如何通过GPT-4o提高工作效率

目录 一、编写代码Prompt&#xff1a;请用Java语言编写一个二分查找的样例 二、修正代码错误、代码优化Prompt&#xff1a;我们上传一张华为OD算法题的题目描述&#xff0c;再给它我的Java解题代码&#xff0c;问问它有什么问题&#xff1f; 三、解读代码功能、代码翻译Prompt&…

在Windows环境下安装Python 3.11的步骤

在Windows环境下安装Python 3.11的步骤相对直接。下面是详细的安装教程&#xff1a; 第一步&#xff1a;下载Python 3.11安装程序 访问Python官方网站的下载页面&#xff1a;https://www.python.org/downloads/在页面中找到适用于Windows的Python 3.11版本&#xff0c;点击下…

Java中的匿名类

匿名类简介 匿名类&#xff08;Anonymous Classes&#xff09;是在 Java 中定义的一种没有名字的内部类。它们通常用来简化代码编写&#xff0c;尤其是在需要创建简短的类实现接口或继承类的场景中。匿名类可以在方法、构造方法、字段初始化时使用。 匿名类的特性 没有类名&a…

【面试题】MySQL(第一篇)

1. MySQL是什么&#xff1f; MySQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它使用结构化查询语言&#xff08;SQL&#xff09;进行数据管理。MySQL具有高性能、可靠性、可扩展性和兼容性等特点&#xff0c;广泛应用于Web应用开发中。 2. …

数据分析入门指南Excel篇:各类Excel函数概览与详解(二)

在当今数字化时代&#xff0c;数据已成为推动业务决策和创新的关键因素。而表格结构数据&#xff0c;作为最常见的数据存储形式之一&#xff0c;广泛应用于财务、物流、电商等多个领域。本文将基于提供的材料文本&#xff0c;深入探讨表格数据的处理与分析&#xff0c;特别是通…

华为 eNSP 路由器 实现双wan出口 访问外网nat 策略路由配置

1 实验拓扑 2 路由器配置 #R1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysn [Huawei]sysname R1 [R1]int GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 255.255.255.0 [R1-GigabitEthernet0/0/0]qu [R1…