Player-Controlled Cameras

学会使用玩家输入同时操控摄像机和Pawn。

创建相机

创建一个 SpringArmComponent,并在末端绑定一个 CameraComponent。弹簧臂是一种绑定摄像机(或其它 组件 )的简单方式,能让摄像机跟随拍摄对象时平稳自然。

    UPROPERTY(EditAnywhere)class USpringArmComponent* SpringArmComp;UPROPERTY(EditAnywhere)class UCameraComponent* CameraComp;UPROPERTY(EditAnywhere)UStaticMeshComponent* StaticMeshComp;
#include "GameFramework/SpringArmComponent.h"
#include "Camera/Component.h"
//创建组件
RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootSceneComponent"));
StaticMeshComp = CreateDefaultSubobject <UStaticMeshComponent>(TEXT("StaticMeshComponent"));
SpringArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArmComponent"));
CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComponent"));//绑定组件
StaticMeshComp->SetupAttachment(RootComponent);
SpringArmComp->SetupAttachment(StaticMeshComp);
CameraComp->SetupAttachment(SpringArmComp,USpringArmComponent::SocketName);//为SpringArm类的变量赋值。
SpringArmComp->SetRelativeLocationAndRotation(FVector(0.0f, 0.0f, 50.0f), FRotator(-60.0f, 0.0f, 0.0f));
SpringArmComp->TargetArmLength = 400.f;
SpringArmComp->bEnableCameraLag = true;
SpringArmComp->CameraLagSpeed = 3.0f;

配置输入及处理输入

创建函数来跟踪输入。

//输入变量
FVector2D MovementInput;
FVector2D CameraInput;
float ZoomFactor;
bool bZoomingIn;// 输入函数
void MoveForward(float AxisValue);
void MoveRight(float AxisValue);
void PitchCamera(float AxisValue);
void YawCamera(float AxisValue);
void ZoomIn();
void ZoomOut();
// 输入函数
void APawnWithCamera::MoveForward(float AxisValue)
{MovementInput.X = FMath::Clamp<float>(AxisValue, -1.0f, 1.0f);
}void APawnWithCamera::MoveRight(float AxisValue)
{MovementInput.Y = FMath::Clamp<float>(AxisValue, -1.0f, 1.0f);
}void APawnWithCamera::PitchCamera(float AxisValue)
{CameraInput.Y = AxisValue;
}void APawnWithCamera::YawCamera(float AxisValue)
{CameraInput.X = AxisValue;
}void APawnWithCamera::ZoomIn()
{bZoomingIn = true;
}void APawnWithCamera::ZoomOut()
{bZoomingIn = false;
}

把Pawn的输入事件和函数相绑定。

// 绑定"ZoomIn"的事件
InputComponent->BindAction("ZoomIn", IE_Pressed, this, &APawnWithCamera::ZoomIn);
InputComponent->BindAction("ZoomIn", IE_Released, this, &APawnWithCamera::ZoomOut);//为四条轴绑定事件(每帧调用)
InputComponent->BindAxis("MoveForward", this, &APawnWithCamera::MoveForward);
InputComponent->BindAxis("MoveRight", this, &APawnWithCamera::MoveRight);
InputComponent->BindAxis("CameraPitch", this, &APawnWithCamera::PitchCamera);
InputComponent->BindAxis("CameraYaw", this, &APawnWithCamera::YawCamera);

使用 Tick 函数中的这些值来每帧更新 Pawn 和 Camera。

void APawnWithCamera::Tick(float DeltaTime)
{Super::Tick(DeltaTime);//如果按下了放大按钮则放大,否则就缩小{if (bZoomingIn){ZoomFactor += DeltaTime / 0.5f;         //Zoom in over half a second}else{ZoomFactor -= DeltaTime / 0.25f;        //Zoom out over a quarter of a second}ZoomFactor = FMath::Clamp<float>(ZoomFactor, 0.0f, 1.0f);//根据ZoomFactor来设置摄像机的视场和弹簧臂的长度CameraComp->FieldOfView = FMath::Lerp<float>(90.0f, 60.0f, ZoomFactor);SpringArmComp->TargetArmLength = FMath::Lerp<float>(400.0f, 300.0f, ZoomFactor);}//旋转Actor的偏转角度,这样摄像机也能旋转,因为摄像机与Actor相互绑定{FRotator NewRotation = GetActorRotation();NewRotation.Yaw += CameraInput.X;SetActorRotation(NewRotation);}// 旋转摄像机的俯仰角度,但要对其进行限制,这样我们就能始终俯视Actor{FRotator NewRotation = SpringArmComp->GetComponentRotation();NewRotation.Pitch = FMath::Clamp(NewRotation.Pitch + CameraInput.Y, -80.0f, -15.0f);SpringArmComp->SetWorldRotation(NewRotation);}// 基于"MoveX"和 "MoveY"坐标轴来处理移动{if (!MovementInput.IsZero()){// 把移动轴的输入数值放大100倍MovementInput = MovementInput.GetSafeNormal() * 100.0f;FVector NewLocation = GetActorLocation();NewLocation += GetActorForwardVector() * MovementInput.X * DeltaTime;NewLocation += GetActorRightVector() * MovementInput.Y * DeltaTime;SetActorLocation(NewLocation);}}
}

Result

Reference

  1. PlayerCamera - https://docs.unrealengine.com/4.26/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/CPPTutorials/PlayerCamera/
  2. 项目源码: https://codechina.csdn.net/mrbaolong/how-to_-player-camera.git

Player-Controlled Cameras相关推荐

  1. Unity3D自定义资源配置文件

    http://blog.csdn.net/candycat1992/article/details/52181814 写在前面 我竟然最近两天才知道Unity中ScriptableObject的存在- ...

  2. 游戏人工智能——聚集与避障

    实验二:聚集与避障 一.实验目的 掌握游戏中聚集与避障的人工智能算法,理解宽视野和有限视野的区别 二.实验仪器 Microsoft Visual Studio2019 三.实验原理及过程 //描述聚集 ...

  3. 中英对照的网络游戏术语

    中英对照的网络游戏术语 AC – Armor Class,盔甲等级.级别 Account – 账号,与密码Password相对 Add – 一只玩家加入到组队中,如果请求别人组队,可说Add me p ...

  4. 网络游戏专业术语中英文对照版

    中英对照的网络游戏术语 AC – Armor Class,盔甲等级.级别 Account – 账号,与密码Password相对 Add – 一只玩家加入到组队中,如果请求别人组队,可说Add me p ...

  5. dot全称_求魔兽世界中的缩写全称

    展开全部 AC - Armor Class,盔甲级别或防御. AH----拍卖场 Add - 一只额外的怪物加入到现有的战斗中. AOE - Area Effect Damage,区域作用魔法.指的是 ...

  6. mug网络用语_游戏术语

    游戏分类名称: ACT 动作过关类 ARPG 动作角色扮演类 AVG 冒险类 ETC 其它类 FTG 格斗类 FREE 完全反射视点类 MUG 音乐类 PUZ 方块类 RAC 赛车类 RPG 角色扮演 ...

  7. how do java play sql_讲解:Invadem、Java、Java、game mechanicsSQL|Processing

    讲解:Invadem.Java.Java.game mechanicsSQL|ProcessingAssignment 2You are working for a company called Pi ...

  8. Deep Reinforcement Learning: Pong from Pixels翻译和简单理解

    原文链接: http://karpathy.github.io/2016/05/31/rl/ 文章目录 原文链接: 前言 Policy-Gradient结构流程图 Deep Reinforcement ...

  9. libgdx教程_使用libgdx进行Android游戏开发–一天中的原型,第1a部分

    libgdx教程 在本文中,我将绕开游戏引擎和组件的构建模块,并演示如何使用libgdx库快速制作游戏原型. 您将学到什么: 创建一个非常简单的2D Shooter Platformer游戏. 完整的 ...

  10. libgdx开发指南_使用libgdx进行Android游戏开发–一天中的原型,第1a部分

    libgdx开发指南 在本文中,我将绕开游戏引擎和组件的构建模块,并演示如何使用libgdx库快速制作游戏原型. 您将学到什么: 创建一个非常简单的2D Shooter Platformer游戏. 完 ...

最新文章

  1. mysql 天数减1_mysql 日期操作 增减天数、时间转换、时间戳
  2. java调用打印机打印需要进行什么操作_Java调用打印机程序有什么特点?
  3. C++新特性探究(九):functor仿函数
  4. sql 整改措施 注入_防止SQL注入的五种方法
  5. 【SICP练习】151 练习4.7
  6. atitit.查看预编译sql问号 本质and原理and查看原生sql语句
  7. 两块stm32仿真protues串口通信程序
  8. 产品管理:新产品开发流程「权威指南」
  9. P1251 餐巾计划问题 解题报告
  10. python networkx 导入CSV文件画关系网络图
  11. 绘画教程:男生和女生的脖子怎么画?如何画喉结?
  12. 【java】java技术要学习的内容
  13. 2019届校招实习生惨痛经历
  14. deepin添加启动图标(快捷方式)
  15. Excel 数值转换为人民币大写金额字符串
  16. Ext.net Grid拖动行排序,【最上】【最下】【上移】【下移】按钮排序
  17. React 之导入 Excel
  18. 三丰三坐标编程基本步骤_零基础学习工业机器人PLC编程的基本步骤
  19. OSChina 周六乱弹 ——单身程序员怎么回复漂亮妹子的悲伤心情
  20. 如何判断点是否在凸多边形内部(用于碰撞检测)

热门文章

  1. 发动机关键零部件3D视觉引导自动上料和装配系统
  2. matlab版本下载地址
  3. 工地人员定位管理系统,如何有效做到安全生产双预防?
  4. 遗传算法解决车辆调度问题
  5. 让对应背景随着轮播的图片变化而改变
  6. 解决ppt复制到Word的图片导出PDF后出现黑线问题,word转PDF图片不清晰的问题,ppt转矢量图问题
  7. mybatisplus自动生成id_【mybatis-plus】主键id生成、字段自动填充
  8. 复旦大学2018--2019学年第二学期(18级)高等代数II期末考试第八大题解答
  9. A-GPS学习笔记(二) 之SUPL
  10. matlab 取符号函数,Matlab 符号表达式和符号函数的操作