当前位置: 首页 > news >正文

Unreal Engine08:Pawn的实现

写在前面

Pawn继承于Actor,增加了一些用于控制和提供玩家视角的功能,这里主要是介绍一下Pawn类的实现。

一、创建一个Pawn的C++类

  • 创建的C++类也是放在Source文件夹中的Public和Private文件夹中;
  • 选择Pawn作为继承的父类;
  • 头文件中除了Actor的函数外,仅额外增加了一个负责设置玩家输入组件的函数SetupPlayerInputComponent(),如下:

头文件

  • .cpp文件中也默认实现了SetupPlayerInputComponent()函数,如下:

cpp文件

二、增加摄像机组件

  • 摄像机相当于是提供了一个玩家视角
  • 它绑定在Pawn上之后,玩家视角就能随着Pawn移动而移动;
  • 头文件实现如下:

增加一个摄像机组件

  • 并在.cpp文件中把摄像机组件挂载到根组件上,实现如下:

cpp实现

  • 一些补充如下:

1. StaticMesh的网格体形状可以预先设置

  • 代码实现如下:

预先设置网格体形状

  • 一些注意的点如下:
    • 首先要用MeshComponentAsset变量尝试加载资源;
    • 如果能加载,则将资源赋予网格体;
    • 资源的路径可以通过右键资源->复制引用获得,如下:

找资源所在路径

2. 摄像机组件可以和弹簧臂组件组合使用

  • 当然直接将摄像机固定在Pawn的某个位置也是可以的,但这样视角移动就会很生硬,在启动和停止时没有过渡动画的效果,实现就是上面那样;
  • 但如果使用弹簧臂连接摄像机和Pawn,则视角移动更为自然,这也是常用的做法;
  • 首先在头文件中增加弹簧臂组件,如下:

弹簧臂组件

  • 然后在构造函数中设置弹簧臂,并将摄像机挂载到弹簧臂上,如下:

使用弹簧臂

  • 一些注意的点如下:
    • 弹簧臂是挂载在根组件上;
    • 摄像机是挂载在弹簧臂的预设插槽(Socket)上;
    • 弹簧臂的倾斜角度和长度取决于摄像机想要放置的位置;

3. 可以用某个组件代替默认的根组件

  • 默认的根组件只是用于占位,本身并没有作用,因此可以用别的有实际作用的组件替换掉;
  • 这里用一个隐藏的更大的球形组件(注意不是球型静态网格组件)替换根组件,并设置为不可见;
  • 头文件实现如下:

头文件

  • 构造函数中实现如下:

设置根组件

三、创建一个Pawn的蓝图类

  • Pawn类和Actor类不同,它的很多功能需要用蓝图类辅助实现(当然完全用C++也可以,但会很麻烦,而且不直观,相当于是用文字描述图片了),所以一般是要新建一个和Pawn类对应的蓝图类作进一步开发;
  • 由C++创建的蓝图类相当于是继承了C++类;

1. 由C++类创建蓝图类的方法

  • (1) 右键C++类,选择创建基于xxx的蓝图类

创建蓝图类

  • (2) 在内容文件夹下放置蓝图类的路径下,右键->创建基础资源->选择蓝图类,然后在所有类中搜索对应的C++类创建即可;

创建蓝图类

2. 挂载组件的对应关系

  • 在C++类的构造函数中,RootComponent下挂载了两个组件,一个静态网格组件,一个是摄像机组件,而且这两个组件处于同一层;
  • 在蓝图类中的组件面板可以清楚的看到它们之间的挂载结构;
  • 按照刚刚的设置,如果不使用弹簧臂,则如下:

组件挂载结构

  • 如果使用弹簧臂,则结构如下:

组件挂载结构

  • 当然,组件也可以在蓝图中继续挂载或者修改;

3. 摄像机组件和Pawn之间的关系

  • 摄像机组件实际上是Pawn的一部分;
  • 但是它从位置上来说应该有两种情况:
    • 第一人称游戏:摄像机组件的位置在Pawn的眼睛位置;
    • 第三人称游戏:摄像机组件的位置在Pawn的后上方位置;
  • 通常会用另外一个网格组件(这里暂时是用StaticMeshComponent)作为Pawn的本体,也就是充当Pawn生物的外形;
  • 按照刚刚在C++类构造函数中的设置,如果不使用弹簧臂组件,则摄像机和静态网格组件之间的位置关系如下图:

位置关系

  • 如果使用弹簧臂组件,则摄像机和静态网格组件之间的位置关系如下图:

位置关系

四、在地图上以Pawn开始游戏

  • Pawn因为可以作为玩家的控制的视角,所以我们需要在开始游戏之后获得某个Pawn的视角,并且能够控制Pawn的运动

1. 获得Pawn视角

  • 如果什么都不设置,默认开始游戏是将视角放到PlayerStart上的,并对准前向(红色箭头),如下:

PlayStart视角

1.1 在PlayerStart处生成一个Pawn

  • 通过设置游戏模式(GameMode),可以在PlayerStart处生成一个Pawn,这样就可以顺理成章地获得它的视角了;
  • 通过默认生成的游戏模式C++类(这个是创建C++项目的时候就自动创建了的,里面没有内容,仅继承了AGameModeBase类)派生一个游戏模式蓝图类BP_CreatureGameMode,如下:

新建游戏模式蓝图类

  • 打开BP_CreatureGameMode,修改默认Pawn类BP_CreaturePawn,就可以修改开始游戏时在PlayerStart处生成的Pawn;

修改默认Pawn类

  • 之后,还需要在世界中应用新的游戏模式
  • 在主面板上打开世界场景设置面板,修改其中的游戏模式覆盖为刚刚创建的游戏模式蓝图类即可;
  • 此时用选中的视口播放游戏,就可以在PlayerStart处生成我们选定的Pawn,而且视角是在Pawn绑定的摄像机组件上;

设置新的游戏模式

1.2 将某个Pawn赋予玩家视角

  • 如果是在PlayerStart处生成一个Pawn,是有一些不足的:
    • 没有办法赋予它一些预设的实例参数,因为它是一个新生成的实例,完全依赖于C++类或者蓝图类中的默认设置;
    • 也没有办法在不同的Pawn之间切换视角,只能一直在PlayerStart视角;
  • 这里介绍如何为某个Pawn赋予玩家视角;
  • C++实现
    • 只需要在构造函数中设置AutoProssessPlayer变量即可:

为Pawn赋予玩家视角

  • Editor实现
    • 在细节面板中选中Pawn->自动控制玩家,修改值为玩家0即可:

为Pawn赋予玩家视角

2. 绑定玩家输入控制

2.1 创建轴映射

  • 在Editor中点击编辑->项目设置

项目设置

  • 引擎->输入->Bindings里面新增轴映射,如下:

和键盘输入绑定

  • 输入的映射方式主要有两种:
    • 轴映射:输入的设备可提供输入程度的变化范围,输入的是一个连续值,该值会乘以设定的缩放值,然后传给后续响应事件函数中的float类型参数Value
    • 操作映射:输入的设备仅提供是否输入的信号,即离散0/1,后续有两个响应事件函数,一个响应按下按钮事件,一个响应释放按钮事件;
    • 可以参考博文:UE4中轴映射;

2.2 绑定到响应事件函数

  • 在Pawn默认构建的SetupPlayerInputComponent()函数中可以绑定映射对应的响应事件函数,实现如下:

绑定响应事件函数

  • 注意BindAxis()函数中的字符串参数就是刚刚在项目设置中创建的轴映射事件名称,必须要相互对应;

3. 实现玩家控制的影响

  • 前面只是将玩家输入绑定到Pawn某个成员变量上,并没有对Pawn产生实际的影响;
  • 这里将实现对Pawn的影响,也就是令Pawn产生位移,实现如下:

产生位移

  • 上面的代码里面有两种实现,推荐是用第二种类型的;

五、Pawn的视角控制

  • 视角控制实际上就是实现Pawn的转身和俯仰视;
  • 首先是创建对应的轴映射:

创建轴映射

相关文章:

Unreal Engine08:Pawn的实现

写在前面 Pawn继承于Actor,增加了一些用于控制和提供玩家视角的功能,这里主要是介绍一下Pawn类的实现。 一、创建一个Pawn的C类 创建的C类也是放在Source文件夹中的Public和Private文件夹中;选择Pawn作为继承的父类;头文件中除…...

408强化(二)线性表纯享版

目录 一、顺序表(数组)和链表总览 二、考情分析 2.1 从历年考情可以看出,如果一个方法出现了第2次,一般是以下情况: 2.2 没有考过的地方 三、 共同操作或考法 3.1 多指针后移 3.2 逆置 3.3 空间换时间的操作 3.…...

ubuntu下如何使用wireshark抓包,保姆级教程

Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是截取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。 一、安装wireshark 打开终端&…...

世界上最健康的程序员作息表!「值得一看」

昨晚看了一篇“传说中”的“世界上最健康的作息时间表”,开始纠结自己还要不要5点半起床。 都说程序员这一行,猝死概率极高,究其原因还是加班太狠、作息不规律、缺乏运动… 今天和大家分享一下这篇文章,还是非常值得参考的&#…...

Java中多继承的实现

1 问题Java是一种面向对象的只允许单继承的语言,那么怎样在Java中实现多继承呢?2 方法多层继承如果要直接继承类,子类是不可以直接多继承的,但是可以通过多层继承来实现多继承,但多层继承一般不建议超过三次。接口接口…...

蓝桥杯 stm32 USART 串口发送数据

文章代码使用 HAL 库。 文章目录 前言一、串口原理图二、CubeMX 创建工程。三、串口发送函数:四、串口助手 配置:五、详细代码:注意:连续发送数据六、printf 重定向问题代码示例:实验效果:总结前言 USART : ( Universal Synchronous/Asynchronous Receiver/Transmitter…...

Spring之AOP底层源码解析

Spring之AOP底层源码解析 1、动态代理 代理模式的解释:为其他对象提供一种代理以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。 举个例子 public class UserService {public void test() {System.out.println("test.…...

人脸识别——景联文科技提供3D头模数据采集业务!

“拿起手机刷脸解锁、上下班考勤、支付订单,刷脸已极大地便利了我们的生活。清华大学新闻学院教授沈阳表示,中国人平均每天要暴露在各种摄像头下超过500次。人脸识别已成了我们生活中重要的一部分。由于2D人脸识别容易受到姿态、表情、光照等因素影响&am…...

SpringBoot集成Flink-CDC 采集PostgreSQL变更数据发布到Kafka

最近做的一个项目,使用的是pg数据库,公司没有成熟的DCD组件,为了实现数据变更消息发布的功能,我使用SpringBoot集成Flink-CDC 采集PostgreSQL变更数据发布到Kafka。 一、业务价值 监听数据变化,进行异步通知&#xf…...

酷开系统壁纸模式,将氛围感死死拿捏!

古希腊哲学家柏拉图曾经说过:“美感是起于视觉、听觉产生的快感,以人的感官所能达到的范围为极限。”而电视则恰恰就是视觉听觉的完美融合体,当一台开启的电视可以给我们带来视听享受的时候,一台待机状态下的电视又如何取悦于我们…...

第0章 一些你可能正感到迷惑的问题

操作系统是什么 操作系统是控制管理计算机系统的硬软件,分配调度资源的系统软件。 由操作系统把资源获取到后台给用户进程,但为了保护计算机系统不被损坏,不允许用户进程直接访问硬件资源。 操作系统相当于是一个分配资源的机构,…...

MYSQL实战

SQL的处理 缓存解析查询优化(查询优化器) 重写查询;表的读取顺序;选择索引1.不要在索引上做任何操作 表达式函数 2.尽量全值匹配 联合索引中搜素条件后会根据最优条件排序进行查询,联合索引尽量都使用起来。搜索条…...

少儿户外拓展北斗定位解决方案

一、项目背景户外拓展训练是指通过专业的机构,对久居城市的人进行的一种野外生存训练。拓展训练通常利用崇山峻岭、翰海大川等自然环境,通过精心设计的活动达到“磨练意志、陶冶情操、完善人格、熔炼团队”的培训目的。针对户外拓展人员安全管理存在的实…...

更换ssl证书

更换ssl证书常用证书查看以及转换网址阿里云判断流量以及配置证书判断接入点阿里云控制台配置证书WAFAzure判断流量以及配置证书:判断接入点Azure配置证书CDNAPP GateWay常用证书查看以及转换网址 https://www.chinassl.net/ssltools/convert-ssl.htmlhttps://myss…...

线程池源码解析项目中如何配置线程池

目录 基础回顾 线程池执行任务流程 简单使用 构造函数 execute方法 execute中出现的ctl属性 execute中出现的addWorker方法 addWorker中出现的addWorkerFailed方法 addWorker中出现的Worker类 Worker类中run方法出现的runWorker方法 runWorker中出现的getTask runWo…...

Echarts 更改K线度颜色,解释K线图4个数字意义

第019个点击查看专栏目录本示例修改K线度的颜色,方法参考源代码。 这里面讲一下K线图的四个数字,如[20, 34, 10, 38], 第一位:20代表开盘价格, 第二位:34代表闭盘价格, 第三位:10代表最低价&…...

JavaScript和Java两种方法实现百度地图和高德、腾讯地图的相互转换

目录一、常见的经纬度标准二、百度地图和高德、腾讯地图经纬度的转换1、前端JavaScript转换2、后端Java实现转换一、常见的经纬度标准 高德、腾讯(使用GCJ02) GCJ-02坐标系,也称火星坐标系,由中国国家测绘局在02年发布&#xff0…...

Vue中常见的几种组件间通信方法

1.props&#xff08;父传子&#xff09; 父组件Parent.vue <template><child :msg"message"></child> </template>父组件通过:val"value"的形式定义要传给子组件的值value绑定到val上 子组件Child.vue export default {//写法一…...

Outcome VS. Output:研发效能提升中,谁会更胜一筹?

2007 年&#xff0c;网景通信公司&#xff08;Netscape&#xff09;的联合创始人 Marc Andreessen 在博客 The Pmarca Guide to Startups 中提出 「Product/Market Fit」 &#xff0c;他写道&#xff0c; 「这意味着在一个良好的市场中&#xff0c;拥有能够满足该市场的产品。」…...

ptp4l与phc2sys进行系统时钟同步

linuxptp用于时钟同步。安装采用apt install linuxptp主要包含2个程序&#xff0c;ptp4l 进行时钟同步&#xff0c;实时网卡时钟与远端的时钟同步&#xff0c;支持1588 和 802.1AS 两种协议phc2sys 将网卡上的时钟同步到操作系统&#xff0c;或者反之命令demo:某主机P通过eth2连…...

使用注解JSON序列化

JsonSerialize(using ToStringSerializer.class) 将返回数据转成String序列化 JsonFormat(pattern "yyyy-MM-dd hh:mm",timezone"GMT8") 将日期数据转换成特定格式 使用JsonSerialize自定义注解接口 定义接口 import java.lang.annotation.ElementTyp…...

kubernetes教程 --Pod生命周期

Pod生命周期 pod创建过程运行初始化容器&#xff08;init container&#xff09;过程运行主容器&#xff08;main container&#xff09;过程 容器启动后钩子&#xff08;post start&#xff09;、容器终止前钩子&#xff08;pre stop&#xff09;容器的存活性探测&#xff08;…...

高校房产管理系统用到了哪些技术?

数图互通高校房产管理系统是基于公司自主研发的FMCenterV5.0平通过在中国100多所高校的成功实施和迭代&#xff0c;形成了一套成熟、完善、全生命周期的房屋资源管理解决方案。台&#xff0c;是针对中国高校房产的管理特点和管理要求&#xff0c;研发的一套标准产品&#xff1b…...

【Python学习笔记】37.Python3 MySQL - mysql-connector 驱动(2)

前言 本章继续介绍MySQL - mysql-connector 驱动。 where 条件语句 如果我们要读取指定条件的数据&#xff0c;可以使用 where 语句&#xff1a; demo_mysql_test.py 读取 name 字段为 CSDN 的记录&#xff1a; import mysql.connectormydb mysql.connector.connect(host…...

【高级Java】高级Java实验

一、反射与动态代理1、&#xff08;4分&#xff09;请通过反射技术&#xff0c;为附件中的Person.class生成相应的.java代码&#xff0c;java代码中的方法的方法体为空&#xff0c;即方法内部代码不用生成。请注意生成的java代码的格式。2、&#xff08;3分&#xff09;请为第1…...

SYN480R 解码

目录1.空载情况下2.当有按键被按下3.数据帧分析4.同步码5.数据码6.对24位数据帧分析1.空载情况下 在空载情况下&#xff0c;syn480r 输出引脚&#xff0c;输出的是杂乱无序的波形 2.当有按键被按下 按下按键&#xff0c;会连续输出相同的脉冲波形&#xff0c;放大分析 3.数据…...

ASP .NET(基于.NET 6.0)源码解读

这几天一直在琢磨在我现有技术认知基础上&#xff0c;未来如何做技术提升。 日思夜想&#xff0c;我整理出了我自己的一套学习规划方案&#xff0c;并希望在实施过程中能够不断调整学习方案与方式&#xff0c;以接近自我提升的效率最大化。 从以下几个大的方面来得到提升&…...

阿里工作7年,一个30岁女软件测试工程师的心路历程

简单的先说一下&#xff0c;坐标杭州&#xff0c;14届本科毕业&#xff0c;算上年前在阿里巴巴的面试&#xff0c;一共有面试了有6家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09; 其中成功的有4家&am…...

学生党必备的 Keychron 无线机械键盘

学生党必备的 Keychron 无线机械键盘 由于专业需要&#xff0c;之间的键盘使用起来不太舒服&#xff0c;于是准备重新买一个适合工作学习的键盘&#xff0c;于是通过朋友介绍了解到了keychron k3pro,当时也看到网上一些资料说道这款键盘比较到位&#xff0c;今天就来带大家了解…...

FPGA MAX 10 10M50系列10M50DAF484C8G/10M50DAF484C7G/10M50DCF484C7G规格

介绍MAX 10器件是单芯片、非易失性低成本可编程逻辑器件(pld)&#xff0c;用于集成最优的系统组件集。MAX 10设备的亮点包括:内部存储双配置闪存用户闪存即时支持集成模数转换器(adc)支持Nios II单芯片软核处理器MAX 10设备是系统管理、I/O扩展、通信控制平面、工业、汽车和消费…...

公司画册设计网站/杭州百度快照优化公司

https://blog.csdn.net/electech6/article/details/53618965...

域名停靠app盘他射门下载/厦门seo百度快照优化

查看当前时区 ls -l /etc/localtime我目前这台服务器的时区时美国纽约时间 查看时区选择列表 tzselect执行tzselect后会出现上图的选择内容&#xff0c;我们输入5来选择亚洲时区&#xff0c;接着会有下图 然后接着输入9&#xff0c;表示选择中国 接着选择北京时间或者新疆…...

wordpress 更换模板/推广普通话奋进新征程手抄报

首先证明欧几里德算法(即最大公约数算法&#xff09; 设有a,b两个数; ak*br,ra%b; 假设d是a,b的一个公约数&#xff0c;a%d0&#xff0c;b%d0;ra-k*b,因此r%d0; 即所有a,b的公约数都是b,a%b的公约数&#xff0c;那么gcd(a,b)gcd(b,a%b)&#xff1b; 所以当a%b0时&#xff0c;即…...

百度不让访问危险网站怎么办/站长工具同大全站

https://blog.csdn.net/qq_16234613/article/details/79436941...

代码演示插件wordpress/清远市发布

most from reference命名规则 1.使用驼峰式命名规则&#xff0c;尽量避免在命名中使用下划线 2.类型以大写字母开头 3.方法和属性以小写字母开头 4.使用4个空格缩进 5.public的方法加上注释说明&#xff0c;以便他们能出现在Kotlin Doc中 冒号 分隔子类和父类的冒号前面应该加上…...

做网站 江门/网络seo优化公司

作者&#xff1a;Martin Heinz 翻译&#xff1a;EarlGrey 原文&#xff1a;https://martinheinz.dev/blog/1你估计已经看了不少关于 Python 技巧的文章&#xff0c;里面可能会提到变量拆包&#xff08;unpacking&#xff09;、局部函数等&#xff0c;但是 Python 还有很多不为人…...