【UE4】两个摄像头之间切换

2023-11-14

一、效果展示

请添加图片描述

二、操作步骤

  • 创建两个摄像机,一个放在场景中,另一个放在Cube上

  • 摄像机的细节面板中约束宽高比(Constrain Aspect Ratio)属性勾选后可以让两个摄像头之间的切换更流畅,但这不是必须的

  • 会用到#include "Kismet/GameplayStatics.h"头文件,获取玩家控制器的方法在这个类中

三、已知摄像机数量写法

h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CameraDirector.generated.h"

UCLASS()
class QUICKSTART_API ACameraDirector : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	ACameraDirector();
	//在编辑器中可以编辑
	UPROPERTY(EditAnywhere)
		AActor* CameraOne;

	UPROPERTY(EditAnywhere)
		AActor* CameraTwo;

	float TimeToNextCameraChange;
protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

};

cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "CameraDirector.h"
#include "Kismet/GameplayStatics.h"

// Sets default values
ACameraDirector::ACameraDirector()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

// Called when the game starts or when spawned
void ACameraDirector::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void ACameraDirector::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	//摄像机切换间隔时间/摄像机停留时间
	const float TimeBetweenCameraChanges = 2.0f;
	//光滑的混合时间
	const float SmoothBlendTime = 0.75f;

	TimeToNextCameraChange -= DeltaTime;
	if (TimeToNextCameraChange <= 0.0f)
	{
		//重置
		TimeToNextCameraChange += TimeBetweenCameraChanges;
		//查找本地玩家控制的actor 
		APlayerController* OurPlayerController = UGameplayStatics::GetPlayerController(this, 0);
		if (OurPlayerController)
		{
			if (OurPlayerController->GetViewTarget() != CameraOne && CameraOne != nullptr)
			{
				//立刻切换到摄像机1
				OurPlayerController->SetViewTarget(CameraOne);
			}
			else if (OurPlayerController->GetViewTarget() != CameraTwo && CameraTwo != nullptr)
			{
				//平滑的切换到摄像机2
				OurPlayerController->SetViewTargetWithBlend(CameraTwo,SmoothBlendTime);
			}
		}

	}
}


四、动态增加摄像机数量

使用数组TArray
h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CameraDirector.generated.h"

UCLASS()
class QUICKSTART_API ACameraDirector : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	ACameraDirector();

	UPROPERTY(EditAnywhere)
		TArray<AActor*> CameraArr;

	float TimeToNextCameraChange;
private:
protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

};

cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "CameraDirector.h"
#include "Kismet/GameplayStatics.h"

static int iCurrentNum = 0;
// Sets default values
ACameraDirector::ACameraDirector()
{
	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

// Called when the game starts or when spawned
void ACameraDirector::BeginPlay()
{
	Super::BeginPlay();

}

// Called every frame
void ACameraDirector::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	//摄像机切换间隔时间/摄像机停留时间
	const float TimeBetweenCameraChanges = 2.0f;
	//光滑的混合时间
	const float SmoothBlendTime = 0.75f;

	TimeToNextCameraChange -= DeltaTime;
	if (TimeToNextCameraChange <= 0.0f)
	{
		//重置
		TimeToNextCameraChange += TimeBetweenCameraChanges;
		//查找本地玩家控制的actor 
		APlayerController* OurPlayerController = UGameplayStatics::GetPlayerController(this, 0);
		if (OurPlayerController)
		{
			int32 iCameraCount = CameraArr.Num();
			if (iCurrentCameraNum < iCameraCount)
			{
				if (CameraArr[iCurrentCameraNum] != nullptr)
				{
					//平滑地混合到摄像机
					OurPlayerController->SetViewTargetWithBlend(CameraArr[iCurrentCameraNum], SmoothBlendTime);
				}
				iCurrentCameraNum++;
			}
			else
			{
				iCurrentCameraNum = 0;
				//立即切换到摄像机1
				OurPlayerController->SetViewTarget(CameraArr[iCurrentCameraNum]);
			}
		}
	}
}


再回到细节面板就可以发现多了个小加号,点击加号可以自由增加数组的大小
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【UE4】两个摄像头之间切换 的相关文章

随机推荐

  • IPsec over GRE 和GRE over IPsec比较和区别与配置

    GRE over IPsec IPsec over GRE I PSec Over GRE是先ipsec后gre 这种我没用过 GRE Over IPSec 是先gre后ipsec 也就是说ipsec是最后的承载方式 一般常用的就是这种 解
  • webpack4+动态导入(按需加载方式)

    此文为复习或升级webpack过程中的总结 webpack版本为4 29 5 webpack4 动态导入 目的 减少包体积 按需加载 常见使用情况有以下3中 1 使用import 的情况 output filename bundle js
  • $‘\r‘: 未找到命令的解决办法

    前言 有时我们在执行shell脚本的时候 会出现 r 未找到命令 错误 绝大多数情况下是因为在window系统中写的shell脚本 然后上传到服务器执行造成的 解决办法如下 1 安装dos2unix yum install dos2unix
  • 用汇编语言实现从键盘输入一个字符,在下一行上以十六进制形式输出它的ASCII码。

    在我之前的一篇博客里已经写过如何输出一个字符的ASCII码的十进制形式 以十六进制形式输出的方法与其相差不多 详情可查看我的专栏 汇编语言 里的第一篇博客 要求如下 代码如下 data segment string1 db 5 dup st
  • SpringBoot中的bean注入方式和原理介绍

    Spring Boot是一个非常流行的Java框架 它可以帮助开发者快速地构建高效 健壮的应用程序 其中一个重要的功能就是依赖注入 也就是将一个对象注入到另一个对象中 以便它们可以相互协作 在Spring Boot中 依赖注入是通过bean
  • 事务的相关内容

    主要用于处理操作量大 复杂度高的数据 将一组SQL放在一个批次中去执行 事务原则 ACID原则 原子性 一致性 隔离性 持久性 脏读 幻读 原子性 要么都成功 要么都失败 一致性 事务前后的数据完整性要保证一致 持久性 事务一旦提交则不可逆
  • DevExpress ASP.NET Wizard使用

    1 新建项目 2 选择主题后按 Run Wizard 3 选择布局custom 按 4 选择主题 按 5 设置网站设置 6 设置组件设置 设置本地化 修改标题 修改左侧树
  • 带头双向循环链表基础知识归纳

    本节博主将归纳带头双向循环链表的初始化 头尾插和头尾删 首先让我们一起瞅瞅这链表长啥样 图像来源 图解几种常见的线性表 命中水 cxiansheng cn 在这张图中我们能够得出一个双向循环链表所需要的结构体基本框架 struct node
  • 将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;

    将输入的字符串 字符串仅包含小写字母 a 到 z 按照如下规则 循环转换后输出 a gt b b gt c y gt z z gt a 若输入的字符串连续出现两个字母相同时 后一个字母需要连续转换2次 例如 aa 转换为 bc zz 转换为
  • 解决maven出现“连接到http://repo.maven.apache.org被拒绝”的问题

    1 原因 这个问题的原因就是无法连接到http repo maven apache org maven2镜像 2 解决办法 修改maven默认镜像仓库地址为国内可用的镜像地址 比如这里推荐阿里的镜像仓库地址 http maven aliyu
  • Android 权限大全

    Key android permission ACCESS CHECKIN PROPERTIES Title 访问检入属性 Memo 允许对检入服务上传的属性进行读 写访问 普通应用程序不能使用此权限 Level 0 Key android
  • QNX下获取系统信息的方法(cpu,内存,进程等等)

    有不少朋友问在qnx下如何获取内存及cpu占有率等等 想到两年前自己做过一个类似windows里的任务管理器的东东 里面有一部分就是获取内存 cpu 磁盘及进程信息的GUI程序 记得也美其名曰xxxTaskMan 把里面的关键代码写下来供兄
  • 关于C++的精度输出的解释。cout.precision()

    关于C 的精度输出的解释 cout precision 网上解释cout precision 是控制浮点数的输出精度的 这句话是没有错误的 但是程序又提示cout precision 是控制输出结果的小数点位数的 这句话是不对的 我们可以做
  • 腾讯云S5服务器2核2G、2核4G和4核8G五年租用时长

    腾讯云五年服务器来了 标准型S5云服务器 可选2核2G 2核4G和4核8G配置 一次性购买五年低至2折 免去xufei烦恼 腾讯云百科分享腾讯云5年服务器限制条件 云服务器配置 目录 腾讯云S5服务器CPU 五年机服务器配置 腾讯云标准型S
  • 转:win7系统下安装SQL Server 2005图文教程

    转载链接 https www cnblogs com icewee articles 2019783 html 转载内容如下 操作系统 Microsoft Windows 7 旗舰版 32位 数据库版本 SQL Server 2005 简体
  • TCP/IP五层模型——应用层(HTTP协议、简单的HTTP服务器)

    关于TCP IP模型的简单介绍 在TCP IP五层模型一文中有简单介绍 本文主要详细介绍其中的应用层相关内容 首先介绍一个定义 应用层协议 在网络版加法计算器一文中 我们介绍的实现网络版本的加法计算器有两种方法 其实无论是哪种方法 只要能够
  • python计算身体质量指数_如何用Python计算身体质量指数BMI,并给出胖瘦程度评价?...

    问 身体质量指数 Body Mass Index 简称 BMI 是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准 BMI 值超标 意味着你必须减肥了 BMI 的计算公式是 BMI 体重 千克 身高的平方 米 按照中国人的体质特征 B
  • PPT 各行各业素材 10000套 讲解

    10000套各行各业PPT模板 提供下载 请扫二维码 PPT模板动态工作教育毕业答辩总结教师商务中国风清新简约素材 PPT模板简约风格中国动态模板静态模板唯美清新扁平论文答辩教育 PPT模板工作总结党政机关节日庆典儿童卡通教学课件岗位竞聘
  • 非参数统计吴喜之_看过许多统计教程,这篇是我最推荐的

    01 两组间比较 对于数值变量 首先进行正态性检验 如果各组均满足正态性且两组间方差相等 采用均数 标准差进行统计描述 采用t检验进行组间比较 否则采用中位数 四分位数间距 进行统计描述 采用非参数检验 Mann whitney检验 进行组
  • 【UE4】两个摄像头之间切换

    一 效果展示 二 操作步骤 创建两个摄像机 一个放在场景中 另一个放在Cube上 摄像机的细节面板中约束宽高比 Constrain Aspect Ratio 属性勾选后可以让两个摄像头之间的切换更流畅 但这不是必须的 会用到 include